WPBruiser {no- Captcha anti-Spam} - Version 2.0

Version Description

Fixed compatibility with the new version 3.x of MailChimp for WordPress plugin

Download this release

Release Info

Developer mihche
Plugin Icon 128x128 WPBruiser {no- Captcha anti-Spam}
Version 2.0
Comparing to
See all releases

Version 2.0

Files changed (307) hide show
  1. assets/admin/images/flags/ad.gif +0 -0
  2. assets/admin/images/flags/ae.gif +0 -0
  3. assets/admin/images/flags/af.gif +0 -0
  4. assets/admin/images/flags/ag.gif +0 -0
  5. assets/admin/images/flags/ai.gif +0 -0
  6. assets/admin/images/flags/al.gif +0 -0
  7. assets/admin/images/flags/am.gif +0 -0
  8. assets/admin/images/flags/an.gif +0 -0
  9. assets/admin/images/flags/ao.gif +0 -0
  10. assets/admin/images/flags/aq.gif +0 -0
  11. assets/admin/images/flags/ar.gif +0 -0
  12. assets/admin/images/flags/as.gif +0 -0
  13. assets/admin/images/flags/at.gif +0 -0
  14. assets/admin/images/flags/au.gif +0 -0
  15. assets/admin/images/flags/aw.gif +0 -0
  16. assets/admin/images/flags/ax.gif +0 -0
  17. assets/admin/images/flags/az.gif +0 -0
  18. assets/admin/images/flags/ba.gif +0 -0
  19. assets/admin/images/flags/bb.gif +0 -0
  20. assets/admin/images/flags/bd.gif +0 -0
  21. assets/admin/images/flags/be.gif +0 -0
  22. assets/admin/images/flags/bf.gif +0 -0
  23. assets/admin/images/flags/bg.gif +0 -0
  24. assets/admin/images/flags/bh.gif +0 -0
  25. assets/admin/images/flags/bi.gif +0 -0
  26. assets/admin/images/flags/bj.gif +0 -0
  27. assets/admin/images/flags/bl.gif +0 -0
  28. assets/admin/images/flags/bm.gif +0 -0
  29. assets/admin/images/flags/bn.gif +0 -0
  30. assets/admin/images/flags/bo.gif +0 -0
  31. assets/admin/images/flags/br.gif +0 -0
  32. assets/admin/images/flags/bs.gif +0 -0
  33. assets/admin/images/flags/bt.gif +0 -0
  34. assets/admin/images/flags/bv.gif +0 -0
  35. assets/admin/images/flags/bw.gif +0 -0
  36. assets/admin/images/flags/by.gif +0 -0
  37. assets/admin/images/flags/bz.gif +0 -0
  38. assets/admin/images/flags/ca.gif +0 -0
  39. assets/admin/images/flags/catalonia.gif +0 -0
  40. assets/admin/images/flags/cc.gif +0 -0
  41. assets/admin/images/flags/cd.gif +0 -0
  42. assets/admin/images/flags/cf.gif +0 -0
  43. assets/admin/images/flags/cg.gif +0 -0
  44. assets/admin/images/flags/ch.gif +0 -0
  45. assets/admin/images/flags/ci.gif +0 -0
  46. assets/admin/images/flags/ck.gif +0 -0
  47. assets/admin/images/flags/cl.gif +0 -0
  48. assets/admin/images/flags/cm.gif +0 -0
  49. assets/admin/images/flags/cn.gif +0 -0
  50. assets/admin/images/flags/co.gif +0 -0
  51. assets/admin/images/flags/cr.gif +0 -0
  52. assets/admin/images/flags/cs.gif +0 -0
  53. assets/admin/images/flags/cu.gif +0 -0
  54. assets/admin/images/flags/cv.gif +0 -0
  55. assets/admin/images/flags/cx.gif +0 -0
  56. assets/admin/images/flags/cy.gif +0 -0
  57. assets/admin/images/flags/cz.gif +0 -0
  58. assets/admin/images/flags/de.gif +0 -0
  59. assets/admin/images/flags/dj.gif +0 -0
  60. assets/admin/images/flags/dk.gif +0 -0
  61. assets/admin/images/flags/dm.gif +0 -0
  62. assets/admin/images/flags/do.gif +0 -0
  63. assets/admin/images/flags/dz.gif +0 -0
  64. assets/admin/images/flags/ec.gif +0 -0
  65. assets/admin/images/flags/ee.gif +0 -0
  66. assets/admin/images/flags/eg.gif +0 -0
  67. assets/admin/images/flags/eh.gif +0 -0
  68. assets/admin/images/flags/england.gif +0 -0
  69. assets/admin/images/flags/er.gif +0 -0
  70. assets/admin/images/flags/es.gif +0 -0
  71. assets/admin/images/flags/et.gif +0 -0
  72. assets/admin/images/flags/eu.gif +0 -0
  73. assets/admin/images/flags/fam.gif +0 -0
  74. assets/admin/images/flags/fi.gif +0 -0
  75. assets/admin/images/flags/fj.gif +0 -0
  76. assets/admin/images/flags/fk.gif +0 -0
  77. assets/admin/images/flags/fm.gif +0 -0
  78. assets/admin/images/flags/fo.gif +0 -0
  79. assets/admin/images/flags/fr.gif +0 -0
  80. assets/admin/images/flags/ga.gif +0 -0
  81. assets/admin/images/flags/gb.gif +0 -0
  82. assets/admin/images/flags/gd.gif +0 -0
  83. assets/admin/images/flags/ge.gif +0 -0
  84. assets/admin/images/flags/gf.gif +0 -0
  85. assets/admin/images/flags/gg.gif +0 -0
  86. assets/admin/images/flags/gh.gif +0 -0
  87. assets/admin/images/flags/gi.gif +0 -0
  88. assets/admin/images/flags/gl.gif +0 -0
  89. assets/admin/images/flags/gm.gif +0 -0
  90. assets/admin/images/flags/gn.gif +0 -0
  91. assets/admin/images/flags/gp.gif +0 -0
  92. assets/admin/images/flags/gq.gif +0 -0
  93. assets/admin/images/flags/gr.gif +0 -0
  94. assets/admin/images/flags/gs.gif +0 -0
  95. assets/admin/images/flags/gt.gif +0 -0
  96. assets/admin/images/flags/gu.gif +0 -0
  97. assets/admin/images/flags/gw.gif +0 -0
  98. assets/admin/images/flags/gy.gif +0 -0
  99. assets/admin/images/flags/hk.gif +0 -0
  100. assets/admin/images/flags/hm.gif +0 -0
  101. assets/admin/images/flags/hn.gif +0 -0
  102. assets/admin/images/flags/hr.gif +0 -0
  103. assets/admin/images/flags/ht.gif +0 -0
  104. assets/admin/images/flags/hu.gif +0 -0
  105. assets/admin/images/flags/id.gif +0 -0
  106. assets/admin/images/flags/ie.gif +0 -0
  107. assets/admin/images/flags/il.gif +0 -0
  108. assets/admin/images/flags/im.gif +0 -0
  109. assets/admin/images/flags/in.gif +0 -0
  110. assets/admin/images/flags/io.gif +0 -0
  111. assets/admin/images/flags/iq.gif +0 -0
  112. assets/admin/images/flags/ir.gif +0 -0
  113. assets/admin/images/flags/is.gif +0 -0
  114. assets/admin/images/flags/it.gif +0 -0
  115. assets/admin/images/flags/je.gif +0 -0
  116. assets/admin/images/flags/jm.gif +0 -0
  117. assets/admin/images/flags/jo.gif +0 -0
  118. assets/admin/images/flags/jp.gif +0 -0
  119. assets/admin/images/flags/ke.gif +0 -0
  120. assets/admin/images/flags/kg.gif +0 -0
  121. assets/admin/images/flags/kh.gif +0 -0
  122. assets/admin/images/flags/ki.gif +0 -0
  123. assets/admin/images/flags/km.gif +0 -0
  124. assets/admin/images/flags/kn.gif +0 -0
  125. assets/admin/images/flags/kp.gif +0 -0
  126. assets/admin/images/flags/kr.gif +0 -0
  127. assets/admin/images/flags/kw.gif +0 -0
  128. assets/admin/images/flags/ky.gif +0 -0
  129. assets/admin/images/flags/kz.gif +0 -0
  130. assets/admin/images/flags/la.gif +0 -0
  131. assets/admin/images/flags/lb.gif +0 -0
  132. assets/admin/images/flags/lc.gif +0 -0
  133. assets/admin/images/flags/li.gif +0 -0
  134. assets/admin/images/flags/lk.gif +0 -0
  135. assets/admin/images/flags/lr.gif +0 -0
  136. assets/admin/images/flags/ls.gif +0 -0
  137. assets/admin/images/flags/lt.gif +0 -0
  138. assets/admin/images/flags/lu.gif +0 -0
  139. assets/admin/images/flags/lv.gif +0 -0
  140. assets/admin/images/flags/ly.gif +0 -0
  141. assets/admin/images/flags/ma.gif +0 -0
  142. assets/admin/images/flags/mc.gif +0 -0
  143. assets/admin/images/flags/md.gif +0 -0
  144. assets/admin/images/flags/me.gif +0 -0
  145. assets/admin/images/flags/mf.gif +0 -0
  146. assets/admin/images/flags/mg.gif +0 -0
  147. assets/admin/images/flags/mh.gif +0 -0
  148. assets/admin/images/flags/mk.gif +0 -0
  149. assets/admin/images/flags/ml.gif +0 -0
  150. assets/admin/images/flags/mm.gif +0 -0
  151. assets/admin/images/flags/mn.gif +0 -0
  152. assets/admin/images/flags/mo.gif +0 -0
  153. assets/admin/images/flags/mp.gif +0 -0
  154. assets/admin/images/flags/mq.gif +0 -0
  155. assets/admin/images/flags/mr.gif +0 -0
  156. assets/admin/images/flags/ms.gif +0 -0
  157. assets/admin/images/flags/mt.gif +0 -0
  158. assets/admin/images/flags/mu.gif +0 -0
  159. assets/admin/images/flags/mv.gif +0 -0
  160. assets/admin/images/flags/mw.gif +0 -0
  161. assets/admin/images/flags/mx.gif +0 -0
  162. assets/admin/images/flags/my.gif +0 -0
  163. assets/admin/images/flags/mz.gif +0 -0
  164. assets/admin/images/flags/na.gif +0 -0
  165. assets/admin/images/flags/nc.gif +0 -0
  166. assets/admin/images/flags/ne.gif +0 -0
  167. assets/admin/images/flags/nf.gif +0 -0
  168. assets/admin/images/flags/ng.gif +0 -0
  169. assets/admin/images/flags/ni.gif +0 -0
  170. assets/admin/images/flags/nl.gif +0 -0
  171. assets/admin/images/flags/no.gif +0 -0
  172. assets/admin/images/flags/np.gif +0 -0
  173. assets/admin/images/flags/nr.gif +0 -0
  174. assets/admin/images/flags/nu.gif +0 -0
  175. assets/admin/images/flags/nz.gif +0 -0
  176. assets/admin/images/flags/om.gif +0 -0
  177. assets/admin/images/flags/pa.gif +0 -0
  178. assets/admin/images/flags/pe.gif +0 -0
  179. assets/admin/images/flags/pf.gif +0 -0
  180. assets/admin/images/flags/pg.gif +0 -0
  181. assets/admin/images/flags/ph.gif +0 -0
  182. assets/admin/images/flags/pk.gif +0 -0
  183. assets/admin/images/flags/pl.gif +0 -0
  184. assets/admin/images/flags/pm.gif +0 -0
  185. assets/admin/images/flags/pn.gif +0 -0
  186. assets/admin/images/flags/pr.gif +0 -0
  187. assets/admin/images/flags/ps.gif +0 -0
  188. assets/admin/images/flags/pt.gif +0 -0
  189. assets/admin/images/flags/pw.gif +0 -0
  190. assets/admin/images/flags/py.gif +0 -0
  191. assets/admin/images/flags/qa.gif +0 -0
  192. assets/admin/images/flags/re.gif +0 -0
  193. assets/admin/images/flags/ro.gif +0 -0
  194. assets/admin/images/flags/rs.gif +0 -0
  195. assets/admin/images/flags/ru.gif +0 -0
  196. assets/admin/images/flags/rw.gif +0 -0
  197. assets/admin/images/flags/sa.gif +0 -0
  198. assets/admin/images/flags/sb.gif +0 -0
  199. assets/admin/images/flags/sc.gif +0 -0
  200. assets/admin/images/flags/scotland.gif +0 -0
  201. assets/admin/images/flags/sd.gif +0 -0
  202. assets/admin/images/flags/se.gif +0 -0
  203. assets/admin/images/flags/sg.gif +0 -0
  204. assets/admin/images/flags/sh.gif +0 -0
  205. assets/admin/images/flags/si.gif +0 -0
  206. assets/admin/images/flags/sj.gif +0 -0
  207. assets/admin/images/flags/sk.gif +0 -0
  208. assets/admin/images/flags/sl.gif +0 -0
  209. assets/admin/images/flags/sm.gif +0 -0
  210. assets/admin/images/flags/sn.gif +0 -0
  211. assets/admin/images/flags/so.gif +0 -0
  212. assets/admin/images/flags/sr.gif +0 -0
  213. assets/admin/images/flags/st.gif +0 -0
  214. assets/admin/images/flags/sv.gif +0 -0
  215. assets/admin/images/flags/sy.gif +0 -0
  216. assets/admin/images/flags/sz.gif +0 -0
  217. assets/admin/images/flags/tc.gif +0 -0
  218. assets/admin/images/flags/td.gif +0 -0
  219. assets/admin/images/flags/tf.gif +0 -0
  220. assets/admin/images/flags/tg.gif +0 -0
  221. assets/admin/images/flags/th.gif +0 -0
  222. assets/admin/images/flags/tj.gif +0 -0
  223. assets/admin/images/flags/tk.gif +0 -0
  224. assets/admin/images/flags/tl.gif +0 -0
  225. assets/admin/images/flags/tm.gif +0 -0
  226. assets/admin/images/flags/tn.gif +0 -0
  227. assets/admin/images/flags/to.gif +0 -0
  228. assets/admin/images/flags/tr.gif +0 -0
  229. assets/admin/images/flags/tt.gif +0 -0
  230. assets/admin/images/flags/tv.gif +0 -0
  231. assets/admin/images/flags/tw.gif +0 -0
  232. assets/admin/images/flags/tz.gif +0 -0
  233. assets/admin/images/flags/ua.gif +0 -0
  234. assets/admin/images/flags/ug.gif +0 -0
  235. assets/admin/images/flags/um.gif +0 -0
  236. assets/admin/images/flags/us.gif +0 -0
  237. assets/admin/images/flags/uy.gif +0 -0
  238. assets/admin/images/flags/uz.gif +0 -0
  239. assets/admin/images/flags/va.gif +0 -0
  240. assets/admin/images/flags/vc.gif +0 -0
  241. assets/admin/images/flags/ve.gif +0 -0
  242. assets/admin/images/flags/vg.gif +0 -0
  243. assets/admin/images/flags/vi.gif +0 -0
  244. assets/admin/images/flags/vn.gif +0 -0
  245. assets/admin/images/flags/vu.gif +0 -0
  246. assets/admin/images/flags/wales.gif +0 -0
  247. assets/admin/images/flags/wf.gif +0 -0
  248. assets/admin/images/flags/ws.gif +0 -0
  249. assets/admin/images/flags/ye.gif +0 -0
  250. assets/admin/images/flags/yt.gif +0 -0
  251. assets/admin/images/flags/za.gif +0 -0
  252. assets/admin/images/flags/zm.gif +0 -0
  253. assets/admin/images/flags/zw.gif +0 -0
  254. assets/admin/images/gdbc-favicon.png +0 -0
  255. assets/admin/images/gdbc-logo.png +0 -0
  256. assets/admin/scripts/bootstrap.min.js +1 -0
  257. assets/admin/scripts/easy-pie-chart.js +359 -0
  258. assets/admin/scripts/gdbc-admin.js +47 -0
  259. assets/admin/scripts/gdbc-reports.js +828 -0
  260. assets/admin/scripts/jquery-flot-tooltip.js +571 -0
  261. assets/admin/scripts/jquery-flot.js +3601 -0
  262. assets/admin/scripts/jquery-jvectormap-1.2.2.min.js +8 -0
  263. assets/admin/scripts/jquery-jvectormap-world-mill-en.js +1 -0
  264. assets/admin/scripts/morris.js +1892 -0
  265. assets/admin/scripts/raphael.js +11 -0
  266. assets/admin/styles/bootstrap.css +6174 -0
  267. assets/admin/styles/fonts/glyphicons-halflings-regular.eot +0 -0
  268. assets/admin/styles/fonts/glyphicons-halflings-regular.svg +229 -0
  269. assets/admin/styles/fonts/glyphicons-halflings-regular.ttf +0 -0
  270. assets/admin/styles/fonts/glyphicons-halflings-regular.woff +0 -0
  271. assets/admin/styles/gdbc-admin.css +832 -0
  272. assets/admin/styles/morris.css +2 -0
  273. assets/public/scripts/gdbc-client.js.php +84 -0
  274. assets/public/scripts/gdbc-public.js +33 -0
  275. assets/public/scripts/index.php +1 -0
  276. engine/GdbcAjaxController.php +166 -0
  277. engine/GdbcBruteGuardian.php +230 -0
  278. engine/GdbcIPUtils.php +404 -0
  279. engine/GdbcModulesController.php +566 -0
  280. engine/GdbcNotificationsController.php +152 -0
  281. engine/GdbcRequestController.php +288 -0
  282. engine/GdbcTaskScheduler.php +58 -0
  283. engine/GdbcUpdatesController.php +317 -0
  284. engine/GoodByeCaptchaAdmin.php +306 -0
  285. engine/GoodByeCaptchaPublic.php +91 -0
  286. engine/GoodByeCaptchaUtils.php +593 -0
  287. engine/admin/GdbcAdminNotice.php +34 -0
  288. engine/admin/pages/GdbcBaseAdminPage.php +98 -0
  289. engine/admin/pages/GdbcContactFormsAdminPage.php +55 -0
  290. engine/admin/pages/GdbcMembershipAdminPage.php +52 -0
  291. engine/admin/pages/GdbcNotificationsAdminPage.php +41 -0
  292. engine/admin/pages/GdbcOthersAdminPage.php +71 -0
  293. engine/admin/pages/GdbcReportsAdminPage.php +64 -0
  294. engine/admin/pages/GdbcSecurityAdminPage.php +161 -0
  295. engine/admin/pages/GdbcSettingsAdminPage.php +37 -0
  296. engine/admin/pages/GdbcWordpressAdminPage.php +107 -0
  297. engine/db-access/GdbcDbAccessController.php +356 -0
  298. engine/entities/GdbcAttemptEntity.php +64 -0
  299. engine/modules/GdbcBaseAdminModule.php +194 -0
  300. engine/modules/GdbcBasePublicModule.php +100 -0
  301. engine/modules/black-listed-ips/GdbcBlackListedIpsAdminModule.php +249 -0
  302. engine/modules/black-listed-ips/GdbcBlackListedIpsPublicModule.php +43 -0
  303. engine/modules/black-listed-ips/partials/admin-settings.php +214 -0
  304. engine/modules/brute-force/GdbcBruteForceAdminModule.php +156 -0
  305. engine/modules/brute-force/GdbcBruteForcePublicModule.php +66 -0
  306. engine/modules/email-notifications/GdbcEmailNotificationsAdminModule.php +101 -0
  307. engine/modules/email-notifications/GdbcEmailNotificationsPublicModule.php +27 -0
assets/admin/images/flags/ad.gif ADDED
Binary file
assets/admin/images/flags/ae.gif ADDED
Binary file
assets/admin/images/flags/af.gif ADDED
Binary file
assets/admin/images/flags/ag.gif ADDED
Binary file
assets/admin/images/flags/ai.gif ADDED
Binary file
assets/admin/images/flags/al.gif ADDED
Binary file
assets/admin/images/flags/am.gif ADDED
Binary file
assets/admin/images/flags/an.gif ADDED
Binary file
assets/admin/images/flags/ao.gif ADDED
Binary file
assets/admin/images/flags/aq.gif ADDED
Binary file
assets/admin/images/flags/ar.gif ADDED
Binary file
assets/admin/images/flags/as.gif ADDED
Binary file
assets/admin/images/flags/at.gif ADDED
Binary file
assets/admin/images/flags/au.gif ADDED
Binary file
assets/admin/images/flags/aw.gif ADDED
Binary file
assets/admin/images/flags/ax.gif ADDED
Binary file
assets/admin/images/flags/az.gif ADDED
Binary file
assets/admin/images/flags/ba.gif ADDED
Binary file
assets/admin/images/flags/bb.gif ADDED
Binary file
assets/admin/images/flags/bd.gif ADDED
Binary file
assets/admin/images/flags/be.gif ADDED
Binary file
assets/admin/images/flags/bf.gif ADDED
Binary file
assets/admin/images/flags/bg.gif ADDED
Binary file
assets/admin/images/flags/bh.gif ADDED
Binary file
assets/admin/images/flags/bi.gif ADDED
Binary file
assets/admin/images/flags/bj.gif ADDED
Binary file
assets/admin/images/flags/bl.gif ADDED
Binary file
assets/admin/images/flags/bm.gif ADDED
Binary file
assets/admin/images/flags/bn.gif ADDED
Binary file
assets/admin/images/flags/bo.gif ADDED
Binary file
assets/admin/images/flags/br.gif ADDED
Binary file
assets/admin/images/flags/bs.gif ADDED
Binary file
assets/admin/images/flags/bt.gif ADDED
Binary file
assets/admin/images/flags/bv.gif ADDED
Binary file
assets/admin/images/flags/bw.gif ADDED
Binary file
assets/admin/images/flags/by.gif ADDED
Binary file
assets/admin/images/flags/bz.gif ADDED
Binary file
assets/admin/images/flags/ca.gif ADDED
Binary file
assets/admin/images/flags/catalonia.gif ADDED
Binary file
assets/admin/images/flags/cc.gif ADDED
Binary file
assets/admin/images/flags/cd.gif ADDED
Binary file
assets/admin/images/flags/cf.gif ADDED
Binary file
assets/admin/images/flags/cg.gif ADDED
Binary file
assets/admin/images/flags/ch.gif ADDED
Binary file
assets/admin/images/flags/ci.gif ADDED
Binary file
assets/admin/images/flags/ck.gif ADDED
Binary file
assets/admin/images/flags/cl.gif ADDED
Binary file
assets/admin/images/flags/cm.gif ADDED
Binary file
assets/admin/images/flags/cn.gif ADDED
Binary file
assets/admin/images/flags/co.gif ADDED
Binary file
assets/admin/images/flags/cr.gif ADDED
Binary file
assets/admin/images/flags/cs.gif ADDED
Binary file
assets/admin/images/flags/cu.gif ADDED
Binary file
assets/admin/images/flags/cv.gif ADDED
Binary file
assets/admin/images/flags/cx.gif ADDED
Binary file
assets/admin/images/flags/cy.gif ADDED
Binary file
assets/admin/images/flags/cz.gif ADDED
Binary file
assets/admin/images/flags/de.gif ADDED
Binary file
assets/admin/images/flags/dj.gif ADDED
Binary file
assets/admin/images/flags/dk.gif ADDED
Binary file
assets/admin/images/flags/dm.gif ADDED
Binary file
assets/admin/images/flags/do.gif ADDED
Binary file
assets/admin/images/flags/dz.gif ADDED
Binary file
assets/admin/images/flags/ec.gif ADDED
Binary file
assets/admin/images/flags/ee.gif ADDED
Binary file
assets/admin/images/flags/eg.gif ADDED
Binary file
assets/admin/images/flags/eh.gif ADDED
Binary file
assets/admin/images/flags/england.gif ADDED
Binary file
assets/admin/images/flags/er.gif ADDED
Binary file
assets/admin/images/flags/es.gif ADDED
Binary file
assets/admin/images/flags/et.gif ADDED
Binary file
assets/admin/images/flags/eu.gif ADDED
Binary file
assets/admin/images/flags/fam.gif ADDED
Binary file
assets/admin/images/flags/fi.gif ADDED
Binary file
assets/admin/images/flags/fj.gif ADDED
Binary file
assets/admin/images/flags/fk.gif ADDED
Binary file
assets/admin/images/flags/fm.gif ADDED
Binary file
assets/admin/images/flags/fo.gif ADDED
Binary file
assets/admin/images/flags/fr.gif ADDED
Binary file
assets/admin/images/flags/ga.gif ADDED
Binary file
assets/admin/images/flags/gb.gif ADDED
Binary file
assets/admin/images/flags/gd.gif ADDED
Binary file
assets/admin/images/flags/ge.gif ADDED
Binary file
assets/admin/images/flags/gf.gif ADDED
Binary file
assets/admin/images/flags/gg.gif ADDED
Binary file
assets/admin/images/flags/gh.gif ADDED
Binary file
assets/admin/images/flags/gi.gif ADDED
Binary file
assets/admin/images/flags/gl.gif ADDED
Binary file
assets/admin/images/flags/gm.gif ADDED
Binary file
assets/admin/images/flags/gn.gif ADDED
Binary file
assets/admin/images/flags/gp.gif ADDED
Binary file
assets/admin/images/flags/gq.gif ADDED
Binary file
assets/admin/images/flags/gr.gif ADDED
Binary file
assets/admin/images/flags/gs.gif ADDED
Binary file
assets/admin/images/flags/gt.gif ADDED
Binary file
assets/admin/images/flags/gu.gif ADDED
Binary file
assets/admin/images/flags/gw.gif ADDED
Binary file
assets/admin/images/flags/gy.gif ADDED
Binary file
assets/admin/images/flags/hk.gif ADDED
Binary file
assets/admin/images/flags/hm.gif ADDED
Binary file
assets/admin/images/flags/hn.gif ADDED
Binary file
assets/admin/images/flags/hr.gif ADDED
Binary file
assets/admin/images/flags/ht.gif ADDED
Binary file
assets/admin/images/flags/hu.gif ADDED
Binary file
assets/admin/images/flags/id.gif ADDED
Binary file
assets/admin/images/flags/ie.gif ADDED
Binary file
assets/admin/images/flags/il.gif ADDED
Binary file
assets/admin/images/flags/im.gif ADDED
Binary file
assets/admin/images/flags/in.gif ADDED
Binary file
assets/admin/images/flags/io.gif ADDED
Binary file
assets/admin/images/flags/iq.gif ADDED
Binary file
assets/admin/images/flags/ir.gif ADDED
Binary file
assets/admin/images/flags/is.gif ADDED
Binary file
assets/admin/images/flags/it.gif ADDED
Binary file
assets/admin/images/flags/je.gif ADDED
Binary file
assets/admin/images/flags/jm.gif ADDED
Binary file
assets/admin/images/flags/jo.gif ADDED
Binary file
assets/admin/images/flags/jp.gif ADDED
Binary file
assets/admin/images/flags/ke.gif ADDED
Binary file
assets/admin/images/flags/kg.gif ADDED
Binary file
assets/admin/images/flags/kh.gif ADDED
Binary file
assets/admin/images/flags/ki.gif ADDED
Binary file
assets/admin/images/flags/km.gif ADDED
Binary file
assets/admin/images/flags/kn.gif ADDED
Binary file
assets/admin/images/flags/kp.gif ADDED
Binary file
assets/admin/images/flags/kr.gif ADDED
Binary file
assets/admin/images/flags/kw.gif ADDED
Binary file
assets/admin/images/flags/ky.gif ADDED
Binary file
assets/admin/images/flags/kz.gif ADDED
Binary file
assets/admin/images/flags/la.gif ADDED
Binary file
assets/admin/images/flags/lb.gif ADDED
Binary file
assets/admin/images/flags/lc.gif ADDED
Binary file
assets/admin/images/flags/li.gif ADDED
Binary file
assets/admin/images/flags/lk.gif ADDED
Binary file
assets/admin/images/flags/lr.gif ADDED
Binary file
assets/admin/images/flags/ls.gif ADDED
Binary file
assets/admin/images/flags/lt.gif ADDED
Binary file
assets/admin/images/flags/lu.gif ADDED
Binary file
assets/admin/images/flags/lv.gif ADDED
Binary file
assets/admin/images/flags/ly.gif ADDED
Binary file
assets/admin/images/flags/ma.gif ADDED
Binary file
assets/admin/images/flags/mc.gif ADDED
Binary file
assets/admin/images/flags/md.gif ADDED
Binary file
assets/admin/images/flags/me.gif ADDED
Binary file
assets/admin/images/flags/mf.gif ADDED
Binary file
assets/admin/images/flags/mg.gif ADDED
Binary file
assets/admin/images/flags/mh.gif ADDED
Binary file
assets/admin/images/flags/mk.gif ADDED
Binary file
assets/admin/images/flags/ml.gif ADDED
Binary file
assets/admin/images/flags/mm.gif ADDED
Binary file
assets/admin/images/flags/mn.gif ADDED
Binary file
assets/admin/images/flags/mo.gif ADDED
Binary file
assets/admin/images/flags/mp.gif ADDED
Binary file
assets/admin/images/flags/mq.gif ADDED
Binary file
assets/admin/images/flags/mr.gif ADDED
Binary file
assets/admin/images/flags/ms.gif ADDED
Binary file
assets/admin/images/flags/mt.gif ADDED
Binary file
assets/admin/images/flags/mu.gif ADDED
Binary file
assets/admin/images/flags/mv.gif ADDED
Binary file
assets/admin/images/flags/mw.gif ADDED
Binary file
assets/admin/images/flags/mx.gif ADDED
Binary file
assets/admin/images/flags/my.gif ADDED
Binary file
assets/admin/images/flags/mz.gif ADDED
Binary file
assets/admin/images/flags/na.gif ADDED
Binary file
assets/admin/images/flags/nc.gif ADDED
Binary file
assets/admin/images/flags/ne.gif ADDED
Binary file
assets/admin/images/flags/nf.gif ADDED
Binary file
assets/admin/images/flags/ng.gif ADDED
Binary file
assets/admin/images/flags/ni.gif ADDED
Binary file
assets/admin/images/flags/nl.gif ADDED
Binary file
assets/admin/images/flags/no.gif ADDED
Binary file
assets/admin/images/flags/np.gif ADDED
Binary file
assets/admin/images/flags/nr.gif ADDED
Binary file
assets/admin/images/flags/nu.gif ADDED
Binary file
assets/admin/images/flags/nz.gif ADDED
Binary file
assets/admin/images/flags/om.gif ADDED
Binary file
assets/admin/images/flags/pa.gif ADDED
Binary file
assets/admin/images/flags/pe.gif ADDED
Binary file
assets/admin/images/flags/pf.gif ADDED
Binary file
assets/admin/images/flags/pg.gif ADDED
Binary file
assets/admin/images/flags/ph.gif ADDED
Binary file
assets/admin/images/flags/pk.gif ADDED
Binary file
assets/admin/images/flags/pl.gif ADDED
Binary file
assets/admin/images/flags/pm.gif ADDED
Binary file
assets/admin/images/flags/pn.gif ADDED
Binary file
assets/admin/images/flags/pr.gif ADDED
Binary file
assets/admin/images/flags/ps.gif ADDED
Binary file
assets/admin/images/flags/pt.gif ADDED
Binary file
assets/admin/images/flags/pw.gif ADDED
Binary file
assets/admin/images/flags/py.gif ADDED
Binary file
assets/admin/images/flags/qa.gif ADDED
Binary file
assets/admin/images/flags/re.gif ADDED
Binary file
assets/admin/images/flags/ro.gif ADDED
Binary file
assets/admin/images/flags/rs.gif ADDED
Binary file
assets/admin/images/flags/ru.gif ADDED
Binary file
assets/admin/images/flags/rw.gif ADDED
Binary file
assets/admin/images/flags/sa.gif ADDED
Binary file
assets/admin/images/flags/sb.gif ADDED
Binary file
assets/admin/images/flags/sc.gif ADDED
Binary file
assets/admin/images/flags/scotland.gif ADDED
Binary file
assets/admin/images/flags/sd.gif ADDED
Binary file
assets/admin/images/flags/se.gif ADDED
Binary file
assets/admin/images/flags/sg.gif ADDED
Binary file
assets/admin/images/flags/sh.gif ADDED
Binary file
assets/admin/images/flags/si.gif ADDED
Binary file
assets/admin/images/flags/sj.gif ADDED
Binary file
assets/admin/images/flags/sk.gif ADDED
Binary file
assets/admin/images/flags/sl.gif ADDED
Binary file
assets/admin/images/flags/sm.gif ADDED
Binary file
assets/admin/images/flags/sn.gif ADDED
Binary file
assets/admin/images/flags/so.gif ADDED
Binary file
assets/admin/images/flags/sr.gif ADDED
Binary file
assets/admin/images/flags/st.gif ADDED
Binary file
assets/admin/images/flags/sv.gif ADDED
Binary file
assets/admin/images/flags/sy.gif ADDED
Binary file
assets/admin/images/flags/sz.gif ADDED
Binary file
assets/admin/images/flags/tc.gif ADDED
Binary file
assets/admin/images/flags/td.gif ADDED
Binary file
assets/admin/images/flags/tf.gif ADDED
Binary file
assets/admin/images/flags/tg.gif ADDED
Binary file
assets/admin/images/flags/th.gif ADDED
Binary file
assets/admin/images/flags/tj.gif ADDED
Binary file
assets/admin/images/flags/tk.gif ADDED
Binary file
assets/admin/images/flags/tl.gif ADDED
Binary file
assets/admin/images/flags/tm.gif ADDED
Binary file
assets/admin/images/flags/tn.gif ADDED
Binary file
assets/admin/images/flags/to.gif ADDED
Binary file
assets/admin/images/flags/tr.gif ADDED
Binary file
assets/admin/images/flags/tt.gif ADDED
Binary file
assets/admin/images/flags/tv.gif ADDED
Binary file
assets/admin/images/flags/tw.gif ADDED
Binary file
assets/admin/images/flags/tz.gif ADDED
Binary file
assets/admin/images/flags/ua.gif ADDED
Binary file
assets/admin/images/flags/ug.gif ADDED
Binary file
assets/admin/images/flags/um.gif ADDED
Binary file
assets/admin/images/flags/us.gif ADDED
Binary file
assets/admin/images/flags/uy.gif ADDED
Binary file
assets/admin/images/flags/uz.gif ADDED
Binary file
assets/admin/images/flags/va.gif ADDED
Binary file
assets/admin/images/flags/vc.gif ADDED
Binary file
assets/admin/images/flags/ve.gif ADDED
Binary file
assets/admin/images/flags/vg.gif ADDED
Binary file
assets/admin/images/flags/vi.gif ADDED
Binary file
assets/admin/images/flags/vn.gif ADDED
Binary file
assets/admin/images/flags/vu.gif ADDED
Binary file
assets/admin/images/flags/wales.gif ADDED
Binary file
assets/admin/images/flags/wf.gif ADDED
Binary file
assets/admin/images/flags/ws.gif ADDED
Binary file
assets/admin/images/flags/ye.gif ADDED
Binary file
assets/admin/images/flags/yt.gif ADDED
Binary file
assets/admin/images/flags/za.gif ADDED
Binary file
assets/admin/images/flags/zm.gif ADDED
Binary file
assets/admin/images/flags/zw.gif ADDED
Binary file
assets/admin/images/gdbc-favicon.png ADDED
Binary file
assets/admin/images/gdbc-logo.png ADDED
Binary file
assets/admin/scripts/bootstrap.min.js ADDED
@@ -0,0 +1 @@
 
1
+ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
assets/admin/scripts/easy-pie-chart.js ADDED
@@ -0,0 +1,359 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+ * easyPieChart
3
+ * Lightweight plugin to render simple, animated and retina optimized pie charts
4
+ *
5
+ * @license
6
+ * @author Robert Fleischmann <rendro87@gmail.com> (http://robert-fleischmann.de)
7
+ * @version 2.1.5
8
+ **/
9
+
10
+ (function(root, factory) {
11
+ if(typeof exports === 'object') {
12
+ module.exports = factory(require('jquery'));
13
+ }
14
+ else if(typeof define === 'function' && define.amd) {
15
+ define(['jquery'], factory);
16
+ }
17
+ else {
18
+ factory(root.jQuery);
19
+ }
20
+ }(this, function($) {
21
+
22
+ /**
23
+ * Renderer to render the chart on a canvas object
24
+ * @param {DOMElement} el DOM element to host the canvas (root of the plugin)
25
+ * @param {object} options options object of the plugin
26
+ */
27
+ var CanvasRenderer = function(el, options) {
28
+ var cachedBackground;
29
+ var canvas = document.createElement('canvas');
30
+
31
+ el.appendChild(canvas);
32
+
33
+ if (typeof(G_vmlCanvasManager) !== 'undefined') {
34
+ G_vmlCanvasManager.initElement(canvas);
35
+ }
36
+
37
+ var ctx = canvas.getContext('2d');
38
+
39
+ canvas.width = canvas.height = options.size;
40
+
41
+ // canvas on retina devices
42
+ var scaleBy = 1;
43
+ if (window.devicePixelRatio > 1) {
44
+ scaleBy = window.devicePixelRatio;
45
+ canvas.style.width = canvas.style.height = [options.size, 'px'].join('');
46
+ canvas.width = canvas.height = options.size * scaleBy;
47
+ ctx.scale(scaleBy, scaleBy);
48
+ }
49
+
50
+ // move 0,0 coordinates to the center
51
+ ctx.translate(options.size / 2, options.size / 2);
52
+
53
+ // rotate canvas -90deg
54
+ ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI);
55
+
56
+ var radius = (options.size - options.lineWidth) / 2;
57
+ if (options.scaleColor && options.scaleLength) {
58
+ radius -= options.scaleLength + 2; // 2 is the distance between scale and bar
59
+ }
60
+
61
+ // IE polyfill for Date
62
+ Date.now = Date.now || function() {
63
+ return +(new Date());
64
+ };
65
+
66
+ /**
67
+ * Draw a circle around the center of the canvas
68
+ * @param {strong} color Valid CSS color string
69
+ * @param {number} lineWidth Width of the line in px
70
+ * @param {number} percent Percentage to draw (float between -1 and 1)
71
+ */
72
+ var drawCircle = function(color, lineWidth, percent) {
73
+ percent = Math.min(Math.max(-1, percent || 0), 1);
74
+ var isNegative = percent <= 0 ? true : false;
75
+
76
+ ctx.beginPath();
77
+ ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative);
78
+
79
+ ctx.strokeStyle = color;
80
+ ctx.lineWidth = lineWidth;
81
+
82
+ ctx.stroke();
83
+ };
84
+
85
+ /**
86
+ * Draw the scale of the chart
87
+ */
88
+ var drawScale = function() {
89
+ var offset;
90
+ var length;
91
+
92
+ ctx.lineWidth = 1;
93
+ ctx.fillStyle = options.scaleColor;
94
+
95
+ ctx.save();
96
+ for (var i = 24; i > 0; --i) {
97
+ if (i % 6 === 0) {
98
+ length = options.scaleLength;
99
+ offset = 0;
100
+ } else {
101
+ length = options.scaleLength * 0.6;
102
+ offset = options.scaleLength - length;
103
+ }
104
+ ctx.fillRect(-options.size/2 + offset, 0, length, 1);
105
+ ctx.rotate(Math.PI / 12);
106
+ }
107
+ ctx.restore();
108
+ };
109
+
110
+ /**
111
+ * Request animation frame wrapper with polyfill
112
+ * @return {function} Request animation frame method or timeout fallback
113
+ */
114
+ var reqAnimationFrame = (function() {
115
+ return window.requestAnimationFrame ||
116
+ window.webkitRequestAnimationFrame ||
117
+ window.mozRequestAnimationFrame ||
118
+ function(callback) {
119
+ window.setTimeout(callback, 1000 / 60);
120
+ };
121
+ }());
122
+
123
+ /**
124
+ * Draw the background of the plugin including the scale and the track
125
+ */
126
+ var drawBackground = function() {
127
+ if(options.scaleColor) drawScale();
128
+ if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1);
129
+ };
130
+
131
+ /**
132
+ * Canvas accessor
133
+ */
134
+ this.getCanvas = function() {
135
+ return canvas;
136
+ };
137
+
138
+ /**
139
+ * Canvas 2D context 'ctx' accessor
140
+ */
141
+ this.getCtx = function() {
142
+ return ctx;
143
+ };
144
+
145
+ /**
146
+ * Clear the complete canvas
147
+ */
148
+ this.clear = function() {
149
+ ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size);
150
+ };
151
+
152
+ /**
153
+ * Draw the complete chart
154
+ * @param {number} percent Percent shown by the chart between -100 and 100
155
+ */
156
+ this.draw = function(percent) {
157
+ // do we need to render a background
158
+ if (!!options.scaleColor || !!options.trackColor) {
159
+ // getImageData and putImageData are supported
160
+ if (ctx.getImageData && ctx.putImageData) {
161
+ if (!cachedBackground) {
162
+ drawBackground();
163
+ cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy);
164
+ } else {
165
+ ctx.putImageData(cachedBackground, 0, 0);
166
+ }
167
+ } else {
168
+ this.clear();
169
+ drawBackground();
170
+ }
171
+ } else {
172
+ this.clear();
173
+ }
174
+
175
+ ctx.lineCap = options.lineCap;
176
+
177
+ // if barcolor is a function execute it and pass the percent as a value
178
+ var color;
179
+ if (typeof(options.barColor) === 'function') {
180
+ color = options.barColor(percent);
181
+ } else {
182
+ color = options.barColor;
183
+ }
184
+
185
+ // draw bar
186
+ drawCircle(color, options.lineWidth, percent / 100);
187
+ }.bind(this);
188
+
189
+ /**
190
+ * Animate from some percent to some other percentage
191
+ * @param {number} from Starting percentage
192
+ * @param {number} to Final percentage
193
+ */
194
+ this.animate = function(from, to) {
195
+ var startTime = Date.now();
196
+ options.onStart(from, to);
197
+ var animation = function() {
198
+ var process = Math.min(Date.now() - startTime, options.animate.duration);
199
+ var currentValue = options.easing(this, process, from, to - from, options.animate.duration);
200
+ this.draw(currentValue);
201
+ options.onStep(from, to, currentValue);
202
+ if (process >= options.animate.duration) {
203
+ options.onStop(from, to);
204
+ } else {
205
+ reqAnimationFrame(animation);
206
+ }
207
+ }.bind(this);
208
+
209
+ reqAnimationFrame(animation);
210
+ }.bind(this);
211
+ };
212
+
213
+ var EasyPieChart = function(el, opts) {
214
+ var defaultOptions = {
215
+ barColor: '#ef1e25',
216
+ trackColor: '#f9f9f9',
217
+ scaleColor: '#dfe0e0',
218
+ scaleLength: 5,
219
+ lineCap: 'round',
220
+ lineWidth: 3,
221
+ size: 110,
222
+ rotate: 0,
223
+ animate: {
224
+ duration: 1000,
225
+ enabled: true
226
+ },
227
+ easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/
228
+ t = t / (d/2);
229
+ if (t < 1) {
230
+ return c / 2 * t * t + b;
231
+ }
232
+ return -c/2 * ((--t)*(t-2) - 1) + b;
233
+ },
234
+ onStart: function(from, to) {
235
+ return;
236
+ },
237
+ onStep: function(from, to, currentValue) {
238
+ return;
239
+ },
240
+ onStop: function(from, to) {
241
+ return;
242
+ }
243
+ };
244
+
245
+ // detect present renderer
246
+ if (typeof(CanvasRenderer) !== 'undefined') {
247
+ defaultOptions.renderer = CanvasRenderer;
248
+ } else if (typeof(SVGRenderer) !== 'undefined') {
249
+ defaultOptions.renderer = SVGRenderer;
250
+ } else {
251
+ throw new Error('Please load either the SVG- or the CanvasRenderer');
252
+ }
253
+
254
+ var options = {};
255
+ var currentValue = 0;
256
+
257
+ /**
258
+ * Initialize the plugin by creating the options object and initialize rendering
259
+ */
260
+ var init = function() {
261
+ this.el = el;
262
+ this.options = options;
263
+
264
+ // merge user options into default options
265
+ for (var i in defaultOptions) {
266
+ if (defaultOptions.hasOwnProperty(i)) {
267
+ options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i];
268
+ if (typeof(options[i]) === 'function') {
269
+ options[i] = options[i].bind(this);
270
+ }
271
+ }
272
+ }
273
+
274
+ // check for jQuery easing
275
+ if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) {
276
+ options.easing = jQuery.easing[options.easing];
277
+ } else {
278
+ options.easing = defaultOptions.easing;
279
+ }
280
+
281
+ // process earlier animate option to avoid bc breaks
282
+ if (typeof(options.animate) === 'number') {
283
+ options.animate = {
284
+ duration: options.animate,
285
+ enabled: true
286
+ };
287
+ }
288
+
289
+ if (typeof(options.animate) === 'boolean' && !options.animate) {
290
+ options.animate = {
291
+ duration: 1000,
292
+ enabled: options.animate
293
+ };
294
+ }
295
+
296
+ // create renderer
297
+ this.renderer = new options.renderer(el, options);
298
+
299
+ // initial draw
300
+ this.renderer.draw(currentValue);
301
+
302
+ // initial update
303
+ if (el.dataset && el.dataset.percent) {
304
+ this.update(parseFloat(el.dataset.percent));
305
+ } else if (el.getAttribute && el.getAttribute('data-percent')) {
306
+ this.update(parseFloat(el.getAttribute('data-percent')));
307
+ }
308
+ }.bind(this);
309
+
310
+ /**
311
+ * Update the value of the chart
312
+ * @param {number} newValue Number between 0 and 100
313
+ * @return {object} Instance of the plugin for method chaining
314
+ */
315
+ this.update = function(newValue) {
316
+ newValue = parseFloat(newValue);
317
+ if (options.animate.enabled) {
318
+ this.renderer.animate(currentValue, newValue);
319
+ } else {
320
+ this.renderer.draw(newValue);
321
+ }
322
+ currentValue = newValue;
323
+ return this;
324
+ }.bind(this);
325
+
326
+ /**
327
+ * Disable animation
328
+ * @return {object} Instance of the plugin for method chaining
329
+ */
330
+ this.disableAnimation = function() {
331
+ options.animate.enabled = false;
332
+ return this;
333
+ };
334
+
335
+ /**
336
+ * Enable animation
337
+ * @return {object} Instance of the plugin for method chaining
338
+ */
339
+ this.enableAnimation = function() {
340
+ options.animate.enabled = true;
341
+ return this;
342
+ };
343
+
344
+ init();
345
+ };
346
+
347
+ $.fn.easyPieChart = function(options) {
348
+ return this.each(function() {
349
+ var instanceOptions;
350
+
351
+ if (!$.data(this, 'easyPieChart')) {
352
+ instanceOptions = $.extend({}, options, $(this).data());
353
+ $.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions));
354
+ }
355
+ });
356
+ };
357
+
358
+
359
+ }));
assets/admin/scripts/gdbc-admin.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery( document ).ready(function($) {
2
+ var maxLogsDaysElm = $('#gdbcsettings-settings-MaxLogsDays');
3
+
4
+ if(maxLogsDaysElm.length !== 0) {
5
+ if(maxLogsDaysElm.val() == 0) {
6
+ maxLogsDaysElm.parent().children('p').first().toggle(false);
7
+ maxLogsDaysElm.parent().children('p').last().toggle(true);
8
+ }
9
+
10
+ maxLogsDaysElm.change(function () {
11
+ if ($(this).val() != 0) {
12
+ $(this).parent().children('p').first().toggle(true);
13
+ $(this).parent().children('p').last().toggle(false);
14
+ }
15
+ else {
16
+ $(this).parent().children('p').first().toggle(false);
17
+ $(this).parent().children('p').last().toggle(true);
18
+ }
19
+
20
+ });
21
+ }
22
+
23
+ $('div.mch-admin-notice.is-dismissible').each(function(){
24
+ var noticeElm = $(this);
25
+ noticeElm.on('click', '.notice-dismiss', function(event){
26
+
27
+ jQuery.ajax({
28
+ type : "post",
29
+ cache: false,
30
+ dataType : "json",
31
+ url : GdbcAdmin.ajaxUrl,
32
+ data : {
33
+ action: 'gdbc-dismiss-' + noticeElm.prop('id'),
34
+ ajaxRequestNonce: GdbcAdmin.ajaxRequestNonce
35
+ }
36
+ });
37
+
38
+
39
+
40
+ //alert(noticeElm.data('id'));
41
+ })
42
+
43
+ });
44
+
45
+
46
+
47
+ });
assets/admin/scripts/gdbc-reports.js ADDED
@@ -0,0 +1,828 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery( document ).ready(function($) {
2
+
3
+
4
+ if ($("#flot-container").length > 0)
5
+ initializeModulesPage();
6
+ else
7
+ initializeDashboard();
8
+
9
+ function initializeDashboard()
10
+ {
11
+
12
+
13
+ displayDashBoardAttemptsChart();
14
+ displayAttemptsPerModuleAndSectionChart();
15
+ displayLatestAttemptsTable();
16
+ displayLocationsOnMap();
17
+ displayAttemptsPerClientIpTable();
18
+
19
+ //displayPercentagePieChart();
20
+ displayTotalAttemptsPerModule()
21
+ }
22
+
23
+
24
+ function initializeModulesPage()
25
+ {
26
+ displayModulesChart();
27
+ displayModulesTables();
28
+ }
29
+
30
+ function displayModulesTables()
31
+ {
32
+ $("[id^='wid-id-']").each(function() {
33
+ var moduleId = $(this).attr('id').substr(7);
34
+ displayModuleTable(moduleId, 1, 'CreatedDate');
35
+ });
36
+ }
37
+
38
+ function displayAttemptsPerModuleAndSectionChart()
39
+ {
40
+ var ajaxData = {};
41
+ ajaxData['action'] = 'retrieveAttemptsPerModuleAndSection';
42
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
43
+
44
+ $.ajax({
45
+ type: "post",
46
+ cache: false,
47
+ dataType: "json",
48
+ url: GdbcAdmin.ajaxUrl,
49
+ data: ajaxData,
50
+ success: function (response) {
51
+
52
+ Morris.Bar({
53
+ element: 'gdbc-barchart-holder',
54
+ data: response,
55
+ hoverCallback: function(index, options, content) {
56
+
57
+ var moduleInfo = response[index];
58
+
59
+ if(!moduleInfo.attempts)
60
+ return '';
61
+
62
+ var label = moduleInfo.module;
63
+ if(moduleInfo.section.length)
64
+ label += '/' + moduleInfo.section;
65
+
66
+ var hover = '<div>';
67
+
68
+ hover += '<p>' + label + '</p>';
69
+ hover += '<p><span>' + moduleInfo.attempts + ' attempts' + '</span></p>';
70
+
71
+ hover += '</div>';
72
+ return hover;
73
+ },
74
+ xkey: 'y',
75
+ ykeys: ['attempts'],
76
+ grid:true,
77
+ hideHover:'auto',
78
+ labels: ['Series A', 'Series B']
79
+ });
80
+ }
81
+ });
82
+
83
+ }
84
+
85
+
86
+ function displayAttemptsPerClientIpTable(pageNumber)
87
+ {
88
+ if(typeof pageNumber === 'undefined')
89
+ pageNumber = 1;
90
+
91
+ var tableBody = $('#ip-attempts-holder table tbody');
92
+ if (tableBody.length === 0)
93
+ return;
94
+
95
+ var ajaxData = {};
96
+ ajaxData['action'] = 'retrieveAttemptsPerClientIp';
97
+ ajaxData['pageNumber'] = pageNumber;
98
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
99
+
100
+
101
+ $.ajax({
102
+ type: "post",
103
+ cache: false,
104
+ dataType: "json",
105
+ url: GdbcAdmin.ajaxUrl,
106
+ data: ajaxData,
107
+ success: function (response) {
108
+
109
+ tableBody.empty();
110
+
111
+ var totalPages = 0;
112
+
113
+ $.each(response, function(index, attempt) {
114
+
115
+ var row = $('<tr></tr>');
116
+
117
+ row.append($('<td>' + attempt.Country + '</td>'));
118
+
119
+ var clientIpHtml = attempt.IsIpBlocked ? '<i class="glyphicon glyphicon-minus-sign icon-danger" style="margin-right: 5px"></i>' : '<i class="glyphicon glyphicon-eye-open" style="margin-right: 5px"></i>';
120
+
121
+
122
+ row.append($('<td>' + clientIpHtml + attempt.ClientIp + '</td>'));
123
+
124
+ row.append($('<td>' + attempt.Attempts + '</td>'));
125
+
126
+ var blockCell = $('<td></td>');
127
+ blockCell.append(createBlockIpButtonGroup(attempt.ClientIp, !attempt.IsIpBlocked));
128
+ row.append(blockCell);
129
+
130
+ tableBody.append(row);
131
+
132
+ totalPages = attempt.Pages;
133
+ })
134
+
135
+ $('#ip-attempts-holder div.module-pagination').empty();
136
+ $('#ip-attempts-holder div.module-pagination').append(showPagination(pageNumber, totalPages));
137
+
138
+ $('#ip-attempts-holder div.module-pagination li[class!="disabled"] a').on('click', function(){
139
+ var newPage = $(this).html();
140
+ if (newPage == '...' || newPage == pageNumber)
141
+ return;
142
+ else if (newPage == 'Next')
143
+ newPage = pageNumber + 1;
144
+ else if (newPage == 'Prev')
145
+ newPage = pageNumber - 1;
146
+
147
+ displayAttemptsPerClientIpTable(newPage);
148
+
149
+ return false;
150
+ });
151
+
152
+ }
153
+ });
154
+ }
155
+
156
+
157
+
158
+ function displayModuleTable(moduleId, pageNumber, $orderBy)
159
+ {
160
+ if (moduleId == null || moduleId < 1 || moduleId >= 100)
161
+ return;
162
+
163
+ var ajaxData = {};
164
+ ajaxData['action'] = 'retrieveDetailedAttemptsPerModule';
165
+ ajaxData['moduleId'] = moduleId;
166
+ ajaxData['pageNumber'] = pageNumber;
167
+ ajaxData['orderBy'] = $orderBy;
168
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
169
+
170
+ $.ajax({
171
+ type : "post",
172
+ cache: false,
173
+ dataType : "json",
174
+ url : GdbcAdmin.ajaxUrl,
175
+ data : ajaxData,
176
+ success: function(response) {
177
+
178
+ $.each(response, function(prop, moduleData) {
179
+ if ('PaginationInfo' == prop) {
180
+
181
+ if (moduleData == 0) {
182
+ $('#wid-id-' + moduleId + ' table tbody').html('<td style="text-align: center; padding-top: 15px">No records found</td>');
183
+ return;
184
+ }
185
+
186
+ $('#mp-' + moduleId).empty();
187
+ $('#mp-' + moduleId).append(showPagination(moduleData[0], moduleData[1]));
188
+ $('#wid-id-' + moduleId + ' .module-pagination li[class!="disabled"] a').on('click', function(){
189
+ var newPage = $(this).html();
190
+ if (newPage == '...' || newPage == pageNumber)
191
+ return;
192
+ else if (newPage == 'Next')
193
+ newPage = parseInt(pageNumber, 10) + 1;
194
+ else if (newPage == 'Prev')
195
+ newPage = parseInt(pageNumber, 10) - 1;
196
+
197
+ var modId = $(this).parent().parent().parent().attr('id').substr(3);
198
+
199
+ displayModuleTable(modId , newPage, '');
200
+
201
+ return false;
202
+ });
203
+
204
+ }
205
+
206
+ if ('ModuleDataHeader' == prop)
207
+ displayModuleTableHeader('wid-id-' + moduleId, moduleData);
208
+
209
+ if ('ModuleDataRows' == prop)
210
+ displayModuleTableBody('wid-id-' +moduleId, response);
211
+
212
+ });
213
+
214
+ }
215
+ });
216
+ }
217
+
218
+ function displayModuleTableHeader(containerId, dataValues)
219
+ {
220
+ var tableHeader = $('#' + containerId + ' table thead tr');
221
+ if (tableHeader.length == 0)
222
+ return;
223
+ tableHeader.empty();
224
+ $.each(dataValues, function(k,v){
225
+ var headerCell = $('<th>' + v + '</th>');
226
+ tableHeader.append(headerCell);
227
+ });
228
+ tableHeader.append('<th></th>');
229
+ }
230
+
231
+ function displayModuleTableBody(containerId, ajaxResponse)
232
+ {
233
+
234
+ var tableBody = $('#' + containerId + ' table tbody');
235
+ if (tableBody.length === 0)
236
+ return;
237
+
238
+ tableBody.empty();
239
+
240
+ $.each(ajaxResponse.ModuleDataRows, function (index, tableData) {
241
+ var row = $('<tr></tr>');
242
+ var clientIp = 'N/A';
243
+ $.each(ajaxResponse.ModuleDataHeader, function (key, header) {
244
+
245
+ if(typeof tableData[key] === 'undefined')
246
+ tableData[key] = 'N/A';
247
+
248
+
249
+ if(key === 'ClientIp') {
250
+ clientIp = tableData[key];
251
+ if(tableData.IsIpBlocked) {
252
+ tableData[key] = '<i class="glyphicon glyphicon-minus-sign icon-danger" style="margin-right: 5px"></i>' + tableData[key];
253
+ }
254
+ else{
255
+ tableData[key] = '<i class="glyphicon glyphicon-eye-open" style="margin-right: 5px"></i>' + tableData[key];
256
+ }
257
+ }
258
+ var cell = $('<td>' + tableData[key] + '</td>');
259
+
260
+ row.append(cell);
261
+
262
+ });
263
+
264
+ var blockCell = $('<td></td>');
265
+ blockCell.append(createBlockIpButtonGroup(clientIp, !tableData.IsIpBlocked));
266
+ row.append(blockCell);
267
+
268
+ tableBody.append(row);
269
+
270
+
271
+ });
272
+
273
+ }
274
+
275
+ function showPagination(pageNumber, totalPages)
276
+ {
277
+ var ulContainer = $('<ul class="pagination pagination-sm"></ul>');
278
+ var firstPageLi = $('<li><a>1</a></li>');
279
+ var lastPageLi = $('<li><a>' + totalPages + '</a>');
280
+ var previousLi = $('<li><a>Prev</a></li>');
281
+ var nextLi = $('<li><a>Next</a></li>');
282
+ var separatorLi1 = $('<li><a>...</a></li>');
283
+ var separatorLi2 = $('<li><a>...</a></li>');
284
+
285
+ var currentPageLi = $('<li class="active"><a>' + pageNumber + '</a></li>');
286
+
287
+ pageNumber = parseInt(pageNumber, 10);
288
+ totalPages = parseInt(totalPages, 10);
289
+
290
+ if (totalPages == 1) {
291
+ firstPageLi = null;
292
+ lastPageLi = null;
293
+ previousLi.addClass('disabled');
294
+ nextLi.addClass('disabled');
295
+ }
296
+ else if (pageNumber == 1) {
297
+ previousLi.addClass('disabled');
298
+ firstPageLi = null;
299
+ }
300
+ else if (pageNumber == totalPages) {
301
+ nextLi.addClass('disabled');
302
+ lastPageLi = null;
303
+ }
304
+
305
+ var numberOfAdditionalPages = 1; // = 2; two additional pages in the left, two additional pages in the right (if available)
306
+ var prevPagesArray = new Array();
307
+ var nextPagesArray = new Array();
308
+
309
+ for (var i = 0; i < numberOfAdditionalPages; i++ ){
310
+ if (pageNumber - i > 2)
311
+ prevPagesArray[i] = $('<li><a>' + (pageNumber - i - 1) + '</a></li>');
312
+
313
+ if ((pageNumber + i + 1) < totalPages)
314
+ nextPagesArray[i] = $('<li><a>' + (pageNumber + i + 1) + '</a></li>');
315
+ }
316
+
317
+ ulContainer.append(previousLi);
318
+
319
+ if (firstPageLi != null) {
320
+ ulContainer.append(firstPageLi);
321
+ if (prevPagesArray.length > 0)
322
+ {
323
+ var firstPageNumber = parseInt(firstPageLi.text(), 10);
324
+ var nextPageNumber = parseInt(prevPagesArray[0].text(), 10);
325
+ if ( (nextPageNumber - firstPageNumber) > 1)
326
+ ulContainer.append(separatorLi1);
327
+ }
328
+ }
329
+ for(var i = numberOfAdditionalPages-1; i >= 0; i--)
330
+ ulContainer.append(prevPagesArray[i]);
331
+
332
+ ulContainer.append(currentPageLi);
333
+
334
+ for(var i = 0; i < numberOfAdditionalPages; i++)
335
+ ulContainer.append(nextPagesArray[i]);
336
+
337
+ if (lastPageLi != null) {
338
+ if (nextPagesArray.length > 0)
339
+ {
340
+ var lastPageNumber = lastPageLi.text();
341
+ var prevPageNumber = nextPagesArray[nextPagesArray.length - 1].text();
342
+ if ((parseInt(lastPageNumber, 10) - parseInt(prevPageNumber, 10)) > 1)
343
+ ulContainer.append(separatorLi2);
344
+ }
345
+ ulContainer.append(lastPageLi);
346
+ }
347
+
348
+ ulContainer.append(nextLi);
349
+
350
+ return ulContainer;
351
+ }
352
+
353
+ function displayModulesChart()
354
+ {
355
+ var toggles = $("#modules-chart");
356
+ var target = $("#flot-container");
357
+
358
+ var data = [];
359
+
360
+ var options = {
361
+ grid : {
362
+ hoverable : true
363
+ },
364
+ tooltip : true,
365
+ tooltipOpts : {
366
+ content: '%s: %y',
367
+ //dateFormat: '%b %y',
368
+ defaultTheme : false
369
+ },
370
+ legend: {show: false},
371
+ xaxis : {
372
+ mode : "time"
373
+ },
374
+ yaxes : {
375
+ tickFormatter : function(val) {
376
+ return "$" + val;
377
+ },
378
+ max : 1200
379
+ }
380
+
381
+ };
382
+
383
+
384
+ var ajaxData = {};
385
+ ajaxData['action'] = 'retrieveDetailedAttemptsForChart';
386
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
387
+ $.ajax({
388
+ type : "post",
389
+ cache: false,
390
+ dataType : "json",
391
+ url : GdbcAdmin.ajaxUrl,
392
+ data : ajaxData,
393
+ success: function(response){
394
+
395
+ $.each(response, function(prop, modulesData){
396
+ if (prop === 'ModulesDescriptionArray' && $("#flot-container").length) {
397
+ var i = 0;
398
+ $.each(modulesData, function(key, value){
399
+ var label = $('<label class="checkbox" for="gra-' + i + '"></label>');
400
+ var input = $('<input type="checkbox" checked="checked" id="gra-' + i + '" name="gra-' + i + '">');
401
+ var italic = $('<i></i>');
402
+ label.append(input, italic, value);
403
+ $(".inline-group").append(label);
404
+ i++;
405
+ });
406
+ } else if (prop === 'ModulesAttemptsArray' && $("#flot-container").length) {
407
+
408
+ var colorArray = ['#931313', '#638167', '#65596B', '#60747C', '#B09B5B', '#3276B1', '#C0C0C0', '#FDDC9A', '#575FB5', '#57B599', '#46CC41', '#C93A24'];
409
+ var i = 0;
410
+ $.each(modulesData, function(key, value){
411
+ var $graphObj = {
412
+ label : '%x - ' + $('#gra-'+i).parent().text() + ' attempts',
413
+ data : value,
414
+ color : colorArray[i],
415
+ lines : {
416
+ show : true,
417
+ lineWidth : 3
418
+ },
419
+ points : {
420
+ show : true
421
+ }
422
+ };
423
+ data[i] = $graphObj;
424
+ i++;
425
+ });
426
+ }
427
+
428
+ });
429
+ toggles.find(':checkbox').on('change', function() {
430
+ plotNow();
431
+ });
432
+ plotNow()
433
+ }
434
+ });
435
+
436
+
437
+
438
+ var plot2 = null;
439
+
440
+ function plotNow() {
441
+ var d = [];
442
+ toggles.find(':checkbox').each(function() {
443
+ if ($(this).is(':checked')) {
444
+ d.push(data[$(this).attr("name").substr(4, 1)]);
445
+ }
446
+ });
447
+ if (d.length > 0) {
448
+ if (plot2) {
449
+ plot2.setData(d);
450
+ plot2.draw();
451
+ } else {
452
+ plot2 = $.plot(target, d, options);
453
+ }
454
+ }
455
+
456
+ }
457
+ }
458
+
459
+ function displayDashBoardAttemptsChart() {
460
+ var ajaxData = {};
461
+ ajaxData['action'] = 'retrieveInitialDashboardData';
462
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
463
+ $.ajax({
464
+ type : "post",
465
+ cache: false,
466
+ dataType : "json",
467
+ url : GdbcAdmin.ajaxUrl,
468
+ data : ajaxData,
469
+ success: function(response){
470
+
471
+ $.each(response, function(prop, chartData){
472
+ if (prop === 'ChartDataArray' && $("#chart-container").length) {
473
+ var chartArray = [];
474
+ var attemptsCounter = 0;
475
+ $.each(chartData, function(key, value){
476
+ chartArray.push([parseInt(key), value]);
477
+ attemptsCounter += parseInt(value);
478
+ });
479
+ displayAttemptsChart("#chart-container", chartArray);
480
+ if(attemptsCounter > 9) {
481
+ $("a.btn-rate-gdbc").css('display', 'inline-block');
482
+ }
483
+ }
484
+ });
485
+ }
486
+ });
487
+ }
488
+
489
+ function displayAttemptsChart(placeHolderId, data) {
490
+
491
+ console.log(data);
492
+
493
+ // var data = [[1304301600*1000, 20], [1304388000*1000, 30], [1304474400*1000, 40], [1304553600*1000, 10], [1304640000*1000, 23], [1304726400*1000, 16] ];
494
+
495
+
496
+ var options = {
497
+ xaxis : {
498
+ mode : "time",
499
+ tickLength : 5
500
+ },
501
+ yaxis : {
502
+ mode : "number",
503
+ tickFormatter: suffixFormatter
504
+ },
505
+ series : {
506
+ lines : {
507
+ show : true,
508
+ lineWidth : 1,
509
+ fill : true,
510
+ fillColor : {
511
+ colors : [{
512
+ opacity : 0.1
513
+ }, {
514
+ opacity : 0.15
515
+ }]
516
+ }
517
+ },
518
+ shadowSize : 0,
519
+ points : { show: false, fill: true }
520
+ },
521
+ selection : {
522
+ mode : "x"
523
+ },
524
+ grid : {
525
+ hoverable : true,
526
+ clickable : true,
527
+ tickColor : "#efefef",
528
+ borderWidth : 0,
529
+ borderColor : "#efefef"
530
+ },
531
+ tooltip:{
532
+ show:true,
533
+ content : '<div id = "flotTip"><p>%y attempts </p><p><b>%x</b></p>',
534
+ xDateFormat: "%b %d, %Y",
535
+ shifts: {
536
+ x: 10,
537
+ y: 10
538
+ },
539
+ defaultTheme: false
540
+ },
541
+ //tooltip : true,
542
+ //tooltipOpts : {
543
+ // content : "<span>%y</span> attempts on <b>%x</b>",
544
+ // dateFormat : "%b %0d, %y",
545
+ // defaultTheme : false
546
+ //},
547
+ colors : ["#6595b4"]
548
+ };
549
+
550
+ $.plot($(placeHolderId), [data], options);
551
+ }
552
+
553
+ function displayLatestAttemptsTable()
554
+ {
555
+ if ($('#latest-attempts-table').length == 0)
556
+ return;
557
+
558
+ var ajaxData = {};
559
+ ajaxData['action'] = 'retrieveLatestAttemptsTable';
560
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
561
+ var dataHeaderArr = null;
562
+ $.ajax({
563
+ type : "post",
564
+ cache: false,
565
+ dataType : "json",
566
+ url : GdbcAdmin.ajaxUrl,
567
+ data : ajaxData,
568
+ success: function(response){
569
+
570
+ if(response.success !== true)
571
+ return;
572
+
573
+ $('#latest-attempts-table thead tr').empty();
574
+
575
+ $.each(response.data.TableHeader, function (key, header) {
576
+ var cell = $('<th>' + header + '</th>');
577
+ $('#latest-attempts-table thead tr').append(cell);
578
+ });
579
+
580
+ $('#latest-attempts-table thead tr').append($('<th></th>'));
581
+
582
+ $('#latest-attempts-table tbody').empty();
583
+ $.each(response.data.TableData, function (index, tableData) {
584
+ var row = $('<tr></tr>');
585
+ var clientIp = 'N/A';
586
+ $.each(response.data.TableHeader, function (key, header) {
587
+
588
+ if(typeof tableData[key] === 'undefined')
589
+ tableData[key] = 'N/A';
590
+
591
+ if(key === 'ClientIp') {
592
+ clientIp = tableData[key];
593
+
594
+ if(tableData.IsIpBlocked) {
595
+ tableData[key] = '<i class="glyphicon glyphicon-minus-sign icon-danger" style="margin-right: 5px"></i>' + tableData[key];
596
+ }
597
+ else{
598
+ tableData[key] = '<i class="glyphicon glyphicon-eye-open" style="margin-right: 5px"></i>' + tableData[key];
599
+ }
600
+ }
601
+ var cell = $('<td>' + tableData[key] + '</td>');
602
+ row.append(cell);
603
+ });
604
+
605
+ var blockCell = $('<td></td>');
606
+ blockCell.append(createBlockIpButtonGroup(clientIp, !tableData.IsIpBlocked));
607
+ row.append(blockCell);
608
+
609
+ $('#latest-attempts-table tbody').append(row);
610
+
611
+ });
612
+
613
+ }
614
+ });
615
+ }
616
+
617
+ function displayLocationsOnMap()
618
+ {
619
+ if ($('#vector-map').length == 0)
620
+ return;
621
+
622
+ $('#vector-map').vectorMap({
623
+ map : 'world_mill_en',
624
+ backgroundColor : '#fff',
625
+ regionStyle : {
626
+ initial : {
627
+ fill : '#c4c4c4'
628
+ },
629
+ hover : {
630
+ "fill-opacity" : 1
631
+ }
632
+ },
633
+ series : {
634
+ regions : [{
635
+ values : attemptsCountryArray,
636
+ scale : ['#85a8b6', '#4d7686'],
637
+ normalizeFunction : 'polynomial'
638
+ }]
639
+ },
640
+
641
+ onRegionLabelShow : function(e, el, code) {
642
+ if ( typeof attemptsCountryArray[code] == 'undefined') {
643
+ e.preventDefault();
644
+ } else {
645
+ var countryLbl = attemptsCountryArray[code];
646
+ var attemptLbl = ' total attempts';
647
+ if (countryLbl == 1)
648
+ attemptLbl = ' attempt';
649
+ el.html(el.html() + ': ' + countryLbl + attemptLbl);
650
+ }
651
+ }
652
+ });
653
+ }
654
+
655
+
656
+ function displayTotalAttemptsPerModule()
657
+ {
658
+ if ($('#gdbc-pie-chart').length == 0)
659
+ return;
660
+
661
+ var ajaxData = {};
662
+ ajaxData['action'] = 'retrieveTotalAttemptsPerModule';
663
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
664
+ $.ajax({
665
+ type : "post",
666
+ cache: false,
667
+ dataType : "json",
668
+ url : GdbcAdmin.ajaxUrl,
669
+ data : ajaxData,
670
+ success: function(response) {
671
+
672
+ $.each(response, function(prop, moduleData) {
673
+ if ('TopAttemptsArrayPerModule' == prop) {
674
+ $('#gdbc-pie-chart table tbody').empty();
675
+ if (moduleData == 0)
676
+ $('#gdbc-pie-chart table tbody').append($('<tr><td colspan="4" class="text-center">No records found</tr>'));
677
+ else {
678
+
679
+ $.each(moduleData, function (k, v) {
680
+ var tableRow = $('<tr></tr>');
681
+ tableRow.append($('<td>' + v.label + '</td>'));
682
+ tableRow.append($('<td>' + v.value + '</td>'));
683
+ $('#gdbc-pie-chart table tbody').append(tableRow);
684
+ });
685
+
686
+ if ($('#gdbc-stats').length == 0)
687
+ return;
688
+
689
+ Morris.Donut({
690
+ element: 'gdbc-stats',
691
+ data: moduleData,
692
+ formatter: function (x, data) {
693
+ return data.percent + "%"
694
+ }
695
+ });
696
+
697
+ }
698
+ }
699
+ });
700
+ }
701
+ });
702
+ }
703
+
704
+
705
+ function createBlockIpButtonGroup(ip, shouldBlock)
706
+ {
707
+ var group = $('<div class="btn-group display-inline pull-right text-align-left hidden-tablet"></div>');
708
+ group.append(createBlockLinkButton());
709
+ group.append(createBlockLinkOptions(ip, shouldBlock));
710
+ return group;
711
+ }
712
+
713
+ function createBlockLinkButton()
714
+ {
715
+ return $('<button data-toggle="dropdown" class="btn btn-xs btn-default dropdown-toggle">' +
716
+ '<i class="glyphicon glyphicon-remove-circle icon-primary"></i>' +
717
+ '</button>');
718
+ }
719
+
720
+
721
+ function manageIp(ip, shouldBlock, clickedElement)
722
+ {
723
+ var ajaxData = {};
724
+ ajaxData['action'] = 'manageClientIpAddress';
725
+ ajaxData['clientIp'] = ip;
726
+ ajaxData['shouldBlock'] = shouldBlock;
727
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
728
+ jQuery.ajax({
729
+ type : "post",
730
+ cache: false,
731
+ dataType : "json",
732
+ url : GdbcAdmin.ajaxUrl,
733
+ data : ajaxData,
734
+ success: function(response) {
735
+ if(!response.success){
736
+ return;
737
+ }
738
+
739
+ updatePageIpIcons(ip, shouldBlock);
740
+
741
+ var cell = clickedElement.closest('td');
742
+ cell.empty();
743
+ cell.append(createBlockIpButtonGroup(ip, (shouldBlock == 0) ? 1 : 0));
744
+ }
745
+ });
746
+
747
+ }
748
+
749
+ function createBlockLinkOptions(ip, shouldBlock)
750
+ {
751
+ var blockIpLink = '<a href="javascript:void(0);" class="block-' +ip+ '"> <i class="glyphicon glyphicon-remove icon-danger" style = "margin-right: 5px"></i>Block Ip Address</a>';
752
+ var unblockIpLink = '<a href="javascript:void(0);" class="unblock-' +ip+ '"> <i class="glyphicon glyphicon-ok icon-success" style = "margin-right: 5px"></i>UnBlock Ip Address</a>';
753
+
754
+ var insertLink = '<li> ' + (shouldBlock ? blockIpLink : unblockIpLink) + ' <li>';
755
+
756
+ var blockMenu = $('<ul class="dropdown-menu dropdown-menu-xs pull-right manage-ip-action-holder">' + insertLink +
757
+ '<li class="divider"><li>' +
758
+ '<li> <a href="javascript:void(0);">Cancel</a> <li>' +
759
+ '</ul>');
760
+
761
+ blockMenu.on('click', 'a', function(){
762
+ var classAttr = $(this).attr('class');
763
+ if (!classAttr)
764
+ return void(0);
765
+
766
+ if (classAttr.lastIndexOf('block-') === 0) {
767
+ var ip = classAttr.substr(6);
768
+ manageIp(ip, 1, $(this));
769
+
770
+ } else if (classAttr.lastIndexOf('unblock-') === 0) {
771
+ var ip = classAttr.substr(8);
772
+ manageIp(ip, 0, $(this));
773
+ }
774
+
775
+ });
776
+
777
+ return blockMenu;
778
+ }
779
+
780
+
781
+
782
+ function updatePageIpIcons(ip, shouldBlock)
783
+ {
784
+ $.each($("table i.glyphicon:first-child"), function(){
785
+ var cellIp = $.trim($(this).parent().text());
786
+ if (cellIp == ip){
787
+ if (shouldBlock) {
788
+ $(this).attr("class", "glyphicon glyphicon-minus-sign icon-danger");
789
+ }
790
+ else {
791
+ $(this).attr("class", "glyphicon glyphicon-eye-open");
792
+ }
793
+ }
794
+ });
795
+ }
796
+
797
+ // Util Functions Section
798
+ function suffixFormatter(val)
799
+ {
800
+ return Math.round(val);
801
+ }
802
+
803
+
804
+ $('#gdbc-modal-holder').on('show.bs.modal', function (event) {
805
+
806
+ $(".modal-body").hide();
807
+ $(".modal-dialog").append("<div class = 'report-spinner'></div>");
808
+
809
+ var clickedButton = $(event.relatedTarget)
810
+ var attemptId = clickedButton.data('attempt');
811
+ var modalDialog = $(this);
812
+
813
+ var ajaxData = {};
814
+ ajaxData['action'] = 'retrieveFormattedBlockedContent';
815
+ ajaxData['attemptId'] = attemptId;
816
+ ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
817
+
818
+ modalDialog.find('.modal-body').load( GdbcAdmin.ajaxUrl, ajaxData, function() {
819
+ $('div').removeClass('report-spinner');
820
+ $(".modal-body").show();
821
+ });
822
+ })
823
+
824
+ //$('#gdbc-modal-holder').on('hidden.bs.modal', function () {
825
+ // $(this).find('.modal-body').empty();
826
+ //});
827
+
828
+ });
assets/admin/scripts/jquery-flot-tooltip.js ADDED
@@ -0,0 +1,571 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jquery.flot.tooltip
3
+ *
4
+ * description: easy-to-use tooltips for Flot charts
5
+ * version: 0.8.5
6
+ * authors: Krzysztof Urbas @krzysu [myviews.pl],Evan Steinkerchner @Roundaround
7
+ * website: https://github.com/krzysu/flot.tooltip
8
+ *
9
+ * build on 2015-06-12
10
+ * released under MIT License, 2012
11
+ */
12
+ (function ($) {
13
+ // plugin options, default values
14
+ var defaultOptions = {
15
+ tooltip: {
16
+ show: false,
17
+ cssClass: "flotTip",
18
+ content: "%s | X: %x | Y: %y",
19
+ // allowed templates are:
20
+ // %s -> series label,
21
+ // %c -> series color,
22
+ // %lx -> x axis label (requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels),
23
+ // %ly -> y axis label (requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels),
24
+ // %x -> X value,
25
+ // %y -> Y value,
26
+ // %x.2 -> precision of X value,
27
+ // %p -> percent
28
+ // %n -> value (not percent) of pie chart
29
+ xDateFormat: null,
30
+ yDateFormat: null,
31
+ monthNames: null,
32
+ dayNames: null,
33
+ shifts: {
34
+ x: 10,
35
+ y: 20
36
+ },
37
+ defaultTheme: true,
38
+ snap: true,
39
+ lines: false,
40
+
41
+ // callbacks
42
+ onHover: function (flotItem, $tooltipEl) {},
43
+
44
+ $compat: false
45
+ }
46
+ };
47
+
48
+ // dummy default options object for legacy code (<0.8.5) - is deleted later
49
+ defaultOptions.tooltipOpts = defaultOptions.tooltip;
50
+
51
+ // object
52
+ var FlotTooltip = function (plot) {
53
+ // variables
54
+ this.tipPosition = {x: 0, y: 0};
55
+
56
+ this.init(plot);
57
+ };
58
+
59
+ // main plugin function
60
+ FlotTooltip.prototype.init = function (plot) {
61
+ var that = this;
62
+
63
+ // detect other flot plugins
64
+ var plotPluginsLength = $.plot.plugins.length;
65
+ this.plotPlugins = [];
66
+
67
+ if (plotPluginsLength) {
68
+ for (var p = 0; p < plotPluginsLength; p++) {
69
+ this.plotPlugins.push($.plot.plugins[p].name);
70
+ }
71
+ }
72
+
73
+ plot.hooks.bindEvents.push(function (plot, eventHolder) {
74
+
75
+ // get plot options
76
+ that.plotOptions = plot.getOptions();
77
+
78
+ // for legacy (<0.8.5) implementations
79
+ if (typeof(that.plotOptions.tooltip) === 'boolean') {
80
+ that.plotOptions.tooltipOpts.show = that.plotOptions.tooltip;
81
+ that.plotOptions.tooltip = that.plotOptions.tooltipOpts;
82
+ delete that.plotOptions.tooltipOpts;
83
+ }
84
+
85
+ // if not enabled return
86
+ if (that.plotOptions.tooltip.show === false || typeof that.plotOptions.tooltip.show === 'undefined') return;
87
+
88
+ // shortcut to access tooltip options
89
+ that.tooltipOptions = that.plotOptions.tooltip;
90
+
91
+ if (that.tooltipOptions.$compat) {
92
+ that.wfunc = 'width';
93
+ that.hfunc = 'height';
94
+ } else {
95
+ that.wfunc = 'innerWidth';
96
+ that.hfunc = 'innerHeight';
97
+ }
98
+
99
+ // create tooltip DOM element
100
+ var $tip = that.getDomElement();
101
+
102
+ // bind event
103
+ $( plot.getPlaceholder() ).bind("plothover", plothover);
104
+
105
+ $(eventHolder).bind('mousemove', mouseMove);
106
+ });
107
+
108
+ plot.hooks.shutdown.push(function (plot, eventHolder){
109
+ $(plot.getPlaceholder()).unbind("plothover", plothover);
110
+ $(eventHolder).unbind("mousemove", mouseMove);
111
+ });
112
+
113
+ function mouseMove(e){
114
+ var pos = {};
115
+ pos.x = e.pageX;
116
+ pos.y = e.pageY;
117
+ plot.setTooltipPosition(pos);
118
+ }
119
+
120
+ function plothover(event, pos, item) {
121
+ // Simple distance formula.
122
+ var lineDistance = function (p1x, p1y, p2x, p2y) {
123
+ return Math.sqrt((p2x - p1x) * (p2x - p1x) + (p2y - p1y) * (p2y - p1y));
124
+ };
125
+
126
+ // Here is some voodoo magic for determining the distance to a line form a given point {x, y}.
127
+ var dotLineLength = function (x, y, x0, y0, x1, y1, o) {
128
+ if (o && !(o =
129
+ function (x, y, x0, y0, x1, y1) {
130
+ if (typeof x0 !== 'undefined') return { x: x0, y: y };
131
+ else if (typeof y0 !== 'undefined') return { x: x, y: y0 };
132
+
133
+ var left,
134
+ tg = -1 / ((y1 - y0) / (x1 - x0));
135
+
136
+ return {
137
+ x: left = (x1 * (x * tg - y + y0) + x0 * (x * -tg + y - y1)) / (tg * (x1 - x0) + y0 - y1),
138
+ y: tg * left - tg * x + y
139
+ };
140
+ } (x, y, x0, y0, x1, y1),
141
+ o.x >= Math.min(x0, x1) && o.x <= Math.max(x0, x1) && o.y >= Math.min(y0, y1) && o.y <= Math.max(y0, y1))
142
+ ) {
143
+ var l1 = lineDistance(x, y, x0, y0), l2 = lineDistance(x, y, x1, y1);
144
+ return l1 > l2 ? l2 : l1;
145
+ } else {
146
+ var a = y0 - y1, b = x1 - x0, c = x0 * y1 - y0 * x1;
147
+ return Math.abs(a * x + b * y + c) / Math.sqrt(a * a + b * b);
148
+ }
149
+ };
150
+
151
+ if (item) {
152
+ plot.showTooltip(item, that.tooltipOptions.snap ? item : pos);
153
+ } else if (that.plotOptions.series.lines.show && that.tooltipOptions.lines === true) {
154
+ var maxDistance = that.plotOptions.grid.mouseActiveRadius;
155
+
156
+ var closestTrace = {
157
+ distance: maxDistance + 1
158
+ };
159
+
160
+ var ttPos = pos;
161
+
162
+ $.each(plot.getData(), function (i, series) {
163
+ var xBeforeIndex = 0,
164
+ xAfterIndex = -1;
165
+
166
+ // Our search here assumes our data is sorted via the x-axis.
167
+ // TODO: Improve efficiency somehow - search smaller sets of data.
168
+ for (var j = 1; j < series.data.length; j++) {
169
+ if (series.data[j - 1][0] <= pos.x && series.data[j][0] >= pos.x) {
170
+ xBeforeIndex = j - 1;
171
+ xAfterIndex = j;
172
+ }
173
+ }
174
+
175
+ if (xAfterIndex === -1) {
176
+ plot.hideTooltip();
177
+ return;
178
+ }
179
+
180
+ var pointPrev = { x: series.data[xBeforeIndex][0], y: series.data[xBeforeIndex][1] },
181
+ pointNext = { x: series.data[xAfterIndex][0], y: series.data[xAfterIndex][1] };
182
+
183
+ var distToLine = dotLineLength(series.xaxis.p2c(pos.x), series.yaxis.p2c(pos.y), series.xaxis.p2c(pointPrev.x),
184
+ series.yaxis.p2c(pointPrev.y), series.xaxis.p2c(pointNext.x), series.yaxis.p2c(pointNext.y), false);
185
+
186
+ if (distToLine < closestTrace.distance) {
187
+
188
+ var closestIndex = lineDistance(pointPrev.x, pointPrev.y, pos.x, pos.y) <
189
+ lineDistance(pos.x, pos.y, pointNext.x, pointNext.y) ? xBeforeIndex : xAfterIndex;
190
+
191
+ var pointSize = series.datapoints.pointsize;
192
+
193
+ // Calculate the point on the line vertically closest to our cursor.
194
+ var pointOnLine = [
195
+ pos.x,
196
+ pointPrev.y + ((pointNext.y - pointPrev.y) * ((pos.x - pointPrev.x) / (pointNext.x - pointPrev.x)))
197
+ ];
198
+
199
+ var item = {
200
+ datapoint: pointOnLine,
201
+ dataIndex: closestIndex,
202
+ series: series,
203
+ seriesIndex: i
204
+ };
205
+
206
+ closestTrace = {
207
+ distance: distToLine,
208
+ item: item
209
+ };
210
+
211
+ if (that.tooltipOptions.snap) {
212
+ ttPos = {
213
+ pageX: series.xaxis.p2c(pointOnLine[0]),
214
+ pageY: series.yaxis.p2c(pointOnLine[1])
215
+ };
216
+ }
217
+ }
218
+ });
219
+
220
+ if (closestTrace.distance < maxDistance + 1)
221
+ plot.showTooltip(closestTrace.item, ttPos);
222
+ else
223
+ plot.hideTooltip();
224
+ } else {
225
+ plot.hideTooltip();
226
+ }
227
+ }
228
+
229
+ // Quick little function for setting the tooltip position.
230
+ plot.setTooltipPosition = function (pos) {
231
+ var $tip = that.getDomElement();
232
+
233
+ var totalTipWidth = $tip.outerWidth() + that.tooltipOptions.shifts.x;
234
+ var totalTipHeight = $tip.outerHeight() + that.tooltipOptions.shifts.y;
235
+ if ((pos.x - $(window).scrollLeft()) > ($(window)[that.wfunc]() - totalTipWidth)) {
236
+ pos.x -= totalTipWidth;
237
+ }
238
+ if ((pos.y - $(window).scrollTop()) > ($(window)[that.hfunc]() - totalTipHeight)) {
239
+ pos.y -= totalTipHeight;
240
+ }
241
+
242
+ /*
243
+ The section applies the new positioning ONLY if pos.x and pos.y
244
+ are numbers. If they are undefined or not a number, use the last
245
+ known numerical position. This hack fixes a bug that kept pie
246
+ charts from keeping their tooltip positioning.
247
+ */
248
+
249
+ if (isNaN(pos.x)) {
250
+ that.tipPosition.x = that.tipPosition.xPrev;
251
+ }
252
+ else {
253
+ that.tipPosition.x = pos.x;
254
+ that.tipPosition.xPrev = pos.x;
255
+ }
256
+ if (isNaN(pos.y)) {
257
+ that.tipPosition.y = that.tipPosition.yPrev;
258
+ }
259
+ else {
260
+ that.tipPosition.y = pos.y;
261
+ that.tipPosition.yPrev = pos.y;
262
+ }
263
+
264
+ };
265
+
266
+ // Quick little function for showing the tooltip.
267
+ plot.showTooltip = function (target, position, targetPosition) {
268
+ var $tip = that.getDomElement();
269
+
270
+ // convert tooltip content template to real tipText
271
+ var tipText = that.stringFormat(that.tooltipOptions.content, target);
272
+ if (tipText === '')
273
+ return;
274
+
275
+ $tip.html(tipText);
276
+ plot.setTooltipPosition({ x: position.pageX, y: position.pageY });
277
+ $tip.css({
278
+ left: that.tipPosition.x + that.tooltipOptions.shifts.x,
279
+ top: that.tipPosition.y + that.tooltipOptions.shifts.y
280
+ }).show();
281
+
282
+ // run callback
283
+ if (typeof that.tooltipOptions.onHover === 'function') {
284
+ that.tooltipOptions.onHover(target, $tip);
285
+ }
286
+ };
287
+
288
+ // Quick little function for hiding the tooltip.
289
+ plot.hideTooltip = function () {
290
+ that.getDomElement().hide().html('');
291
+ };
292
+ };
293
+
294
+ /**
295
+ * get or create tooltip DOM element
296
+ * @return jQuery object
297
+ */
298
+ FlotTooltip.prototype.getDomElement = function () {
299
+ var $tip = $('.' + this.tooltipOptions.cssClass);
300
+
301
+ if( $tip.length === 0 ){
302
+ $tip = $('<div />').addClass(this.tooltipOptions.cssClass);
303
+ $tip.appendTo('body').hide().css({position: 'absolute'});
304
+
305
+ if(this.tooltipOptions.defaultTheme) {
306
+ $tip.css({
307
+ 'background': '#fff',
308
+ 'z-index': '1040',
309
+ 'padding': '0.4em 0.6em',
310
+ 'border-radius': '0.5em',
311
+ 'font-size': '0.8em',
312
+ 'border': '1px solid #111',
313
+ 'display': 'none',
314
+ 'white-space': 'nowrap'
315
+ });
316
+ }
317
+ }
318
+
319
+ return $tip;
320
+ };
321
+
322
+ /**
323
+ * core function, create tooltip content
324
+ * @param {string} content - template with tooltip content
325
+ * @param {object} item - Flot item
326
+ * @return {string} real tooltip content for current item
327
+ */
328
+ FlotTooltip.prototype.stringFormat = function (content, item) {
329
+ var percentPattern = /%p\.{0,1}(\d{0,})/;
330
+ var seriesPattern = /%s/;
331
+ var colorPattern = /%c/;
332
+ var xLabelPattern = /%lx/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded
333
+ var yLabelPattern = /%ly/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded
334
+ var xPattern = /%x\.{0,1}(\d{0,})/;
335
+ var yPattern = /%y\.{0,1}(\d{0,})/;
336
+ var xPatternWithoutPrecision = "%x";
337
+ var yPatternWithoutPrecision = "%y";
338
+ var customTextPattern = "%ct";
339
+ var nPiePattern = "%n";
340
+
341
+ var x, y, customText, p, n;
342
+
343
+ // for threshold plugin we need to read data from different place
344
+ if (typeof item.series.threshold !== "undefined") {
345
+ x = item.datapoint[0];
346
+ y = item.datapoint[1];
347
+ customText = item.datapoint[2];
348
+ }
349
+
350
+ // for CurvedLines plugin we need to read data from different place
351
+ else if (typeof item.series.curvedLines !== "undefined") {
352
+ x = item.datapoint[0];
353
+ y = item.datapoint[1];
354
+ }
355
+
356
+ else if (typeof item.series.lines !== "undefined" && item.series.lines.steps) {
357
+ x = item.series.datapoints.points[item.dataIndex * 2];
358
+ y = item.series.datapoints.points[item.dataIndex * 2 + 1];
359
+ // TODO: where to find custom text in this variant?
360
+ customText = "";
361
+ } else {
362
+ x = item.series.data[item.dataIndex][0];
363
+ y = item.series.data[item.dataIndex][1];
364
+ customText = item.series.data[item.dataIndex][2];
365
+ }
366
+
367
+ // I think this is only in case of threshold plugin
368
+ if (item.series.label === null && item.series.originSeries) {
369
+ item.series.label = item.series.originSeries.label;
370
+ }
371
+
372
+ // if it is a function callback get the content string
373
+ if (typeof(content) === 'function') {
374
+ content = content(item.series.label, x, y, item);
375
+ }
376
+
377
+ // the case where the passed content is equal to false
378
+ if (typeof(content) === 'boolean' && !content) {
379
+ return '';
380
+ }
381
+
382
+ /* replacement of %ct and other multi-character templates must
383
+ precede the replacement of single-character templates
384
+ to avoid conflict between '%c' and '%ct' and similar substrings
385
+ */
386
+ if (customText)
387
+ content = content.replace(customTextPattern, customText);
388
+
389
+ // percent match for pie charts and stacked percent
390
+ if (typeof (item.series.percent) !== 'undefined') {
391
+ p = item.series.percent;
392
+ } else if (typeof (item.series.percents) !== 'undefined') {
393
+ p = item.series.percents[item.dataIndex];
394
+ }
395
+ if (typeof p === 'number') {
396
+ content = this.adjustValPrecision(percentPattern, content, p);
397
+ }
398
+
399
+ // replace %n with number of items represented by slice in pie charts
400
+ if (item.series.hasOwnProperty('pie')) {
401
+ if (typeof (item.series.data[0][1] !== 'undefined')) {
402
+ n = item.series.data[0][1];
403
+ }
404
+ }
405
+ if (typeof n === 'number') {
406
+ content = content.replace(nPiePattern, n);
407
+ }
408
+
409
+ // series match
410
+ if (typeof(item.series.label) !== 'undefined') {
411
+ content = content.replace(seriesPattern, item.series.label);
412
+ } else {
413
+ //remove %s if label is undefined
414
+ content = content.replace(seriesPattern, "");
415
+ }
416
+
417
+ // color match
418
+ if (typeof(item.series.color) !== 'undefined') {
419
+ content = content.replace(colorPattern, item.series.color);
420
+ } else {
421
+ //remove %s if color is undefined
422
+ content = content.replace(colorPattern, "");
423
+ }
424
+
425
+ // x axis label match
426
+ if (this.hasAxisLabel('xaxis', item)) {
427
+ content = content.replace(xLabelPattern, item.series.xaxis.options.axisLabel);
428
+ } else {
429
+ //remove %lx if axis label is undefined or axislabels plugin not present
430
+ content = content.replace(xLabelPattern, "");
431
+ }
432
+
433
+ // y axis label match
434
+ if (this.hasAxisLabel('yaxis', item)) {
435
+ content = content.replace(yLabelPattern, item.series.yaxis.options.axisLabel);
436
+ } else {
437
+ //remove %ly if axis label is undefined or axislabels plugin not present
438
+ content = content.replace(yLabelPattern, "");
439
+ }
440
+
441
+ // time mode axes with custom dateFormat
442
+ if (this.isTimeMode('xaxis', item) && this.isXDateFormat(item)) {
443
+ content = content.replace(xPattern, this.timestampToDate(x, this.tooltipOptions.xDateFormat, item.series.xaxis.options));
444
+ }
445
+ if (this.isTimeMode('yaxis', item) && this.isYDateFormat(item)) {
446
+ content = content.replace(yPattern, this.timestampToDate(y, this.tooltipOptions.yDateFormat, item.series.yaxis.options));
447
+ }
448
+
449
+ // set precision if defined
450
+ if (typeof x === 'number') {
451
+ content = this.adjustValPrecision(xPattern, content, x);
452
+ }
453
+ if (typeof y === 'number') {
454
+ content = this.adjustValPrecision(yPattern, content, y);
455
+ }
456
+
457
+ // change x from number to given label, if given
458
+ if (typeof item.series.xaxis.ticks !== 'undefined') {
459
+
460
+ var ticks;
461
+ if (this.hasRotatedXAxisTicks(item)) {
462
+ // xaxis.ticks will be an empty array if tickRotor is being used, but the values are available in rotatedTicks
463
+ ticks = 'rotatedTicks';
464
+ } else {
465
+ ticks = 'ticks';
466
+ }
467
+
468
+ // see https://github.com/krzysu/flot.tooltip/issues/65
469
+ var tickIndex = item.dataIndex + item.seriesIndex;
470
+
471
+ for (var xIndex in item.series.xaxis[ticks]) {
472
+ if (item.series.xaxis[ticks].hasOwnProperty(tickIndex) && !this.isTimeMode('xaxis', item)) {
473
+ var valueX = (this.isCategoriesMode('xaxis', item)) ? item.series.xaxis[ticks][tickIndex].label : item.series.xaxis[ticks][tickIndex].v;
474
+ if (valueX === x) {
475
+ content = content.replace(xPattern, item.series.xaxis[ticks][tickIndex].label);
476
+ }
477
+ }
478
+ }
479
+ }
480
+
481
+ // change y from number to given label, if given
482
+ if (typeof item.series.yaxis.ticks !== 'undefined') {
483
+ for (var yIndex in item.series.yaxis.ticks) {
484
+ if (item.series.yaxis.ticks.hasOwnProperty(yIndex)) {
485
+ var valueY = (this.isCategoriesMode('yaxis', item)) ? item.series.yaxis.ticks[yIndex].label : item.series.yaxis.ticks[yIndex].v;
486
+ if (valueY === y) {
487
+ content = content.replace(yPattern, item.series.yaxis.ticks[yIndex].label);
488
+ }
489
+ }
490
+ }
491
+ }
492
+
493
+ // if no value customization, use tickFormatter by default
494
+ if (typeof item.series.xaxis.tickFormatter !== 'undefined') {
495
+ //escape dollar
496
+ content = content.replace(xPatternWithoutPrecision, item.series.xaxis.tickFormatter(x, item.series.xaxis).replace(/\$/g, '$$'));
497
+ }
498
+ if (typeof item.series.yaxis.tickFormatter !== 'undefined') {
499
+ //escape dollar
500
+ content = content.replace(yPatternWithoutPrecision, item.series.yaxis.tickFormatter(y, item.series.yaxis).replace(/\$/g, '$$'));
501
+ }
502
+
503
+ return content;
504
+ };
505
+
506
+ // helpers just for readability
507
+ FlotTooltip.prototype.isTimeMode = function (axisName, item) {
508
+ return (typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'time');
509
+ };
510
+
511
+ FlotTooltip.prototype.isXDateFormat = function (item) {
512
+ return (typeof this.tooltipOptions.xDateFormat !== 'undefined' && this.tooltipOptions.xDateFormat !== null);
513
+ };
514
+
515
+ FlotTooltip.prototype.isYDateFormat = function (item) {
516
+ return (typeof this.tooltipOptions.yDateFormat !== 'undefined' && this.tooltipOptions.yDateFormat !== null);
517
+ };
518
+
519
+ FlotTooltip.prototype.isCategoriesMode = function (axisName, item) {
520
+ return (typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'categories');
521
+ };
522
+
523
+ //
524
+ FlotTooltip.prototype.timestampToDate = function (tmst, dateFormat, options) {
525
+ var theDate = $.plot.dateGenerator(tmst, options);
526
+ return $.plot.formatDate(theDate, dateFormat, this.tooltipOptions.monthNames, this.tooltipOptions.dayNames);
527
+ };
528
+
529
+ //
530
+ FlotTooltip.prototype.adjustValPrecision = function (pattern, content, value) {
531
+
532
+ var precision;
533
+ var matchResult = content.match(pattern);
534
+ if( matchResult !== null ) {
535
+ if(RegExp.$1 !== '') {
536
+ precision = RegExp.$1;
537
+ value = value.toFixed(precision);
538
+
539
+ // only replace content if precision exists, in other case use thickformater
540
+ content = content.replace(pattern, value);
541
+ }
542
+ }
543
+ return content;
544
+ };
545
+
546
+ // other plugins detection below
547
+
548
+ // check if flot-axislabels plugin (https://github.com/markrcote/flot-axislabels) is used and that an axis label is given
549
+ FlotTooltip.prototype.hasAxisLabel = function (axisName, item) {
550
+ return ($.inArray('axisLabels', this.plotPlugins) !== -1 && typeof item.series[axisName].options.axisLabel !== 'undefined' && item.series[axisName].options.axisLabel.length > 0);
551
+ };
552
+
553
+ // check whether flot-tickRotor, a plugin which allows rotation of X-axis ticks, is being used
554
+ FlotTooltip.prototype.hasRotatedXAxisTicks = function (item) {
555
+ return ($.inArray('tickRotor',this.plotPlugins) !== -1 && typeof item.series.xaxis.rotatedTicks !== 'undefined');
556
+ };
557
+
558
+ //
559
+ var init = function (plot) {
560
+ new FlotTooltip(plot);
561
+ };
562
+
563
+ // define Flot plugin
564
+ $.plot.plugins.push({
565
+ init: init,
566
+ options: defaultOptions,
567
+ name: 'tooltip',
568
+ version: '0.8.5'
569
+ });
570
+
571
+ })(jQuery);
assets/admin/scripts/jquery-flot.js ADDED
@@ -0,0 +1,3601 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Javascript plotting library for jQuery, version 0.8.3.
2
+
3
+ Copyright (c) 2007-2014 IOLA and Ole Laursen.
4
+ Licensed under the MIT license.
5
+
6
+ */
7
+
8
+ // first an inline dependency, jquery.colorhelpers.js, we inline it here
9
+ // for convenience
10
+
11
+ /* Plugin for jQuery for working with colors.
12
+ *
13
+ * Version 1.1.
14
+ *
15
+ * Inspiration from jQuery color animation plugin by John Resig.
16
+ *
17
+ * Released under the MIT license by Ole Laursen, October 2009.
18
+ *
19
+ * Examples:
20
+ *
21
+ * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
22
+ * var c = $.color.extract($("#mydiv"), 'background-color');
23
+ * console.log(c.r, c.g, c.b, c.a);
24
+ * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
25
+ *
26
+ * Note that .scale() and .add() return the same modified object
27
+ * instead of making a new one.
28
+ *
29
+ * V. 1.1: Fix error handling so e.g. parsing an empty string does
30
+ * produce a color rather than just crashing.
31
+ */
32
+ (function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
33
+
34
+ // the actual Flot code
35
+ (function($) {
36
+
37
+ // Cache the prototype hasOwnProperty for faster access
38
+
39
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
40
+
41
+ // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM
42
+ // operation produces the same effect as detach, i.e. removing the element
43
+ // without touching its jQuery data.
44
+
45
+ // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.
46
+
47
+ if (!$.fn.detach) {
48
+ $.fn.detach = function() {
49
+ return this.each(function() {
50
+ if (this.parentNode) {
51
+ this.parentNode.removeChild( this );
52
+ }
53
+ });
54
+ };
55
+ }
56
+
57
+ ///////////////////////////////////////////////////////////////////////////
58
+ // The Canvas object is a wrapper around an HTML5 <canvas> tag.
59
+ //
60
+ // @constructor
61
+ // @param {string} cls List of classes to apply to the canvas.
62
+ // @param {element} container Element onto which to append the canvas.
63
+ //
64
+ // Requiring a container is a little iffy, but unfortunately canvas
65
+ // operations don't work unless the canvas is attached to the DOM.
66
+
67
+ function Canvas(cls, container) {
68
+
69
+ var element = container.children("." + cls)[0];
70
+
71
+ if (element == null) {
72
+
73
+ element = document.createElement("canvas");
74
+ element.className = cls;
75
+
76
+ $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
77
+ .appendTo(container);
78
+
79
+ // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
80
+
81
+ if (!element.getContext) {
82
+ if (window.G_vmlCanvasManager) {
83
+ element = window.G_vmlCanvasManager.initElement(element);
84
+ } else {
85
+ throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
86
+ }
87
+ }
88
+ }
89
+
90
+ this.element = element;
91
+
92
+ var context = this.context = element.getContext("2d");
93
+
94
+ // Determine the screen's ratio of physical to device-independent
95
+ // pixels. This is the ratio between the canvas width that the browser
96
+ // advertises and the number of pixels actually present in that space.
97
+
98
+ // The iPhone 4, for example, has a device-independent width of 320px,
99
+ // but its screen is actually 640px wide. It therefore has a pixel
100
+ // ratio of 2, while most normal devices have a ratio of 1.
101
+
102
+ var devicePixelRatio = window.devicePixelRatio || 1,
103
+ backingStoreRatio =
104
+ context.webkitBackingStorePixelRatio ||
105
+ context.mozBackingStorePixelRatio ||
106
+ context.msBackingStorePixelRatio ||
107
+ context.oBackingStorePixelRatio ||
108
+ context.backingStorePixelRatio || 1;
109
+
110
+ this.pixelRatio = devicePixelRatio / backingStoreRatio;
111
+
112
+ // Size the canvas to match the internal dimensions of its container
113
+
114
+ this.resize(container.width(), container.height());
115
+
116
+ // Collection of HTML div layers for text overlaid onto the canvas
117
+
118
+ this.textContainer = null;
119
+ this.text = {};
120
+
121
+ // Cache of text fragments and metrics, so we can avoid expensively
122
+ // re-calculating them when the plot is re-rendered in a loop.
123
+
124
+ this._textCache = {};
125
+ }
126
+
127
+ // Resizes the canvas to the given dimensions.
128
+ //
129
+ // @param {number} width New width of the canvas, in pixels.
130
+ // @param {number} width New height of the canvas, in pixels.
131
+
132
+ Canvas.prototype.resize = function(width, height) {
133
+
134
+ if (width <= 0 || height <= 0) {
135
+ throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
136
+ }
137
+
138
+ var element = this.element,
139
+ context = this.context,
140
+ pixelRatio = this.pixelRatio;
141
+
142
+ // Resize the canvas, increasing its density based on the display's
143
+ // pixel ratio; basically giving it more pixels without increasing the
144
+ // size of its element, to take advantage of the fact that retina
145
+ // displays have that many more pixels in the same advertised space.
146
+
147
+ // Resizing should reset the state (excanvas seems to be buggy though)
148
+
149
+ if (this.width != width) {
150
+ element.width = width * pixelRatio;
151
+ element.style.width = width + "px";
152
+ this.width = width;
153
+ }
154
+
155
+ if (this.height != height) {
156
+ element.height = height * pixelRatio;
157
+ element.style.height = height + "px";
158
+ this.height = height;
159
+ }
160
+
161
+ // Save the context, so we can reset in case we get replotted. The
162
+ // restore ensure that we're really back at the initial state, and
163
+ // should be safe even if we haven't saved the initial state yet.
164
+
165
+ context.restore();
166
+ context.save();
167
+
168
+ // Scale the coordinate space to match the display density; so even though we
169
+ // may have twice as many pixels, we still want lines and other drawing to
170
+ // appear at the same size; the extra pixels will just make them crisper.
171
+
172
+ context.scale(pixelRatio, pixelRatio);
173
+ };
174
+
175
+ // Clears the entire canvas area, not including any overlaid HTML text
176
+
177
+ Canvas.prototype.clear = function() {
178
+ this.context.clearRect(0, 0, this.width, this.height);
179
+ };
180
+
181
+ // Finishes rendering the canvas, including managing the text overlay.
182
+
183
+ Canvas.prototype.render = function() {
184
+
185
+ var cache = this._textCache;
186
+
187
+ // For each text layer, add elements marked as active that haven't
188
+ // already been rendered, and remove those that are no longer active.
189
+
190
+ for (var layerKey in cache) {
191
+ if (hasOwnProperty.call(cache, layerKey)) {
192
+
193
+ var layer = this.getTextLayer(layerKey),
194
+ layerCache = cache[layerKey];
195
+
196
+ layer.hide();
197
+
198
+ for (var styleKey in layerCache) {
199
+ if (hasOwnProperty.call(layerCache, styleKey)) {
200
+ var styleCache = layerCache[styleKey];
201
+ for (var key in styleCache) {
202
+ if (hasOwnProperty.call(styleCache, key)) {
203
+
204
+ var positions = styleCache[key].positions;
205
+
206
+ for (var i = 0, position; position = positions[i]; i++) {
207
+ if (position.active) {
208
+ if (!position.rendered) {
209
+ layer.append(position.element);
210
+ position.rendered = true;
211
+ }
212
+ } else {
213
+ positions.splice(i--, 1);
214
+ if (position.rendered) {
215
+ position.element.detach();
216
+ }
217
+ }
218
+ }
219
+
220
+ if (positions.length == 0) {
221
+ delete styleCache[key];
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+
228
+ layer.show();
229
+ }
230
+ }
231
+ };
232
+
233
+ // Creates (if necessary) and returns the text overlay container.
234
+ //
235
+ // @param {string} classes String of space-separated CSS classes used to
236
+ // uniquely identify the text layer.
237
+ // @return {object} The jQuery-wrapped text-layer div.
238
+
239
+ Canvas.prototype.getTextLayer = function(classes) {
240
+
241
+ var layer = this.text[classes];
242
+
243
+ // Create the text layer if it doesn't exist
244
+
245
+ if (layer == null) {
246
+
247
+ // Create the text layer container, if it doesn't exist
248
+
249
+ if (this.textContainer == null) {
250
+ this.textContainer = $("<div class='flot-text'></div>")
251
+ .css({
252
+ position: "absolute",
253
+ top: 0,
254
+ left: 0,
255
+ bottom: 0,
256
+ right: 0,
257
+ 'font-size': "smaller",
258
+ color: "#545454"
259
+ })
260
+ .insertAfter(this.element);
261
+ }
262
+
263
+ layer = this.text[classes] = $("<div></div>")
264
+ .addClass(classes)
265
+ .css({
266
+ position: "absolute",
267
+ top: 0,
268
+ left: 0,
269
+ bottom: 0,
270
+ right: 0
271
+ })
272
+ .appendTo(this.textContainer);
273
+ }
274
+
275
+ return layer;
276
+ };
277
+
278
+ // Creates (if necessary) and returns a text info object.
279
+ //
280
+ // The object looks like this:
281
+ //
282
+ // {
283
+ // width: Width of the text's wrapper div.
284
+ // height: Height of the text's wrapper div.
285
+ // element: The jQuery-wrapped HTML div containing the text.
286
+ // positions: Array of positions at which this text is drawn.
287
+ // }
288
+ //
289
+ // The positions array contains objects that look like this:
290
+ //
291
+ // {
292
+ // active: Flag indicating whether the text should be visible.
293
+ // rendered: Flag indicating whether the text is currently visible.
294
+ // element: The jQuery-wrapped HTML div containing the text.
295
+ // x: X coordinate at which to draw the text.
296
+ // y: Y coordinate at which to draw the text.
297
+ // }
298
+ //
299
+ // Each position after the first receives a clone of the original element.
300
+ //
301
+ // The idea is that that the width, height, and general 'identity' of the
302
+ // text is constant no matter where it is placed; the placements are a
303
+ // secondary property.
304
+ //
305
+ // Canvas maintains a cache of recently-used text info objects; getTextInfo
306
+ // either returns the cached element or creates a new entry.
307
+ //
308
+ // @param {string} layer A string of space-separated CSS classes uniquely
309
+ // identifying the layer containing this text.
310
+ // @param {string} text Text string to retrieve info for.
311
+ // @param {(string|object)=} font Either a string of space-separated CSS
312
+ // classes or a font-spec object, defining the text's font and style.
313
+ // @param {number=} angle Angle at which to rotate the text, in degrees.
314
+ // Angle is currently unused, it will be implemented in the future.
315
+ // @param {number=} width Maximum width of the text before it wraps.
316
+ // @return {object} a text info object.
317
+
318
+ Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
319
+
320
+ var textStyle, layerCache, styleCache, info;
321
+
322
+ // Cast the value to a string, in case we were given a number or such
323
+
324
+ text = "" + text;
325
+
326
+ // If the font is a font-spec object, generate a CSS font definition
327
+
328
+ if (typeof font === "object") {
329
+ textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
330
+ } else {
331
+ textStyle = font;
332
+ }
333
+
334
+ // Retrieve (or create) the cache for the text's layer and styles
335
+
336
+ layerCache = this._textCache[layer];
337
+
338
+ if (layerCache == null) {
339
+ layerCache = this._textCache[layer] = {};
340
+ }
341
+
342
+ styleCache = layerCache[textStyle];
343
+
344
+ if (styleCache == null) {
345
+ styleCache = layerCache[textStyle] = {};
346
+ }
347
+
348
+ info = styleCache[text];
349
+
350
+ // If we can't find a matching element in our cache, create a new one
351
+
352
+ if (info == null) {
353
+
354
+ var element = $("<div></div>").html(text)
355
+ .css({
356
+ position: "absolute",
357
+ 'max-width': width,
358
+ top: -9999
359
+ })
360
+ .appendTo(this.getTextLayer(layer));
361
+
362
+ if (typeof font === "object") {
363
+ element.css({
364
+ font: textStyle,
365
+ color: font.color
366
+ });
367
+ } else if (typeof font === "string") {
368
+ element.addClass(font);
369
+ }
370
+
371
+ info = styleCache[text] = {
372
+ width: element.outerWidth(true),
373
+ height: element.outerHeight(true),
374
+ element: element,
375
+ positions: []
376
+ };
377
+
378
+ element.detach();
379
+ }
380
+
381
+ return info;
382
+ };
383
+
384
+ // Adds a text string to the canvas text overlay.
385
+ //
386
+ // The text isn't drawn immediately; it is marked as rendering, which will
387
+ // result in its addition to the canvas on the next render pass.
388
+ //
389
+ // @param {string} layer A string of space-separated CSS classes uniquely
390
+ // identifying the layer containing this text.
391
+ // @param {number} x X coordinate at which to draw the text.
392
+ // @param {number} y Y coordinate at which to draw the text.
393
+ // @param {string} text Text string to draw.
394
+ // @param {(string|object)=} font Either a string of space-separated CSS
395
+ // classes or a font-spec object, defining the text's font and style.
396
+ // @param {number=} angle Angle at which to rotate the text, in degrees.
397
+ // Angle is currently unused, it will be implemented in the future.
398
+ // @param {number=} width Maximum width of the text before it wraps.
399
+ // @param {string=} halign Horizontal alignment of the text; either "left",
400
+ // "center" or "right".
401
+ // @param {string=} valign Vertical alignment of the text; either "top",
402
+ // "middle" or "bottom".
403
+
404
+ Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
405
+
406
+ var info = this.getTextInfo(layer, text, font, angle, width),
407
+ positions = info.positions;
408
+
409
+ // Tweak the div's position to match the text's alignment
410
+
411
+ if (halign == "center") {
412
+ x -= info.width / 2;
413
+ } else if (halign == "right") {
414
+ x -= info.width;
415
+ }
416
+
417
+ if (valign == "middle") {
418
+ y -= info.height / 2;
419
+ } else if (valign == "bottom") {
420
+ y -= info.height;
421
+ }
422
+
423
+ // Determine whether this text already exists at this position.
424
+ // If so, mark it for inclusion in the next render pass.
425
+
426
+ for (var i = 0, position; position = positions[i]; i++) {
427
+ if (position.x == x && position.y == y) {
428
+ position.active = true;
429
+ return;
430
+ }
431
+ }
432
+
433
+ // If the text doesn't exist at this position, create a new entry
434
+
435
+ // For the very first position we'll re-use the original element,
436
+ // while for subsequent ones we'll clone it.
437
+
438
+ position = {
439
+ active: true,
440
+ rendered: false,
441
+ element: positions.length ? info.element.clone() : info.element,
442
+ x: x,
443
+ y: y
444
+ };
445
+
446
+ positions.push(position);
447
+
448
+ // Move the element to its final position within the container
449
+
450
+ position.element.css({
451
+ top: Math.round(y),
452
+ left: Math.round(x),
453
+ 'text-align': halign // In case the text wraps
454
+ });
455
+ };
456
+
457
+ // Removes one or more text strings from the canvas text overlay.
458
+ //
459
+ // If no parameters are given, all text within the layer is removed.
460
+ //
461
+ // Note that the text is not immediately removed; it is simply marked as
462
+ // inactive, which will result in its removal on the next render pass.
463
+ // This avoids the performance penalty for 'clear and redraw' behavior,
464
+ // where we potentially get rid of all text on a layer, but will likely
465
+ // add back most or all of it later, as when redrawing axes, for example.
466
+ //
467
+ // @param {string} layer A string of space-separated CSS classes uniquely
468
+ // identifying the layer containing this text.
469
+ // @param {number=} x X coordinate of the text.
470
+ // @param {number=} y Y coordinate of the text.
471
+ // @param {string=} text Text string to remove.
472
+ // @param {(string|object)=} font Either a string of space-separated CSS
473
+ // classes or a font-spec object, defining the text's font and style.
474
+ // @param {number=} angle Angle at which the text is rotated, in degrees.
475
+ // Angle is currently unused, it will be implemented in the future.
476
+
477
+ Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
478
+ if (text == null) {
479
+ var layerCache = this._textCache[layer];
480
+ if (layerCache != null) {
481
+ for (var styleKey in layerCache) {
482
+ if (hasOwnProperty.call(layerCache, styleKey)) {
483
+ var styleCache = layerCache[styleKey];
484
+ for (var key in styleCache) {
485
+ if (hasOwnProperty.call(styleCache, key)) {
486
+ var positions = styleCache[key].positions;
487
+ for (var i = 0, position; position = positions[i]; i++) {
488
+ position.active = false;
489
+ }
490
+ }
491
+ }
492
+ }
493
+ }
494
+ }
495
+ } else {
496
+ var positions = this.getTextInfo(layer, text, font, angle).positions;
497
+ for (var i = 0, position; position = positions[i]; i++) {
498
+ if (position.x == x && position.y == y) {
499
+ position.active = false;
500
+ }
501
+ }
502
+ }
503
+ };
504
+
505
+ ///////////////////////////////////////////////////////////////////////////
506
+ // The top-level container for the entire plot.
507
+
508
+ function Plot(placeholder, data_, options_, plugins) {
509
+ // data is on the form:
510
+ // [ series1, series2 ... ]
511
+ // where series is either just the data as [ [x1, y1], [x2, y2], ... ]
512
+ // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
513
+
514
+ var series = [],
515
+ options = {
516
+ // the color theme used for graphs
517
+ colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
518
+ legend: {
519
+ show: true,
520
+ noColumns: 1, // number of colums in legend table
521
+ labelFormatter: null, // fn: string -> string
522
+ labelBoxBorderColor: "#ccc", // border color for the little label boxes
523
+ container: null, // container (as jQuery object) to put legend in, null means default on top of graph
524
+ position: "ne", // position of default legend container within plot
525
+ margin: 5, // distance from grid edge to default legend container within plot
526
+ backgroundColor: null, // null means auto-detect
527
+ backgroundOpacity: 0.85, // set to 0 to avoid background
528
+ sorted: null // default to no legend sorting
529
+ },
530
+ xaxis: {
531
+ show: null, // null = auto-detect, true = always, false = never
532
+ position: "bottom", // or "top"
533
+ mode: null, // null or "time"
534
+ font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
535
+ color: null, // base color, labels, ticks
536
+ tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
537
+ transform: null, // null or f: number -> number to transform axis
538
+ inverseTransform: null, // if transform is set, this should be the inverse function
539
+ min: null, // min. value to show, null means set automatically
540
+ max: null, // max. value to show, null means set automatically
541
+ autoscaleMargin: null, // margin in % to add if auto-setting min/max
542
+ ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
543
+ tickFormatter: null, // fn: number -> string
544
+ labelWidth: null, // size of tick labels in pixels
545
+ labelHeight: null,
546
+ reserveSpace: null, // whether to reserve space even if axis isn't shown
547
+ tickLength: null, // size in pixels of ticks, or "full" for whole line
548
+ alignTicksWithAxis: null, // axis number or null for no sync
549
+ tickDecimals: null, // no. of decimals, null means auto
550
+ tickSize: null, // number or [number, "unit"]
551
+ minTickSize: null // number or [number, "unit"]
552
+ },
553
+ yaxis: {
554
+ autoscaleMargin: 0.02,
555
+ position: "left" // or "right"
556
+ },
557
+ xaxes: [],
558
+ yaxes: [],
559
+ series: {
560
+ points: {
561
+ show: false,
562
+ radius: 3,
563
+ lineWidth: 2, // in pixels
564
+ fill: true,
565
+ fillColor: "#ffffff",
566
+ symbol: "circle" // or callback
567
+ },
568
+ lines: {
569
+ // we don't put in show: false so we can see
570
+ // whether lines were actively disabled
571
+ lineWidth: 2, // in pixels
572
+ fill: false,
573
+ fillColor: null,
574
+ steps: false
575
+ // Omit 'zero', so we can later default its value to
576
+ // match that of the 'fill' option.
577
+ },
578
+ bars: {
579
+ show: false,
580
+ lineWidth: 2, // in pixels
581
+ barWidth: 1, // in units of the x axis
582
+ fill: true,
583
+ fillColor: null,
584
+ align: "left", // "left", "right", or "center"
585
+ horizontal: false,
586
+ zero: true
587
+ },
588
+ shadowSize: 3,
589
+ highlightColor: null
590
+ },
591
+ grid: {
592
+ show: true,
593
+ aboveData: false,
594
+ color: "#545454", // primary color used for outline and labels
595
+ backgroundColor: null, // null for transparent, else color
596
+ borderColor: null, // set if different from the grid color
597
+ tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
598
+ margin: 0, // distance from the canvas edge to the grid
599
+ labelMargin: 5, // in pixels
600
+ axisMargin: 8, // in pixels
601
+ borderWidth: 2, // in pixels
602
+ minBorderMargin: null, // in pixels, null means taken from points radius
603
+ markings: null, // array of ranges or fn: axes -> array of ranges
604
+ markingsColor: "#f4f4f4",
605
+ markingsLineWidth: 2,
606
+ // interactive stuff
607
+ clickable: false,
608
+ hoverable: false,
609
+ autoHighlight: true, // highlight in case mouse is near
610
+ mouseActiveRadius: 10 // how far the mouse can be away to activate an item
611
+ },
612
+ interaction: {
613
+ redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
614
+ },
615
+ hooks: {}
616
+ },
617
+ surface = null, // the canvas for the plot itself
618
+ overlay = null, // canvas for interactive stuff on top of plot
619
+ eventHolder = null, // jQuery object that events should be bound to
620
+ ctx = null, octx = null,
621
+ xaxes = [], yaxes = [],
622
+ plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
623
+ plotWidth = 0, plotHeight = 0,
624
+ hooks = {
625
+ processOptions: [],
626
+ processRawData: [],
627
+ processDatapoints: [],
628
+ processOffset: [],
629
+ drawBackground: [],
630
+ drawSeries: [],
631
+ draw: [],
632
+ bindEvents: [],
633
+ drawOverlay: [],
634
+ shutdown: []
635
+ },
636
+ plot = this;
637
+
638
+ // public functions
639
+ plot.setData = setData;
640
+ plot.setupGrid = setupGrid;
641
+ plot.draw = draw;
642
+ plot.getPlaceholder = function() { return placeholder; };
643
+ plot.getCanvas = function() { return surface.element; };
644
+ plot.getPlotOffset = function() { return plotOffset; };
645
+ plot.width = function () { return plotWidth; };
646
+ plot.height = function () { return plotHeight; };
647
+ plot.offset = function () {
648
+ var o = eventHolder.offset();
649
+ o.left += plotOffset.left;
650
+ o.top += plotOffset.top;
651
+ return o;
652
+ };
653
+ plot.getData = function () { return series; };
654
+ plot.getAxes = function () {
655
+ var res = {}, i;
656
+ $.each(xaxes.concat(yaxes), function (_, axis) {
657
+ if (axis)
658
+ res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
659
+ });
660
+ return res;
661
+ };
662
+ plot.getXAxes = function () { return xaxes; };
663
+ plot.getYAxes = function () { return yaxes; };
664
+ plot.c2p = canvasToAxisCoords;
665
+ plot.p2c = axisToCanvasCoords;
666
+ plot.getOptions = function () { return options; };
667
+ plot.highlight = highlight;
668
+ plot.unhighlight = unhighlight;
669
+ plot.triggerRedrawOverlay = triggerRedrawOverlay;
670
+ plot.pointOffset = function(point) {
671
+ return {
672
+ left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
673
+ top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
674
+ };
675
+ };
676
+ plot.shutdown = shutdown;
677
+ plot.destroy = function () {
678
+ shutdown();
679
+ placeholder.removeData("plot").empty();
680
+
681
+ series = [];
682
+ options = null;
683
+ surface = null;
684
+ overlay = null;
685
+ eventHolder = null;
686
+ ctx = null;
687
+ octx = null;
688
+ xaxes = [];
689
+ yaxes = [];
690
+ hooks = null;
691
+ highlights = [];
692
+ plot = null;
693
+ };
694
+ plot.resize = function () {
695
+ var width = placeholder.width(),
696
+ height = placeholder.height();
697
+ surface.resize(width, height);
698
+ overlay.resize(width, height);
699
+ };
700
+
701
+ // public attributes
702
+ plot.hooks = hooks;
703
+
704
+ // initialize
705
+ initPlugins(plot);
706
+ parseOptions(options_);
707
+ setupCanvases();
708
+ setData(data_);
709
+ setupGrid();
710
+ draw();
711
+ bindEvents();
712
+
713
+
714
+ function executeHooks(hook, args) {
715
+ args = [plot].concat(args);
716
+ for (var i = 0; i < hook.length; ++i)
717
+ hook[i].apply(this, args);
718
+ }
719
+
720
+ function initPlugins() {
721
+
722
+ // References to key classes, allowing plugins to modify them
723
+
724
+ var classes = {
725
+ Canvas: Canvas
726
+ };
727
+
728
+ for (var i = 0; i < plugins.length; ++i) {
729
+ var p = plugins[i];
730
+ p.init(plot, classes);
731
+ if (p.options)
732
+ $.extend(true, options, p.options);
733
+ }
734
+ }
735
+
736
+ function parseOptions(opts) {
737
+
738
+ $.extend(true, options, opts);
739
+
740
+ // $.extend merges arrays, rather than replacing them. When less
741
+ // colors are provided than the size of the default palette, we
742
+ // end up with those colors plus the remaining defaults, which is
743
+ // not expected behavior; avoid it by replacing them here.
744
+
745
+ if (opts && opts.colors) {
746
+ options.colors = opts.colors;
747
+ }
748
+
749
+ if (options.xaxis.color == null)
750
+ options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
751
+ if (options.yaxis.color == null)
752
+ options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
753
+
754
+ if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
755
+ options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
756
+ if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
757
+ options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
758
+
759
+ if (options.grid.borderColor == null)
760
+ options.grid.borderColor = options.grid.color;
761
+ if (options.grid.tickColor == null)
762
+ options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
763
+
764
+ // Fill in defaults for axis options, including any unspecified
765
+ // font-spec fields, if a font-spec was provided.
766
+
767
+ // If no x/y axis options were provided, create one of each anyway,
768
+ // since the rest of the code assumes that they exist.
769
+
770
+ var i, axisOptions, axisCount,
771
+ fontSize = placeholder.css("font-size"),
772
+ fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13,
773
+ fontDefaults = {
774
+ style: placeholder.css("font-style"),
775
+ size: Math.round(0.8 * fontSizeDefault),
776
+ variant: placeholder.css("font-variant"),
777
+ weight: placeholder.css("font-weight"),
778
+ family: placeholder.css("font-family")
779
+ };
780
+
781
+ axisCount = options.xaxes.length || 1;
782
+ for (i = 0; i < axisCount; ++i) {
783
+
784
+ axisOptions = options.xaxes[i];
785
+ if (axisOptions && !axisOptions.tickColor) {
786
+ axisOptions.tickColor = axisOptions.color;
787
+ }
788
+
789
+ axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
790
+ options.xaxes[i] = axisOptions;
791
+
792
+ if (axisOptions.font) {
793
+ axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
794
+ if (!axisOptions.font.color) {
795
+ axisOptions.font.color = axisOptions.color;
796
+ }
797
+ if (!axisOptions.font.lineHeight) {
798
+ axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
799
+ }
800
+ }
801
+ }
802
+
803
+ axisCount = options.yaxes.length || 1;
804
+ for (i = 0; i < axisCount; ++i) {
805
+
806
+ axisOptions = options.yaxes[i];
807
+ if (axisOptions && !axisOptions.tickColor) {
808
+ axisOptions.tickColor = axisOptions.color;
809
+ }
810
+
811
+ axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
812
+ options.yaxes[i] = axisOptions;
813
+
814
+ if (axisOptions.font) {
815
+ axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
816
+ if (!axisOptions.font.color) {
817
+ axisOptions.font.color = axisOptions.color;
818
+ }
819
+ if (!axisOptions.font.lineHeight) {
820
+ axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
821
+ }
822
+ }
823
+ }
824
+
825
+ // backwards compatibility, to be removed in future
826
+ if (options.xaxis.noTicks && options.xaxis.ticks == null)
827
+ options.xaxis.ticks = options.xaxis.noTicks;
828
+ if (options.yaxis.noTicks && options.yaxis.ticks == null)
829
+ options.yaxis.ticks = options.yaxis.noTicks;
830
+ if (options.x2axis) {
831
+ options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
832
+ options.xaxes[1].position = "top";
833
+ // Override the inherit to allow the axis to auto-scale
834
+ if (options.x2axis.min == null) {
835
+ options.xaxes[1].min = null;
836
+ }
837
+ if (options.x2axis.max == null) {
838
+ options.xaxes[1].max = null;
839
+ }
840
+ }
841
+ if (options.y2axis) {
842
+ options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
843
+ options.yaxes[1].position = "right";
844
+ // Override the inherit to allow the axis to auto-scale
845
+ if (options.y2axis.min == null) {
846
+ options.yaxes[1].min = null;
847
+ }
848
+ if (options.y2axis.max == null) {
849
+ options.yaxes[1].max = null;
850
+ }
851
+ }
852
+ if (options.grid.coloredAreas)
853
+ options.grid.markings = options.grid.coloredAreas;
854
+ if (options.grid.coloredAreasColor)
855
+ options.grid.markingsColor = options.grid.coloredAreasColor;
856
+ if (options.lines)
857
+ $.extend(true, options.series.lines, options.lines);
858
+ if (options.points)
859
+ $.extend(true, options.series.points, options.points);
860
+ if (options.bars)
861
+ $.extend(true, options.series.bars, options.bars);
862
+ if (options.shadowSize != null)
863
+ options.series.shadowSize = options.shadowSize;
864
+ if (options.highlightColor != null)
865
+ options.series.highlightColor = options.highlightColor;
866
+
867
+ // save options on axes for future reference
868
+ for (i = 0; i < options.xaxes.length; ++i)
869
+ getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
870
+ for (i = 0; i < options.yaxes.length; ++i)
871
+ getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
872
+
873
+ // add hooks from options
874
+ for (var n in hooks)
875
+ if (options.hooks[n] && options.hooks[n].length)
876
+ hooks[n] = hooks[n].concat(options.hooks[n]);
877
+
878
+ executeHooks(hooks.processOptions, [options]);
879
+ }
880
+
881
+ function setData(d) {
882
+ series = parseData(d);
883
+ fillInSeriesOptions();
884
+ processData();
885
+ }
886
+
887
+ function parseData(d) {
888
+ var res = [];
889
+ for (var i = 0; i < d.length; ++i) {
890
+ var s = $.extend(true, {}, options.series);
891
+
892
+ if (d[i].data != null) {
893
+ s.data = d[i].data; // move the data instead of deep-copy
894
+ delete d[i].data;
895
+
896
+ $.extend(true, s, d[i]);
897
+
898
+ d[i].data = s.data;
899
+ }
900
+ else
901
+ s.data = d[i];
902
+ res.push(s);
903
+ }
904
+
905
+ return res;
906
+ }
907
+
908
+ function axisNumber(obj, coord) {
909
+ var a = obj[coord + "axis"];
910
+ if (typeof a == "object") // if we got a real axis, extract number
911
+ a = a.n;
912
+ if (typeof a != "number")
913
+ a = 1; // default to first axis
914
+ return a;
915
+ }
916
+
917
+ function allAxes() {
918
+ // return flat array without annoying null entries
919
+ return $.grep(xaxes.concat(yaxes), function (a) { return a; });
920
+ }
921
+
922
+ function canvasToAxisCoords(pos) {
923
+ // return an object with x/y corresponding to all used axes
924
+ var res = {}, i, axis;
925
+ for (i = 0; i < xaxes.length; ++i) {
926
+ axis = xaxes[i];
927
+ if (axis && axis.used)
928
+ res["x" + axis.n] = axis.c2p(pos.left);
929
+ }
930
+
931
+ for (i = 0; i < yaxes.length; ++i) {
932
+ axis = yaxes[i];
933
+ if (axis && axis.used)
934
+ res["y" + axis.n] = axis.c2p(pos.top);
935
+ }
936
+
937
+ if (res.x1 !== undefined)
938
+ res.x = res.x1;
939
+ if (res.y1 !== undefined)
940
+ res.y = res.y1;
941
+
942
+ return res;
943
+ }
944
+
945
+ function axisToCanvasCoords(pos) {
946
+ // get canvas coords from the first pair of x/y found in pos
947
+ var res = {}, i, axis, key;
948
+
949
+ for (i = 0; i < xaxes.length; ++i) {
950
+ axis = xaxes[i];
951
+ if (axis && axis.used) {
952
+ key = "x" + axis.n;
953
+ if (pos[key] == null && axis.n == 1)
954
+ key = "x";
955
+
956
+ if (pos[key] != null) {
957
+ res.left = axis.p2c(pos[key]);
958
+ break;
959
+ }
960
+ }
961
+ }
962
+
963
+ for (i = 0; i < yaxes.length; ++i) {
964
+ axis = yaxes[i];
965
+ if (axis && axis.used) {
966
+ key = "y" + axis.n;
967
+ if (pos[key] == null && axis.n == 1)
968
+ key = "y";
969
+
970
+ if (pos[key] != null) {
971
+ res.top = axis.p2c(pos[key]);
972
+ break;
973
+ }
974
+ }
975
+ }
976
+
977
+ return res;
978
+ }
979
+
980
+ function getOrCreateAxis(axes, number) {
981
+ if (!axes[number - 1])
982
+ axes[number - 1] = {
983
+ n: number, // save the number for future reference
984
+ direction: axes == xaxes ? "x" : "y",
985
+ options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
986
+ };
987
+
988
+ return axes[number - 1];
989
+ }
990
+
991
+ function fillInSeriesOptions() {
992
+
993
+ var neededColors = series.length, maxIndex = -1, i;
994
+
995
+ // Subtract the number of series that already have fixed colors or
996
+ // color indexes from the number that we still need to generate.
997
+
998
+ for (i = 0; i < series.length; ++i) {
999
+ var sc = series[i].color;
1000
+ if (sc != null) {
1001
+ neededColors--;
1002
+ if (typeof sc == "number" && sc > maxIndex) {
1003
+ maxIndex = sc;
1004
+ }
1005
+ }
1006
+ }
1007
+
1008
+ // If any of the series have fixed color indexes, then we need to
1009
+ // generate at least as many colors as the highest index.
1010
+
1011
+ if (neededColors <= maxIndex) {
1012
+ neededColors = maxIndex + 1;
1013
+ }
1014
+
1015
+ // Generate all the colors, using first the option colors and then
1016
+ // variations on those colors once they're exhausted.
1017
+
1018
+ var c, colors = [], colorPool = options.colors,
1019
+ colorPoolSize = colorPool.length, variation = 0;
1020
+
1021
+ for (i = 0; i < neededColors; i++) {
1022
+
1023
+ c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
1024
+
1025
+ // Each time we exhaust the colors in the pool we adjust
1026
+ // a scaling factor used to produce more variations on
1027
+ // those colors. The factor alternates negative/positive
1028
+ // to produce lighter/darker colors.
1029
+
1030
+ // Reset the variation after every few cycles, or else
1031
+ // it will end up producing only white or black colors.
1032
+
1033
+ if (i % colorPoolSize == 0 && i) {
1034
+ if (variation >= 0) {
1035
+ if (variation < 0.5) {
1036
+ variation = -variation - 0.2;
1037
+ } else variation = 0;
1038
+ } else variation = -variation;
1039
+ }
1040
+
1041
+ colors[i] = c.scale('rgb', 1 + variation);
1042
+ }
1043
+
1044
+ // Finalize the series options, filling in their colors
1045
+
1046
+ var colori = 0, s;
1047
+ for (i = 0; i < series.length; ++i) {
1048
+ s = series[i];
1049
+
1050
+ // assign colors
1051
+ if (s.color == null) {
1052
+ s.color = colors[colori].toString();
1053
+ ++colori;
1054
+ }
1055
+ else if (typeof s.color == "number")
1056
+ s.color = colors[s.color].toString();
1057
+
1058
+ // turn on lines automatically in case nothing is set
1059
+ if (s.lines.show == null) {
1060
+ var v, show = true;
1061
+ for (v in s)
1062
+ if (s[v] && s[v].show) {
1063
+ show = false;
1064
+ break;
1065
+ }
1066
+ if (show)
1067
+ s.lines.show = true;
1068
+ }
1069
+
1070
+ // If nothing was provided for lines.zero, default it to match
1071
+ // lines.fill, since areas by default should extend to zero.
1072
+
1073
+ if (s.lines.zero == null) {
1074
+ s.lines.zero = !!s.lines.fill;
1075
+ }
1076
+
1077
+ // setup axes
1078
+ s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
1079
+ s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
1080
+ }
1081
+ }
1082
+
1083
+ function processData() {
1084
+ var topSentry = Number.POSITIVE_INFINITY,
1085
+ bottomSentry = Number.NEGATIVE_INFINITY,
1086
+ fakeInfinity = Number.MAX_VALUE,
1087
+ i, j, k, m, length,
1088
+ s, points, ps, x, y, axis, val, f, p,
1089
+ data, format;
1090
+
1091
+ function updateAxis(axis, min, max) {
1092
+ if (min < axis.datamin && min != -fakeInfinity)
1093
+ axis.datamin = min;
1094
+ if (max > axis.datamax && max != fakeInfinity)
1095
+ axis.datamax = max;
1096
+ }
1097
+
1098
+ $.each(allAxes(), function (_, axis) {
1099
+ // init axis
1100
+ axis.datamin = topSentry;
1101
+ axis.datamax = bottomSentry;
1102
+ axis.used = false;
1103
+ });
1104
+
1105
+ for (i = 0; i < series.length; ++i) {
1106
+ s = series[i];
1107
+ s.datapoints = { points: [] };
1108
+
1109
+ executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
1110
+ }
1111
+
1112
+ // first pass: clean and copy data
1113
+ for (i = 0; i < series.length; ++i) {
1114
+ s = series[i];
1115
+
1116
+ data = s.data;
1117
+ format = s.datapoints.format;
1118
+
1119
+ if (!format) {
1120
+ format = [];
1121
+ // find out how to copy
1122
+ format.push({ x: true, number: true, required: true });
1123
+ format.push({ y: true, number: true, required: true });
1124
+
1125
+ if (s.bars.show || (s.lines.show && s.lines.fill)) {
1126
+ var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
1127
+ format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
1128
+ if (s.bars.horizontal) {
1129
+ delete format[format.length - 1].y;
1130
+ format[format.length - 1].x = true;
1131
+ }
1132
+ }
1133
+
1134
+ s.datapoints.format = format;
1135
+ }
1136
+
1137
+ if (s.datapoints.pointsize != null)
1138
+ continue; // already filled in
1139
+
1140
+ s.datapoints.pointsize = format.length;
1141
+
1142
+ ps = s.datapoints.pointsize;
1143
+ points = s.datapoints.points;
1144
+
1145
+ var insertSteps = s.lines.show && s.lines.steps;
1146
+ s.xaxis.used = s.yaxis.used = true;
1147
+
1148
+ for (j = k = 0; j < data.length; ++j, k += ps) {
1149
+ p = data[j];
1150
+
1151
+ var nullify = p == null;
1152
+ if (!nullify) {
1153
+ for (m = 0; m < ps; ++m) {
1154
+ val = p[m];
1155
+ f = format[m];
1156
+
1157
+ if (f) {
1158
+ if (f.number && val != null) {
1159
+ val = +val; // convert to number
1160
+ if (isNaN(val))
1161
+ val = null;
1162
+ else if (val == Infinity)
1163
+ val = fakeInfinity;
1164
+ else if (val == -Infinity)
1165
+ val = -fakeInfinity;
1166
+ }
1167
+
1168
+ if (val == null) {
1169
+ if (f.required)
1170
+ nullify = true;
1171
+
1172
+ if (f.defaultValue != null)
1173
+ val = f.defaultValue;
1174
+ }
1175
+ }
1176
+
1177
+ points[k + m] = val;
1178
+ }
1179
+ }
1180
+
1181
+ if (nullify) {
1182
+ for (m = 0; m < ps; ++m) {
1183
+ val = points[k + m];
1184
+ if (val != null) {
1185
+ f = format[m];
1186
+ // extract min/max info
1187
+ if (f.autoscale !== false) {
1188
+ if (f.x) {
1189
+ updateAxis(s.xaxis, val, val);
1190
+ }
1191
+ if (f.y) {
1192
+ updateAxis(s.yaxis, val, val);
1193
+ }
1194
+ }
1195
+ }
1196
+ points[k + m] = null;
1197
+ }
1198
+ }
1199
+ else {
1200
+ // a little bit of line specific stuff that
1201
+ // perhaps shouldn't be here, but lacking
1202
+ // better means...
1203
+ if (insertSteps && k > 0
1204
+ && points[k - ps] != null
1205
+ && points[k - ps] != points[k]
1206
+ && points[k - ps + 1] != points[k + 1]) {
1207
+ // copy the point to make room for a middle point
1208
+ for (m = 0; m < ps; ++m)
1209
+ points[k + ps + m] = points[k + m];
1210
+
1211
+ // middle point has same y
1212
+ points[k + 1] = points[k - ps + 1];
1213
+
1214
+ // we've added a point, better reflect that
1215
+ k += ps;
1216
+ }
1217
+ }
1218
+ }
1219
+ }
1220
+
1221
+ // give the hooks a chance to run
1222
+ for (i = 0; i < series.length; ++i) {
1223
+ s = series[i];
1224
+
1225
+ executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
1226
+ }
1227
+
1228
+ // second pass: find datamax/datamin for auto-scaling
1229
+ for (i = 0; i < series.length; ++i) {
1230
+ s = series[i];
1231
+ points = s.datapoints.points;
1232
+ ps = s.datapoints.pointsize;
1233
+ format = s.datapoints.format;
1234
+
1235
+ var xmin = topSentry, ymin = topSentry,
1236
+ xmax = bottomSentry, ymax = bottomSentry;
1237
+
1238
+ for (j = 0; j < points.length; j += ps) {
1239
+ if (points[j] == null)
1240
+ continue;
1241
+
1242
+ for (m = 0; m < ps; ++m) {
1243
+ val = points[j + m];
1244
+ f = format[m];
1245
+ if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
1246
+ continue;
1247
+
1248
+ if (f.x) {
1249
+ if (val < xmin)
1250
+ xmin = val;
1251
+ if (val > xmax)
1252
+ xmax = val;
1253
+ }
1254
+ if (f.y) {
1255
+ if (val < ymin)
1256
+ ymin = val;
1257
+ if (val > ymax)
1258
+ ymax = val;
1259
+ }
1260
+ }
1261
+ }
1262
+
1263
+ if (s.bars.show) {
1264
+ // make sure we got room for the bar on the dancing floor
1265
+ var delta;
1266
+
1267
+ switch (s.bars.align) {
1268
+ case "left":
1269
+ delta = 0;
1270
+ break;
1271
+ case "right":
1272
+ delta = -s.bars.barWidth;
1273
+ break;
1274
+ default:
1275
+ delta = -s.bars.barWidth / 2;
1276
+ }
1277
+
1278
+ if (s.bars.horizontal) {
1279
+ ymin += delta;
1280
+ ymax += delta + s.bars.barWidth;
1281
+ }
1282
+ else {
1283
+ xmin += delta;
1284
+ xmax += delta + s.bars.barWidth;
1285
+ }
1286
+ }
1287
+
1288
+ updateAxis(s.xaxis, xmin, xmax);
1289
+ updateAxis(s.yaxis, ymin, ymax);
1290
+ }
1291
+
1292
+ $.each(allAxes(), function (_, axis) {
1293
+ if (axis.datamin == topSentry)
1294
+ axis.datamin = null;
1295
+ if (axis.datamax == bottomSentry)
1296
+ axis.datamax = null;
1297
+ });
1298
+ }
1299
+
1300
+ function setupCanvases() {
1301
+
1302
+ // Make sure the placeholder is clear of everything except canvases
1303
+ // from a previous plot in this container that we'll try to re-use.
1304
+
1305
+ placeholder.css("padding", 0) // padding messes up the positioning
1306
+ .children().filter(function(){
1307
+ return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
1308
+ }).remove();
1309
+
1310
+ if (placeholder.css("position") == 'static')
1311
+ placeholder.css("position", "relative"); // for positioning labels and overlay
1312
+
1313
+ surface = new Canvas("flot-base", placeholder);
1314
+ overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
1315
+
1316
+ ctx = surface.context;
1317
+ octx = overlay.context;
1318
+
1319
+ // define which element we're listening for events on
1320
+ eventHolder = $(overlay.element).unbind();
1321
+
1322
+ // If we're re-using a plot object, shut down the old one
1323
+
1324
+ var existing = placeholder.data("plot");
1325
+
1326
+ if (existing) {
1327
+ existing.shutdown();
1328
+ overlay.clear();
1329
+ }
1330
+
1331
+ // save in case we get replotted
1332
+ placeholder.data("plot", plot);
1333
+ }
1334
+
1335
+ function bindEvents() {
1336
+ // bind events
1337
+ if (options.grid.hoverable) {
1338
+ eventHolder.mousemove(onMouseMove);
1339
+
1340
+ // Use bind, rather than .mouseleave, because we officially
1341
+ // still support jQuery 1.2.6, which doesn't define a shortcut
1342
+ // for mouseenter or mouseleave. This was a bug/oversight that
1343
+ // was fixed somewhere around 1.3.x. We can return to using
1344
+ // .mouseleave when we drop support for 1.2.6.
1345
+
1346
+ eventHolder.bind("mouseleave", onMouseLeave);
1347
+ }
1348
+
1349
+ if (options.grid.clickable)
1350
+ eventHolder.click(onClick);
1351
+
1352
+ executeHooks(hooks.bindEvents, [eventHolder]);
1353
+ }
1354
+
1355
+ function shutdown() {
1356
+ if (redrawTimeout)
1357
+ clearTimeout(redrawTimeout);
1358
+
1359
+ eventHolder.unbind("mousemove", onMouseMove);
1360
+ eventHolder.unbind("mouseleave", onMouseLeave);
1361
+ eventHolder.unbind("click", onClick);
1362
+
1363
+ executeHooks(hooks.shutdown, [eventHolder]);
1364
+ }
1365
+
1366
+ function setTransformationHelpers(axis) {
1367
+ // set helper functions on the axis, assumes plot area
1368
+ // has been computed already
1369
+
1370
+ function identity(x) { return x; }
1371
+
1372
+ var s, m, t = axis.options.transform || identity,
1373
+ it = axis.options.inverseTransform;
1374
+
1375
+ // precompute how much the axis is scaling a point
1376
+ // in canvas space
1377
+ if (axis.direction == "x") {
1378
+ s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
1379
+ m = Math.min(t(axis.max), t(axis.min));
1380
+ }
1381
+ else {
1382
+ s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
1383
+ s = -s;
1384
+ m = Math.max(t(axis.max), t(axis.min));
1385
+ }
1386
+
1387
+ // data point to canvas coordinate
1388
+ if (t == identity) // slight optimization
1389
+ axis.p2c = function (p) { return (p - m) * s; };
1390
+ else
1391
+ axis.p2c = function (p) { return (t(p) - m) * s; };
1392
+ // canvas coordinate to data point
1393
+ if (!it)
1394
+ axis.c2p = function (c) { return m + c / s; };
1395
+ else
1396
+ axis.c2p = function (c) { return it(m + c / s); };
1397
+ }
1398
+
1399
+ function measureTickLabels(axis) {
1400
+
1401
+ var opts = axis.options,
1402
+ ticks = axis.ticks || [],
1403
+ labelWidth = opts.labelWidth || 0,
1404
+ labelHeight = opts.labelHeight || 0,
1405
+ maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null),
1406
+ legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
1407
+ layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
1408
+ font = opts.font || "flot-tick-label tickLabel";
1409
+
1410
+ for (var i = 0; i < ticks.length; ++i) {
1411
+
1412
+ var t = ticks[i];
1413
+
1414
+ if (!t.label)
1415
+ continue;
1416
+
1417
+ var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
1418
+
1419
+ labelWidth = Math.max(labelWidth, info.width);
1420
+ labelHeight = Math.max(labelHeight, info.height);
1421
+ }
1422
+
1423
+ axis.labelWidth = opts.labelWidth || labelWidth;
1424
+ axis.labelHeight = opts.labelHeight || labelHeight;
1425
+ }
1426
+
1427
+ function allocateAxisBoxFirstPhase(axis) {
1428
+ // find the bounding box of the axis by looking at label
1429
+ // widths/heights and ticks, make room by diminishing the
1430
+ // plotOffset; this first phase only looks at one
1431
+ // dimension per axis, the other dimension depends on the
1432
+ // other axes so will have to wait
1433
+
1434
+ var lw = axis.labelWidth,
1435
+ lh = axis.labelHeight,
1436
+ pos = axis.options.position,
1437
+ isXAxis = axis.direction === "x",
1438
+ tickLength = axis.options.tickLength,
1439
+ axisMargin = options.grid.axisMargin,
1440
+ padding = options.grid.labelMargin,
1441
+ innermost = true,
1442
+ outermost = true,
1443
+ first = true,
1444
+ found = false;
1445
+
1446
+ // Determine the axis's position in its direction and on its side
1447
+
1448
+ $.each(isXAxis ? xaxes : yaxes, function(i, a) {
1449
+ if (a && (a.show || a.reserveSpace)) {
1450
+ if (a === axis) {
1451
+ found = true;
1452
+ } else if (a.options.position === pos) {
1453
+ if (found) {
1454
+ outermost = false;
1455
+ } else {
1456
+ innermost = false;
1457
+ }
1458
+ }
1459
+ if (!found) {
1460
+ first = false;
1461
+ }
1462
+ }
1463
+ });
1464
+
1465
+ // The outermost axis on each side has no margin
1466
+
1467
+ if (outermost) {
1468
+ axisMargin = 0;
1469
+ }
1470
+
1471
+ // The ticks for the first axis in each direction stretch across
1472
+
1473
+ if (tickLength == null) {
1474
+ tickLength = first ? "full" : 5;
1475
+ }
1476
+
1477
+ if (!isNaN(+tickLength))
1478
+ padding += +tickLength;
1479
+
1480
+ if (isXAxis) {
1481
+ lh += padding;
1482
+
1483
+ if (pos == "bottom") {
1484
+ plotOffset.bottom += lh + axisMargin;
1485
+ axis.box = { top: surface.height - plotOffset.bottom, height: lh };
1486
+ }
1487
+ else {
1488
+ axis.box = { top: plotOffset.top + axisMargin, height: lh };
1489
+ plotOffset.top += lh + axisMargin;
1490
+ }
1491
+ }
1492
+ else {
1493
+ lw += padding;
1494
+
1495
+ if (pos == "left") {
1496
+ axis.box = { left: plotOffset.left + axisMargin, width: lw };
1497
+ plotOffset.left += lw + axisMargin;
1498
+ }
1499
+ else {
1500
+ plotOffset.right += lw + axisMargin;
1501
+ axis.box = { left: surface.width - plotOffset.right, width: lw };
1502
+ }
1503
+ }
1504
+
1505
+ // save for future reference
1506
+ axis.position = pos;
1507
+ axis.tickLength = tickLength;
1508
+ axis.box.padding = padding;
1509
+ axis.innermost = innermost;
1510
+ }
1511
+
1512
+ function allocateAxisBoxSecondPhase(axis) {
1513
+ // now that all axis boxes have been placed in one
1514
+ // dimension, we can set the remaining dimension coordinates
1515
+ if (axis.direction == "x") {
1516
+ axis.box.left = plotOffset.left - axis.labelWidth / 2;
1517
+ axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
1518
+ }
1519
+ else {
1520
+ axis.box.top = plotOffset.top - axis.labelHeight / 2;
1521
+ axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
1522
+ }
1523
+ }
1524
+
1525
+ function adjustLayoutForThingsStickingOut() {
1526
+ // possibly adjust plot offset to ensure everything stays
1527
+ // inside the canvas and isn't clipped off
1528
+
1529
+ var minMargin = options.grid.minBorderMargin,
1530
+ axis, i;
1531
+
1532
+ // check stuff from the plot (FIXME: this should just read
1533
+ // a value from the series, otherwise it's impossible to
1534
+ // customize)
1535
+ if (minMargin == null) {
1536
+ minMargin = 0;
1537
+ for (i = 0; i < series.length; ++i)
1538
+ minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
1539
+ }
1540
+
1541
+ var margins = {
1542
+ left: minMargin,
1543
+ right: minMargin,
1544
+ top: minMargin,
1545
+ bottom: minMargin
1546
+ };
1547
+
1548
+ // check axis labels, note we don't check the actual
1549
+ // labels but instead use the overall width/height to not
1550
+ // jump as much around with replots
1551
+ $.each(allAxes(), function (_, axis) {
1552
+ if (axis.reserveSpace && axis.ticks && axis.ticks.length) {
1553
+ if (axis.direction === "x") {
1554
+ margins.left = Math.max(margins.left, axis.labelWidth / 2);
1555
+ margins.right = Math.max(margins.right, axis.labelWidth / 2);
1556
+ } else {
1557
+ margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);
1558
+ margins.top = Math.max(margins.top, axis.labelHeight / 2);
1559
+ }
1560
+ }
1561
+ });
1562
+
1563
+ plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));
1564
+ plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));
1565
+ plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));
1566
+ plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));
1567
+ }
1568
+
1569
+ function setupGrid() {
1570
+ var i, axes = allAxes(), showGrid = options.grid.show;
1571
+
1572
+ // Initialize the plot's offset from the edge of the canvas
1573
+
1574
+ for (var a in plotOffset) {
1575
+ var margin = options.grid.margin || 0;
1576
+ plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
1577
+ }
1578
+
1579
+ executeHooks(hooks.processOffset, [plotOffset]);
1580
+
1581
+ // If the grid is visible, add its border width to the offset
1582
+
1583
+ for (var a in plotOffset) {
1584
+ if(typeof(options.grid.borderWidth) == "object") {
1585
+ plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
1586
+ }
1587
+ else {
1588
+ plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
1589
+ }
1590
+ }
1591
+
1592
+ $.each(axes, function (_, axis) {
1593
+ var axisOpts = axis.options;
1594
+ axis.show = axisOpts.show == null ? axis.used : axisOpts.show;
1595
+ axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;
1596
+ setRange(axis);
1597
+ });
1598
+
1599
+ if (showGrid) {
1600
+
1601
+ var allocatedAxes = $.grep(axes, function (axis) {
1602
+ return axis.show || axis.reserveSpace;
1603
+ });
1604
+
1605
+ $.each(allocatedAxes, function (_, axis) {
1606
+ // make the ticks
1607
+ setupTickGeneration(axis);
1608
+ setTicks(axis);
1609
+ snapRangeToTicks(axis, axis.ticks);
1610
+ // find labelWidth/Height for axis
1611
+ measureTickLabels(axis);
1612
+ });
1613
+
1614
+ // with all dimensions calculated, we can compute the
1615
+ // axis bounding boxes, start from the outside
1616
+ // (reverse order)
1617
+ for (i = allocatedAxes.length - 1; i >= 0; --i)
1618
+ allocateAxisBoxFirstPhase(allocatedAxes[i]);
1619
+
1620
+ // make sure we've got enough space for things that
1621
+ // might stick out
1622
+ adjustLayoutForThingsStickingOut();
1623
+
1624
+ $.each(allocatedAxes, function (_, axis) {
1625
+ allocateAxisBoxSecondPhase(axis);
1626
+ });
1627
+ }
1628
+
1629
+ plotWidth = surface.width - plotOffset.left - plotOffset.right;
1630
+ plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
1631
+
1632
+ // now we got the proper plot dimensions, we can compute the scaling
1633
+ $.each(axes, function (_, axis) {
1634
+ setTransformationHelpers(axis);
1635
+ });
1636
+
1637
+ if (showGrid) {
1638
+ drawAxisLabels();
1639
+ }
1640
+
1641
+ insertLegend();
1642
+ }
1643
+
1644
+ function setRange(axis) {
1645
+ var opts = axis.options,
1646
+ min = +(opts.min != null ? opts.min : axis.datamin),
1647
+ max = +(opts.max != null ? opts.max : axis.datamax),
1648
+ delta = max - min;
1649
+
1650
+ if (delta == 0.0) {
1651
+ // degenerate case
1652
+ var widen = max == 0 ? 1 : 0.01;
1653
+
1654
+ if (opts.min == null)
1655
+ min -= widen;
1656
+ // always widen max if we couldn't widen min to ensure we
1657
+ // don't fall into min == max which doesn't work
1658
+ if (opts.max == null || opts.min != null)
1659
+ max += widen;
1660
+ }
1661
+ else {
1662
+ // consider autoscaling
1663
+ var margin = opts.autoscaleMargin;
1664
+ if (margin != null) {
1665
+ if (opts.min == null) {
1666
+ min -= delta * margin;
1667
+ // make sure we don't go below zero if all values
1668
+ // are positive
1669
+ if (min < 0 && axis.datamin != null && axis.datamin >= 0)
1670
+ min = 0;
1671
+ }
1672
+ if (opts.max == null) {
1673
+ max += delta * margin;
1674
+ if (max > 0 && axis.datamax != null && axis.datamax <= 0)
1675
+ max = 0;
1676
+ }
1677
+ }
1678
+ }
1679
+ axis.min = min;
1680
+ axis.max = max;
1681
+ }
1682
+
1683
+ function setupTickGeneration(axis) {
1684
+ var opts = axis.options;
1685
+
1686
+ // estimate number of ticks
1687
+ var noTicks;
1688
+ if (typeof opts.ticks == "number" && opts.ticks > 0)
1689
+ noTicks = opts.ticks;
1690
+ else
1691
+ // heuristic based on the model a*sqrt(x) fitted to
1692
+ // some data points that seemed reasonable
1693
+ noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
1694
+
1695
+ var delta = (axis.max - axis.min) / noTicks,
1696
+ dec = -Math.floor(Math.log(delta) / Math.LN10),
1697
+ maxDec = opts.tickDecimals;
1698
+
1699
+ if (maxDec != null && dec > maxDec) {
1700
+ dec = maxDec;
1701
+ }
1702
+
1703
+ var magn = Math.pow(10, -dec),
1704
+ norm = delta / magn, // norm is between 1.0 and 10.0
1705
+ size;
1706
+
1707
+ if (norm < 1.5) {
1708
+ size = 1;
1709
+ } else if (norm < 3) {
1710
+ size = 2;
1711
+ // special case for 2.5, requires an extra decimal
1712
+ if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
1713
+ size = 2.5;
1714
+ ++dec;
1715
+ }
1716
+ } else if (norm < 7.5) {
1717
+ size = 5;
1718
+ } else {
1719
+ size = 10;
1720
+ }
1721
+
1722
+ size *= magn;
1723
+
1724
+ if (opts.minTickSize != null && size < opts.minTickSize) {
1725
+ size = opts.minTickSize;
1726
+ }
1727
+
1728
+ axis.delta = delta;
1729
+ axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
1730
+ axis.tickSize = opts.tickSize || size;
1731
+
1732
+ // Time mode was moved to a plug-in in 0.8, and since so many people use it
1733
+ // we'll add an especially friendly reminder to make sure they included it.
1734
+
1735
+ if (opts.mode == "time" && !axis.tickGenerator) {
1736
+ throw new Error("Time mode requires the flot.time plugin.");
1737
+ }
1738
+
1739
+ // Flot supports base-10 axes; any other mode else is handled by a plug-in,
1740
+ // like flot.time.js.
1741
+
1742
+ if (!axis.tickGenerator) {
1743
+
1744
+ axis.tickGenerator = function (axis) {
1745
+
1746
+ var ticks = [],
1747
+ start = floorInBase(axis.min, axis.tickSize),
1748
+ i = 0,
1749
+ v = Number.NaN,
1750
+ prev;
1751
+
1752
+ do {
1753
+ prev = v;
1754
+ v = start + i * axis.tickSize;
1755
+ ticks.push(v);
1756
+ ++i;
1757
+ } while (v < axis.max && v != prev);
1758
+ return ticks;
1759
+ };
1760
+
1761
+ axis.tickFormatter = function (value, axis) {
1762
+
1763
+ var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
1764
+ var formatted = "" + Math.round(value * factor) / factor;
1765
+
1766
+ // If tickDecimals was specified, ensure that we have exactly that
1767
+ // much precision; otherwise default to the value's own precision.
1768
+
1769
+ if (axis.tickDecimals != null) {
1770
+ var decimal = formatted.indexOf(".");
1771
+ var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
1772
+ if (precision < axis.tickDecimals) {
1773
+ return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
1774
+ }
1775
+ }
1776
+
1777
+ return formatted;
1778
+ };
1779
+ }
1780
+
1781
+ if ($.isFunction(opts.tickFormatter))
1782
+ axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
1783
+
1784
+ if (opts.alignTicksWithAxis != null) {
1785
+ var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
1786
+ if (otherAxis && otherAxis.used && otherAxis != axis) {
1787
+ // consider snapping min/max to outermost nice ticks
1788
+ var niceTicks = axis.tickGenerator(axis);
1789
+ if (niceTicks.length > 0) {
1790
+ if (opts.min == null)
1791
+ axis.min = Math.min(axis.min, niceTicks[0]);
1792
+ if (opts.max == null && niceTicks.length > 1)
1793
+ axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
1794
+ }
1795
+
1796
+ axis.tickGenerator = function (axis) {
1797
+ // copy ticks, scaled to this axis
1798
+ var ticks = [], v, i;
1799
+ for (i = 0; i < otherAxis.ticks.length; ++i) {
1800
+ v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
1801
+ v = axis.min + v * (axis.max - axis.min);
1802
+ ticks.push(v);
1803
+ }
1804
+ return ticks;
1805
+ };
1806
+
1807
+ // we might need an extra decimal since forced
1808
+ // ticks don't necessarily fit naturally
1809
+ if (!axis.mode && opts.tickDecimals == null) {
1810
+ var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
1811
+ ts = axis.tickGenerator(axis);
1812
+
1813
+ // only proceed if the tick interval rounded
1814
+ // with an extra decimal doesn't give us a
1815
+ // zero at end
1816
+ if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
1817
+ axis.tickDecimals = extraDec;
1818
+ }
1819
+ }
1820
+ }
1821
+ }
1822
+
1823
+ function setTicks(axis) {
1824
+ var oticks = axis.options.ticks, ticks = [];
1825
+ if (oticks == null || (typeof oticks == "number" && oticks > 0))
1826
+ ticks = axis.tickGenerator(axis);
1827
+ else if (oticks) {
1828
+ if ($.isFunction(oticks))
1829
+ // generate the ticks
1830
+ ticks = oticks(axis);
1831
+ else
1832
+ ticks = oticks;
1833
+ }
1834
+
1835
+ // clean up/labelify the supplied ticks, copy them over
1836
+ var i, v;
1837
+ axis.ticks = [];
1838
+ for (i = 0; i < ticks.length; ++i) {
1839
+ var label = null;
1840
+ var t = ticks[i];
1841
+ if (typeof t == "object") {
1842
+ v = +t[0];
1843
+ if (t.length > 1)
1844
+ label = t[1];
1845
+ }
1846
+ else
1847
+ v = +t;
1848
+ if (label == null)
1849
+ label = axis.tickFormatter(v, axis);
1850
+ if (!isNaN(v))
1851
+ axis.ticks.push({ v: v, label: label });
1852
+ }
1853
+ }
1854
+
1855
+ function snapRangeToTicks(axis, ticks) {
1856
+ if (axis.options.autoscaleMargin && ticks.length > 0) {
1857
+ // snap to ticks
1858
+ if (axis.options.min == null)
1859
+ axis.min = Math.min(axis.min, ticks[0].v);
1860
+ if (axis.options.max == null && ticks.length > 1)
1861
+ axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
1862
+ }
1863
+ }
1864
+
1865
+ function draw() {
1866
+
1867
+ surface.clear();
1868
+
1869
+ executeHooks(hooks.drawBackground, [ctx]);
1870
+
1871
+ var grid = options.grid;
1872
+
1873
+ // draw background, if any
1874
+ if (grid.show && grid.backgroundColor)
1875
+ drawBackground();
1876
+
1877
+ if (grid.show && !grid.aboveData) {
1878
+ drawGrid();
1879
+ }
1880
+
1881
+ for (var i = 0; i < series.length; ++i) {
1882
+ executeHooks(hooks.drawSeries, [ctx, series[i]]);
1883
+ drawSeries(series[i]);
1884
+ }
1885
+
1886
+ executeHooks(hooks.draw, [ctx]);
1887
+
1888
+ if (grid.show && grid.aboveData) {
1889
+ drawGrid();
1890
+ }
1891
+
1892
+ surface.render();
1893
+
1894
+ // A draw implies that either the axes or data have changed, so we
1895
+ // should probably update the overlay highlights as well.
1896
+
1897
+ triggerRedrawOverlay();
1898
+ }
1899
+
1900
+ function extractRange(ranges, coord) {
1901
+ var axis, from, to, key, axes = allAxes();
1902
+
1903
+ for (var i = 0; i < axes.length; ++i) {
1904
+ axis = axes[i];
1905
+ if (axis.direction == coord) {
1906
+ key = coord + axis.n + "axis";
1907
+ if (!ranges[key] && axis.n == 1)
1908
+ key = coord + "axis"; // support x1axis as xaxis
1909
+ if (ranges[key]) {
1910
+ from = ranges[key].from;
1911
+ to = ranges[key].to;
1912
+ break;
1913
+ }
1914
+ }
1915
+ }
1916
+
1917
+ // backwards-compat stuff - to be removed in future
1918
+ if (!ranges[key]) {
1919
+ axis = coord == "x" ? xaxes[0] : yaxes[0];
1920
+ from = ranges[coord + "1"];
1921
+ to = ranges[coord + "2"];
1922
+ }
1923
+
1924
+ // auto-reverse as an added bonus
1925
+ if (from != null && to != null && from > to) {
1926
+ var tmp = from;
1927
+ from = to;
1928
+ to = tmp;
1929
+ }
1930
+
1931
+ return { from: from, to: to, axis: axis };
1932
+ }
1933
+
1934
+ function drawBackground() {
1935
+ ctx.save();
1936
+ ctx.translate(plotOffset.left, plotOffset.top);
1937
+
1938
+ ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
1939
+ ctx.fillRect(0, 0, plotWidth, plotHeight);
1940
+ ctx.restore();
1941
+ }
1942
+
1943
+ function drawGrid() {
1944
+ var i, axes, bw, bc;
1945
+
1946
+ ctx.save();
1947
+ ctx.translate(plotOffset.left, plotOffset.top);
1948
+
1949
+ // draw markings
1950
+ var markings = options.grid.markings;
1951
+ if (markings) {
1952
+ if ($.isFunction(markings)) {
1953
+ axes = plot.getAxes();
1954
+ // xmin etc. is backwards compatibility, to be
1955
+ // removed in the future
1956
+ axes.xmin = axes.xaxis.min;
1957
+ axes.xmax = axes.xaxis.max;
1958
+ axes.ymin = axes.yaxis.min;
1959
+ axes.ymax = axes.yaxis.max;
1960
+
1961
+ markings = markings(axes);
1962
+ }
1963
+
1964
+ for (i = 0; i < markings.length; ++i) {
1965
+ var m = markings[i],
1966
+ xrange = extractRange(m, "x"),
1967
+ yrange = extractRange(m, "y");
1968
+
1969
+ // fill in missing
1970
+ if (xrange.from == null)
1971
+ xrange.from = xrange.axis.min;
1972
+ if (xrange.to == null)
1973
+ xrange.to = xrange.axis.max;
1974
+ if (yrange.from == null)
1975
+ yrange.from = yrange.axis.min;
1976
+ if (yrange.to == null)
1977
+ yrange.to = yrange.axis.max;
1978
+
1979
+ // clip
1980
+ if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
1981
+ yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
1982
+ continue;
1983
+
1984
+ xrange.from = Math.max(xrange.from, xrange.axis.min);
1985
+ xrange.to = Math.min(xrange.to, xrange.axis.max);
1986
+ yrange.from = Math.max(yrange.from, yrange.axis.min);
1987
+ yrange.to = Math.min(yrange.to, yrange.axis.max);
1988
+
1989
+ var xequal = xrange.from === xrange.to,
1990
+ yequal = yrange.from === yrange.to;
1991
+
1992
+ if (xequal && yequal) {
1993
+ continue;
1994
+ }
1995
+
1996
+ // then draw
1997
+ xrange.from = Math.floor(xrange.axis.p2c(xrange.from));
1998
+ xrange.to = Math.floor(xrange.axis.p2c(xrange.to));
1999
+ yrange.from = Math.floor(yrange.axis.p2c(yrange.from));
2000
+ yrange.to = Math.floor(yrange.axis.p2c(yrange.to));
2001
+
2002
+ if (xequal || yequal) {
2003
+ var lineWidth = m.lineWidth || options.grid.markingsLineWidth,
2004
+ subPixel = lineWidth % 2 ? 0.5 : 0;
2005
+ ctx.beginPath();
2006
+ ctx.strokeStyle = m.color || options.grid.markingsColor;
2007
+ ctx.lineWidth = lineWidth;
2008
+ if (xequal) {
2009
+ ctx.moveTo(xrange.to + subPixel, yrange.from);
2010
+ ctx.lineTo(xrange.to + subPixel, yrange.to);
2011
+ } else {
2012
+ ctx.moveTo(xrange.from, yrange.to + subPixel);
2013
+ ctx.lineTo(xrange.to, yrange.to + subPixel);
2014
+ }
2015
+ ctx.stroke();
2016
+ } else {
2017
+ ctx.fillStyle = m.color || options.grid.markingsColor;
2018
+ ctx.fillRect(xrange.from, yrange.to,
2019
+ xrange.to - xrange.from,
2020
+ yrange.from - yrange.to);
2021
+ }
2022
+ }
2023
+ }
2024
+
2025
+ // draw the ticks
2026
+ axes = allAxes();
2027
+ bw = options.grid.borderWidth;
2028
+
2029
+ for (var j = 0; j < axes.length; ++j) {
2030
+ var axis = axes[j], box = axis.box,
2031
+ t = axis.tickLength, x, y, xoff, yoff;
2032
+ if (!axis.show || axis.ticks.length == 0)
2033
+ continue;
2034
+
2035
+ ctx.lineWidth = 1;
2036
+
2037
+ // find the edges
2038
+ if (axis.direction == "x") {
2039
+ x = 0;
2040
+ if (t == "full")
2041
+ y = (axis.position == "top" ? 0 : plotHeight);
2042
+ else
2043
+ y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
2044
+ }
2045
+ else {
2046
+ y = 0;
2047
+ if (t == "full")
2048
+ x = (axis.position == "left" ? 0 : plotWidth);
2049
+ else
2050
+ x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
2051
+ }
2052
+
2053
+ // draw tick bar
2054
+ if (!axis.innermost) {
2055
+ ctx.strokeStyle = axis.options.color;
2056
+ ctx.beginPath();
2057
+ xoff = yoff = 0;
2058
+ if (axis.direction == "x")
2059
+ xoff = plotWidth + 1;
2060
+ else
2061
+ yoff = plotHeight + 1;
2062
+
2063
+ if (ctx.lineWidth == 1) {
2064
+ if (axis.direction == "x") {
2065
+ y = Math.floor(y) + 0.5;
2066
+ } else {
2067
+ x = Math.floor(x) + 0.5;
2068
+ }
2069
+ }
2070
+
2071
+ ctx.moveTo(x, y);
2072
+ ctx.lineTo(x + xoff, y + yoff);
2073
+ ctx.stroke();
2074
+ }
2075
+
2076
+ // draw ticks
2077
+
2078
+ ctx.strokeStyle = axis.options.tickColor;
2079
+
2080
+ ctx.beginPath();
2081
+ for (i = 0; i < axis.ticks.length; ++i) {
2082
+ var v = axis.ticks[i].v;
2083
+
2084
+ xoff = yoff = 0;
2085
+
2086
+ if (isNaN(v) || v < axis.min || v > axis.max
2087
+ // skip those lying on the axes if we got a border
2088
+ || (t == "full"
2089
+ && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
2090
+ && (v == axis.min || v == axis.max)))
2091
+ continue;
2092
+
2093
+ if (axis.direction == "x") {
2094
+ x = axis.p2c(v);
2095
+ yoff = t == "full" ? -plotHeight : t;
2096
+
2097
+ if (axis.position == "top")
2098
+ yoff = -yoff;
2099
+ }
2100
+ else {
2101
+ y = axis.p2c(v);
2102
+ xoff = t == "full" ? -plotWidth : t;
2103
+
2104
+ if (axis.position == "left")
2105
+ xoff = -xoff;
2106
+ }
2107
+
2108
+ if (ctx.lineWidth == 1) {
2109
+ if (axis.direction == "x")
2110
+ x = Math.floor(x) + 0.5;
2111
+ else
2112
+ y = Math.floor(y) + 0.5;
2113
+ }
2114
+
2115
+ ctx.moveTo(x, y);
2116
+ ctx.lineTo(x + xoff, y + yoff);
2117
+ }
2118
+
2119
+ ctx.stroke();
2120
+ }
2121
+
2122
+
2123
+ // draw border
2124
+ if (bw) {
2125
+ // If either borderWidth or borderColor is an object, then draw the border
2126
+ // line by line instead of as one rectangle
2127
+ bc = options.grid.borderColor;
2128
+ if(typeof bw == "object" || typeof bc == "object") {
2129
+ if (typeof bw !== "object") {
2130
+ bw = {top: bw, right: bw, bottom: bw, left: bw};
2131
+ }
2132
+ if (typeof bc !== "object") {
2133
+ bc = {top: bc, right: bc, bottom: bc, left: bc};
2134
+ }
2135
+
2136
+ if (bw.top > 0) {
2137
+ ctx.strokeStyle = bc.top;
2138
+ ctx.lineWidth = bw.top;
2139
+ ctx.beginPath();
2140
+ ctx.moveTo(0 - bw.left, 0 - bw.top/2);
2141
+ ctx.lineTo(plotWidth, 0 - bw.top/2);
2142
+ ctx.stroke();
2143
+ }
2144
+
2145
+ if (bw.right > 0) {
2146
+ ctx.strokeStyle = bc.right;
2147
+ ctx.lineWidth = bw.right;
2148
+ ctx.beginPath();
2149
+ ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
2150
+ ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
2151
+ ctx.stroke();
2152
+ }
2153
+
2154
+ if (bw.bottom > 0) {
2155
+ ctx.strokeStyle = bc.bottom;
2156
+ ctx.lineWidth = bw.bottom;
2157
+ ctx.beginPath();
2158
+ ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
2159
+ ctx.lineTo(0, plotHeight + bw.bottom / 2);
2160
+ ctx.stroke();
2161
+ }
2162
+
2163
+ if (bw.left > 0) {
2164
+ ctx.strokeStyle = bc.left;
2165
+ ctx.lineWidth = bw.left;
2166
+ ctx.beginPath();
2167
+ ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
2168
+ ctx.lineTo(0- bw.left/2, 0);
2169
+ ctx.stroke();
2170
+ }
2171
+ }
2172
+ else {
2173
+ ctx.lineWidth = bw;
2174
+ ctx.strokeStyle = options.grid.borderColor;
2175
+ ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
2176
+ }
2177
+ }
2178
+
2179
+ ctx.restore();
2180
+ }
2181
+
2182
+ function drawAxisLabels() {
2183
+
2184
+ $.each(allAxes(), function (_, axis) {
2185
+ var box = axis.box,
2186
+ legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
2187
+ layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
2188
+ font = axis.options.font || "flot-tick-label tickLabel",
2189
+ tick, x, y, halign, valign;
2190
+
2191
+ // Remove text before checking for axis.show and ticks.length;
2192
+ // otherwise plugins, like flot-tickrotor, that draw their own
2193
+ // tick labels will end up with both theirs and the defaults.
2194
+
2195
+ surface.removeText(layer);
2196
+
2197
+ if (!axis.show || axis.ticks.length == 0)
2198
+ return;
2199
+
2200
+ for (var i = 0; i < axis.ticks.length; ++i) {
2201
+
2202
+ tick = axis.ticks[i];
2203
+ if (!tick.label || tick.v < axis.min || tick.v > axis.max)
2204
+ continue;
2205
+
2206
+ if (axis.direction == "x") {
2207
+ halign = "center";
2208
+ x = plotOffset.left + axis.p2c(tick.v);
2209
+ if (axis.position == "bottom") {
2210
+ y = box.top + box.padding;
2211
+ } else {
2212
+ y = box.top + box.height - box.padding;
2213
+ valign = "bottom";
2214
+ }
2215
+ } else {
2216
+ valign = "middle";
2217
+ y = plotOffset.top + axis.p2c(tick.v);
2218
+ if (axis.position == "left") {
2219
+ x = box.left + box.width - box.padding;
2220
+ halign = "right";
2221
+ } else {
2222
+ x = box.left + box.padding;
2223
+ }
2224
+ }
2225
+
2226
+ surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
2227
+ }
2228
+ });
2229
+ }
2230
+
2231
+ function drawSeries(series) {
2232
+ if (series.lines.show)
2233
+ drawSeriesLines(series);
2234
+ if (series.bars.show)
2235
+ drawSeriesBars(series);
2236
+ if (series.points.show)
2237
+ drawSeriesPoints(series);
2238
+ }
2239
+
2240
+ function drawSeriesLines(series) {
2241
+ function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
2242
+ var points = datapoints.points,
2243
+ ps = datapoints.pointsize,
2244
+ prevx = null, prevy = null;
2245
+
2246
+ ctx.beginPath();
2247
+ for (var i = ps; i < points.length; i += ps) {
2248
+ var x1 = points[i - ps], y1 = points[i - ps + 1],
2249
+ x2 = points[i], y2 = points[i + 1];
2250
+
2251
+ if (x1 == null || x2 == null)
2252
+ continue;
2253
+
2254
+ // clip with ymin
2255
+ if (y1 <= y2 && y1 < axisy.min) {
2256
+ if (y2 < axisy.min)
2257
+ continue; // line segment is outside
2258
+ // compute new intersection point
2259
+ x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
2260
+ y1 = axisy.min;
2261
+ }
2262
+ else if (y2 <= y1 && y2 < axisy.min) {
2263
+ if (y1 < axisy.min)
2264
+ continue;
2265
+ x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
2266
+ y2 = axisy.min;
2267
+ }
2268
+
2269
+ // clip with ymax
2270
+ if (y1 >= y2 && y1 > axisy.max) {
2271
+ if (y2 > axisy.max)
2272
+ continue;
2273
+ x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
2274
+ y1 = axisy.max;
2275
+ }
2276
+ else if (y2 >= y1 && y2 > axisy.max) {
2277
+ if (y1 > axisy.max)
2278
+ continue;
2279
+ x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
2280
+ y2 = axisy.max;
2281
+ }
2282
+
2283
+ // clip with xmin
2284
+ if (x1 <= x2 && x1 < axisx.min) {
2285
+ if (x2 < axisx.min)
2286
+ continue;
2287
+ y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
2288
+ x1 = axisx.min;
2289
+ }
2290
+ else if (x2 <= x1 && x2 < axisx.min) {
2291
+ if (x1 < axisx.min)
2292
+ continue;
2293
+ y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
2294
+ x2 = axisx.min;
2295
+ }
2296
+
2297
+ // clip with xmax
2298
+ if (x1 >= x2 && x1 > axisx.max) {
2299
+ if (x2 > axisx.max)
2300
+ continue;
2301
+ y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
2302
+ x1 = axisx.max;
2303
+ }
2304
+ else if (x2 >= x1 && x2 > axisx.max) {
2305
+ if (x1 > axisx.max)
2306
+ continue;
2307
+ y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
2308
+ x2 = axisx.max;
2309
+ }
2310
+
2311
+ if (x1 != prevx || y1 != prevy)
2312
+ ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
2313
+
2314
+ prevx = x2;
2315
+ prevy = y2;
2316
+ ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
2317
+ }
2318
+ ctx.stroke();
2319
+ }
2320
+
2321
+ function plotLineArea(datapoints, axisx, axisy) {
2322
+ var points = datapoints.points,
2323
+ ps = datapoints.pointsize,
2324
+ bottom = Math.min(Math.max(0, axisy.min), axisy.max),
2325
+ i = 0, top, areaOpen = false,
2326
+ ypos = 1, segmentStart = 0, segmentEnd = 0;
2327
+
2328
+ // we process each segment in two turns, first forward
2329
+ // direction to sketch out top, then once we hit the
2330
+ // end we go backwards to sketch the bottom
2331
+ while (true) {
2332
+ if (ps > 0 && i > points.length + ps)
2333
+ break;
2334
+
2335
+ i += ps; // ps is negative if going backwards
2336
+
2337
+ var x1 = points[i - ps],
2338
+ y1 = points[i - ps + ypos],
2339
+ x2 = points[i], y2 = points[i + ypos];
2340
+
2341
+ if (areaOpen) {
2342
+ if (ps > 0 && x1 != null && x2 == null) {
2343
+ // at turning point
2344
+ segmentEnd = i;
2345
+ ps = -ps;
2346
+ ypos = 2;
2347
+ continue;
2348
+ }
2349
+
2350
+ if (ps < 0 && i == segmentStart + ps) {
2351
+ // done with the reverse sweep
2352
+ ctx.fill();
2353
+ areaOpen = false;
2354
+ ps = -ps;
2355
+ ypos = 1;
2356
+ i = segmentStart = segmentEnd + ps;
2357
+ continue;
2358
+ }
2359
+ }
2360
+
2361
+ if (x1 == null || x2 == null)
2362
+ continue;
2363
+
2364
+ // clip x values
2365
+
2366
+ // clip with xmin
2367
+ if (x1 <= x2 && x1 < axisx.min) {
2368
+ if (x2 < axisx.min)
2369
+ continue;
2370
+ y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
2371
+ x1 = axisx.min;
2372
+ }
2373
+ else if (x2 <= x1 && x2 < axisx.min) {
2374
+ if (x1 < axisx.min)
2375
+ continue;
2376
+ y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
2377
+ x2 = axisx.min;
2378
+ }
2379
+
2380
+ // clip with xmax
2381
+ if (x1 >= x2 && x1 > axisx.max) {
2382
+ if (x2 > axisx.max)
2383
+ continue;
2384
+ y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
2385
+ x1 = axisx.max;
2386
+ }
2387
+ else if (x2 >= x1 && x2 > axisx.max) {
2388
+ if (x1 > axisx.max)
2389
+ continue;
2390
+ y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
2391
+ x2 = axisx.max;
2392
+ }
2393
+
2394
+ if (!areaOpen) {
2395
+ // open area
2396
+ ctx.beginPath();
2397
+ ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
2398
+ areaOpen = true;
2399
+ }
2400
+
2401
+ // now first check the case where both is outside
2402
+ if (y1 >= axisy.max && y2 >= axisy.max) {
2403
+ ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
2404
+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
2405
+ continue;
2406
+ }
2407
+ else if (y1 <= axisy.min && y2 <= axisy.min) {
2408
+ ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
2409
+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
2410
+ continue;
2411
+ }
2412
+
2413
+ // else it's a bit more complicated, there might
2414
+ // be a flat maxed out rectangle first, then a
2415
+ // triangular cutout or reverse; to find these
2416
+ // keep track of the current x values
2417
+ var x1old = x1, x2old = x2;
2418
+
2419
+ // clip the y values, without shortcutting, we
2420
+ // go through all cases in turn
2421
+
2422
+ // clip with ymin
2423
+ if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
2424
+ x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
2425
+ y1 = axisy.min;
2426
+ }
2427
+ else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
2428
+ x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
2429
+ y2 = axisy.min;
2430
+ }
2431
+
2432
+ // clip with ymax
2433
+ if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
2434
+ x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
2435
+ y1 = axisy.max;
2436
+ }
2437
+ else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
2438
+ x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
2439
+ y2 = axisy.max;
2440
+ }
2441
+
2442
+ // if the x value was changed we got a rectangle
2443
+ // to fill
2444
+ if (x1 != x1old) {
2445
+ ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
2446
+ // it goes to (x1, y1), but we fill that below
2447
+ }
2448
+
2449
+ // fill triangular section, this sometimes result
2450
+ // in redundant points if (x1, y1) hasn't changed
2451
+ // from previous line to, but we just ignore that
2452
+ ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
2453
+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
2454
+
2455
+ // fill the other rectangle if it's there
2456
+ if (x2 != x2old) {
2457
+ ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
2458
+ ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
2459
+ }
2460
+ }
2461
+ }
2462
+
2463
+ ctx.save();
2464
+ ctx.translate(plotOffset.left, plotOffset.top);
2465
+ ctx.lineJoin = "round";
2466
+
2467
+ var lw = series.lines.lineWidth,
2468
+ sw = series.shadowSize;
2469
+ // FIXME: consider another form of shadow when filling is turned on
2470
+ if (lw > 0 && sw > 0) {
2471
+ // draw shadow as a thick and thin line with transparency
2472
+ ctx.lineWidth = sw;
2473
+ ctx.strokeStyle = "rgba(0,0,0,0.1)";
2474
+ // position shadow at angle from the mid of line
2475
+ var angle = Math.PI/18;
2476
+ plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
2477
+ ctx.lineWidth = sw/2;
2478
+ plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
2479
+ }
2480
+
2481
+ ctx.lineWidth = lw;
2482
+ ctx.strokeStyle = series.color;
2483
+ var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
2484
+ if (fillStyle) {
2485
+ ctx.fillStyle = fillStyle;
2486
+ plotLineArea(series.datapoints, series.xaxis, series.yaxis);
2487
+ }
2488
+
2489
+ if (lw > 0)
2490
+ plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
2491
+ ctx.restore();
2492
+ }
2493
+
2494
+ function drawSeriesPoints(series) {
2495
+ function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
2496
+ var points = datapoints.points, ps = datapoints.pointsize;
2497
+
2498
+ for (var i = 0; i < points.length; i += ps) {
2499
+ var x = points[i], y = points[i + 1];
2500
+ if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
2501
+ continue;
2502
+
2503
+ ctx.beginPath();
2504
+ x = axisx.p2c(x);
2505
+ y = axisy.p2c(y) + offset;
2506
+ if (symbol == "circle")
2507
+ ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
2508
+ else
2509
+ symbol(ctx, x, y, radius, shadow);
2510
+ ctx.closePath();
2511
+
2512
+ if (fillStyle) {
2513
+ ctx.fillStyle = fillStyle;
2514
+ ctx.fill();
2515
+ }
2516
+ ctx.stroke();
2517
+ }
2518
+ }
2519
+
2520
+ ctx.save();
2521
+ ctx.translate(plotOffset.left, plotOffset.top);
2522
+
2523
+ var lw = series.points.lineWidth,
2524
+ sw = series.shadowSize,
2525
+ radius = series.points.radius,
2526
+ symbol = series.points.symbol;
2527
+
2528
+ // If the user sets the line width to 0, we change it to a very
2529
+ // small value. A line width of 0 seems to force the default of 1.
2530
+ // Doing the conditional here allows the shadow setting to still be
2531
+ // optional even with a lineWidth of 0.
2532
+
2533
+ if( lw == 0 )
2534
+ lw = 0.0001;
2535
+
2536
+ if (lw > 0 && sw > 0) {
2537
+ // draw shadow in two steps
2538
+ var w = sw / 2;
2539
+ ctx.lineWidth = w;
2540
+ ctx.strokeStyle = "rgba(0,0,0,0.1)";
2541
+ plotPoints(series.datapoints, radius, null, w + w/2, true,
2542
+ series.xaxis, series.yaxis, symbol);
2543
+
2544
+ ctx.strokeStyle = "rgba(0,0,0,0.2)";
2545
+ plotPoints(series.datapoints, radius, null, w/2, true,
2546
+ series.xaxis, series.yaxis, symbol);
2547
+ }
2548
+
2549
+ ctx.lineWidth = lw;
2550
+ ctx.strokeStyle = series.color;
2551
+ plotPoints(series.datapoints, radius,
2552
+ getFillStyle(series.points, series.color), 0, false,
2553
+ series.xaxis, series.yaxis, symbol);
2554
+ ctx.restore();
2555
+ }
2556
+
2557
+ function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
2558
+ var left, right, bottom, top,
2559
+ drawLeft, drawRight, drawTop, drawBottom,
2560
+ tmp;
2561
+
2562
+ // in horizontal mode, we start the bar from the left
2563
+ // instead of from the bottom so it appears to be
2564
+ // horizontal rather than vertical
2565
+ if (horizontal) {
2566
+ drawBottom = drawRight = drawTop = true;
2567
+ drawLeft = false;
2568
+ left = b;
2569
+ right = x;
2570
+ top = y + barLeft;
2571
+ bottom = y + barRight;
2572
+
2573
+ // account for negative bars
2574
+ if (right < left) {
2575
+ tmp = right;
2576
+ right = left;
2577
+ left = tmp;
2578
+ drawLeft = true;
2579
+ drawRight = false;
2580
+ }
2581
+ }
2582
+ else {
2583
+ drawLeft = drawRight = drawTop = true;
2584
+ drawBottom = false;
2585
+ left = x + barLeft;
2586
+ right = x + barRight;
2587
+ bottom = b;
2588
+ top = y;
2589
+
2590
+ // account for negative bars
2591
+ if (top < bottom) {
2592
+ tmp = top;
2593
+ top = bottom;
2594
+ bottom = tmp;
2595
+ drawBottom = true;
2596
+ drawTop = false;
2597
+ }
2598
+ }
2599
+
2600
+ // clip
2601
+ if (right < axisx.min || left > axisx.max ||
2602
+ top < axisy.min || bottom > axisy.max)
2603
+ return;
2604
+
2605
+ if (left < axisx.min) {
2606
+ left = axisx.min;
2607
+ drawLeft = false;
2608
+ }
2609
+
2610
+ if (right > axisx.max) {
2611
+ right = axisx.max;
2612
+ drawRight = false;
2613
+ }
2614
+
2615
+ if (bottom < axisy.min) {
2616
+ bottom = axisy.min;
2617
+ drawBottom = false;
2618
+ }
2619
+
2620
+ if (top > axisy.max) {
2621
+ top = axisy.max;
2622
+ drawTop = false;
2623
+ }
2624
+
2625
+ left = axisx.p2c(left);
2626
+ bottom = axisy.p2c(bottom);
2627
+ right = axisx.p2c(right);
2628
+ top = axisy.p2c(top);
2629
+
2630
+ // fill the bar
2631
+ if (fillStyleCallback) {
2632
+ c.fillStyle = fillStyleCallback(bottom, top);
2633
+ c.fillRect(left, top, right - left, bottom - top)
2634
+ }
2635
+
2636
+ // draw outline
2637
+ if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
2638
+ c.beginPath();
2639
+
2640
+ // FIXME: inline moveTo is buggy with excanvas
2641
+ c.moveTo(left, bottom);
2642
+ if (drawLeft)
2643
+ c.lineTo(left, top);
2644
+ else
2645
+ c.moveTo(left, top);
2646
+ if (drawTop)
2647
+ c.lineTo(right, top);
2648
+ else
2649
+ c.moveTo(right, top);
2650
+ if (drawRight)
2651
+ c.lineTo(right, bottom);
2652
+ else
2653
+ c.moveTo(right, bottom);
2654
+ if (drawBottom)
2655
+ c.lineTo(left, bottom);
2656
+ else
2657
+ c.moveTo(left, bottom);
2658
+ c.stroke();
2659
+ }
2660
+ }
2661
+
2662
+ function drawSeriesBars(series) {
2663
+ function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
2664
+ var points = datapoints.points, ps = datapoints.pointsize;
2665
+
2666
+ for (var i = 0; i < points.length; i += ps) {
2667
+ if (points[i] == null)
2668
+ continue;
2669
+ drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
2670
+ }
2671
+ }
2672
+
2673
+ ctx.save();
2674
+ ctx.translate(plotOffset.left, plotOffset.top);
2675
+
2676
+ // FIXME: figure out a way to add shadows (for instance along the right edge)
2677
+ ctx.lineWidth = series.bars.lineWidth;
2678
+ ctx.strokeStyle = series.color;
2679
+
2680
+ var barLeft;
2681
+
2682
+ switch (series.bars.align) {
2683
+ case "left":
2684
+ barLeft = 0;
2685
+ break;
2686
+ case "right":
2687
+ barLeft = -series.bars.barWidth;
2688
+ break;
2689
+ default:
2690
+ barLeft = -series.bars.barWidth / 2;
2691
+ }
2692
+
2693
+ var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
2694
+ plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
2695
+ ctx.restore();
2696
+ }
2697
+
2698
+ function getFillStyle(filloptions, seriesColor, bottom, top) {
2699
+ var fill = filloptions.fill;
2700
+ if (!fill)
2701
+ return null;
2702
+
2703
+ if (filloptions.fillColor)
2704
+ return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
2705
+
2706
+ var c = $.color.parse(seriesColor);
2707
+ c.a = typeof fill == "number" ? fill : 0.4;
2708
+ c.normalize();
2709
+ return c.toString();
2710
+ }
2711
+
2712
+ function insertLegend() {
2713
+
2714
+ if (options.legend.container != null) {
2715
+ $(options.legend.container).html("");
2716
+ } else {
2717
+ placeholder.find(".legend").remove();
2718
+ }
2719
+
2720
+ if (!options.legend.show) {
2721
+ return;
2722
+ }
2723
+
2724
+ var fragments = [], entries = [], rowStarted = false,
2725
+ lf = options.legend.labelFormatter, s, label;
2726
+
2727
+ // Build a list of legend entries, with each having a label and a color
2728
+
2729
+ for (var i = 0; i < series.length; ++i) {
2730
+ s = series[i];
2731
+ if (s.label) {
2732
+ label = lf ? lf(s.label, s) : s.label;
2733
+ if (label) {
2734
+ entries.push({
2735
+ label: label,
2736
+ color: s.color
2737
+ });
2738
+ }
2739
+ }
2740
+ }
2741
+
2742
+ // Sort the legend using either the default or a custom comparator
2743
+
2744
+ if (options.legend.sorted) {
2745
+ if ($.isFunction(options.legend.sorted)) {
2746
+ entries.sort(options.legend.sorted);
2747
+ } else if (options.legend.sorted == "reverse") {
2748
+ entries.reverse();
2749
+ } else {
2750
+ var ascending = options.legend.sorted != "descending";
2751
+ entries.sort(function(a, b) {
2752
+ return a.label == b.label ? 0 : (
2753
+ (a.label < b.label) != ascending ? 1 : -1 // Logical XOR
2754
+ );
2755
+ });
2756
+ }
2757
+ }
2758
+
2759
+ // Generate markup for the list of entries, in their final order
2760
+
2761
+ for (var i = 0; i < entries.length; ++i) {
2762
+
2763
+ var entry = entries[i];
2764
+
2765
+ if (i % options.legend.noColumns == 0) {
2766
+ if (rowStarted)
2767
+ fragments.push('</tr>');
2768
+ fragments.push('<tr>');
2769
+ rowStarted = true;
2770
+ }
2771
+
2772
+ fragments.push(
2773
+ '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
2774
+ '<td class="legendLabel">' + entry.label + '</td>'
2775
+ );
2776
+ }
2777
+
2778
+ if (rowStarted)
2779
+ fragments.push('</tr>');
2780
+
2781
+ if (fragments.length == 0)
2782
+ return;
2783
+
2784
+ var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
2785
+ if (options.legend.container != null)
2786
+ $(options.legend.container).html(table);
2787
+ else {
2788
+ var pos = "",
2789
+ p = options.legend.position,
2790
+ m = options.legend.margin;
2791
+ if (m[0] == null)
2792
+ m = [m, m];
2793
+ if (p.charAt(0) == "n")
2794
+ pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
2795
+ else if (p.charAt(0) == "s")
2796
+ pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
2797
+ if (p.charAt(1) == "e")
2798
+ pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
2799
+ else if (p.charAt(1) == "w")
2800
+ pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
2801
+ var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
2802
+ if (options.legend.backgroundOpacity != 0.0) {
2803
+ // put in the transparent background
2804
+ // separately to avoid blended labels and
2805
+ // label boxes
2806
+ var c = options.legend.backgroundColor;
2807
+ if (c == null) {
2808
+ c = options.grid.backgroundColor;
2809
+ if (c && typeof c == "string")
2810
+ c = $.color.parse(c);
2811
+ else
2812
+ c = $.color.extract(legend, 'background-color');
2813
+ c.a = 1;
2814
+ c = c.toString();
2815
+ }
2816
+ var div = legend.children();
2817
+ $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
2818
+ }
2819
+ }
2820
+ }
2821
+
2822
+
2823
+ // interactive features
2824
+
2825
+ var highlights = [],
2826
+ redrawTimeout = null;
2827
+
2828
+ // returns the data item the mouse is over, or null if none is found
2829
+ function findNearbyItem(mouseX, mouseY, seriesFilter) {
2830
+ var maxDistance = options.grid.mouseActiveRadius,
2831
+ smallestDistance = maxDistance * maxDistance + 1,
2832
+ item = null, foundPoint = false, i, j, ps;
2833
+
2834
+ for (i = series.length - 1; i >= 0; --i) {
2835
+ if (!seriesFilter(series[i]))
2836
+ continue;
2837
+
2838
+ var s = series[i],
2839
+ axisx = s.xaxis,
2840
+ axisy = s.yaxis,
2841
+ points = s.datapoints.points,
2842
+ mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
2843
+ my = axisy.c2p(mouseY),
2844
+ maxx = maxDistance / axisx.scale,
2845
+ maxy = maxDistance / axisy.scale;
2846
+
2847
+ ps = s.datapoints.pointsize;
2848
+ // with inverse transforms, we can't use the maxx/maxy
2849
+ // optimization, sadly
2850
+ if (axisx.options.inverseTransform)
2851
+ maxx = Number.MAX_VALUE;
2852
+ if (axisy.options.inverseTransform)
2853
+ maxy = Number.MAX_VALUE;
2854
+
2855
+ if (s.lines.show || s.points.show) {
2856
+ for (j = 0; j < points.length; j += ps) {
2857
+ var x = points[j], y = points[j + 1];
2858
+ if (x == null)
2859
+ continue;
2860
+
2861
+ // For points and lines, the cursor must be within a
2862
+ // certain distance to the data point
2863
+ if (x - mx > maxx || x - mx < -maxx ||
2864
+ y - my > maxy || y - my < -maxy)
2865
+ continue;
2866
+
2867
+ // We have to calculate distances in pixels, not in
2868
+ // data units, because the scales of the axes may be different
2869
+ var dx = Math.abs(axisx.p2c(x) - mouseX),
2870
+ dy = Math.abs(axisy.p2c(y) - mouseY),
2871
+ dist = dx * dx + dy * dy; // we save the sqrt
2872
+
2873
+ // use <= to ensure last point takes precedence
2874
+ // (last generally means on top of)
2875
+ if (dist < smallestDistance) {
2876
+ smallestDistance = dist;
2877
+ item = [i, j / ps];
2878
+ }
2879
+ }
2880
+ }
2881
+
2882
+ if (s.bars.show && !item) { // no other point can be nearby
2883
+
2884
+ var barLeft, barRight;
2885
+
2886
+ switch (s.bars.align) {
2887
+ case "left":
2888
+ barLeft = 0;
2889
+ break;
2890
+ case "right":
2891
+ barLeft = -s.bars.barWidth;
2892
+ break;
2893
+ default:
2894
+ barLeft = -s.bars.barWidth / 2;
2895
+ }
2896
+
2897
+ barRight = barLeft + s.bars.barWidth;
2898
+
2899
+ for (j = 0; j < points.length; j += ps) {
2900
+ var x = points[j], y = points[j + 1], b = points[j + 2];
2901
+ if (x == null)
2902
+ continue;
2903
+
2904
+ // for a bar graph, the cursor must be inside the bar
2905
+ if (series[i].bars.horizontal ?
2906
+ (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
2907
+ my >= y + barLeft && my <= y + barRight) :
2908
+ (mx >= x + barLeft && mx <= x + barRight &&
2909
+ my >= Math.min(b, y) && my <= Math.max(b, y)))
2910
+ item = [i, j / ps];
2911
+ }
2912
+ }
2913
+ }
2914
+
2915
+ if (item) {
2916
+ i = item[0];
2917
+ j = item[1];
2918
+ ps = series[i].datapoints.pointsize;
2919
+
2920
+ return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
2921
+ dataIndex: j,
2922
+ series: series[i],
2923
+ seriesIndex: i };
2924
+ }
2925
+
2926
+ return null;
2927
+ }
2928
+
2929
+ function onMouseMove(e) {
2930
+ if (options.grid.hoverable)
2931
+ triggerClickHoverEvent("plothover", e,
2932
+ function (s) { return s["hoverable"] != false; });
2933
+ }
2934
+
2935
+ function onMouseLeave(e) {
2936
+ if (options.grid.hoverable)
2937
+ triggerClickHoverEvent("plothover", e,
2938
+ function (s) { return false; });
2939
+ }
2940
+
2941
+ function onClick(e) {
2942
+ triggerClickHoverEvent("plotclick", e,
2943
+ function (s) { return s["clickable"] != false; });
2944
+ }
2945
+
2946
+ // trigger click or hover event (they send the same parameters
2947
+ // so we share their code)
2948
+ function triggerClickHoverEvent(eventname, event, seriesFilter) {
2949
+ var offset = eventHolder.offset(),
2950
+ canvasX = event.pageX - offset.left - plotOffset.left,
2951
+ canvasY = event.pageY - offset.top - plotOffset.top,
2952
+ pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
2953
+
2954
+ pos.pageX = event.pageX;
2955
+ pos.pageY = event.pageY;
2956
+
2957
+ var item = findNearbyItem(canvasX, canvasY, seriesFilter);
2958
+
2959
+ if (item) {
2960
+ // fill in mouse pos for any listeners out there
2961
+ item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
2962
+ item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
2963
+ }
2964
+
2965
+ if (options.grid.autoHighlight) {
2966
+ // clear auto-highlights
2967
+ for (var i = 0; i < highlights.length; ++i) {
2968
+ var h = highlights[i];
2969
+ if (h.auto == eventname &&
2970
+ !(item && h.series == item.series &&
2971
+ h.point[0] == item.datapoint[0] &&
2972
+ h.point[1] == item.datapoint[1]))
2973
+ unhighlight(h.series, h.point);
2974
+ }
2975
+
2976
+ if (item)
2977
+ highlight(item.series, item.datapoint, eventname);
2978
+ }
2979
+
2980
+ placeholder.trigger(eventname, [ pos, item ]);
2981
+ }
2982
+
2983
+ function triggerRedrawOverlay() {
2984
+ var t = options.interaction.redrawOverlayInterval;
2985
+ if (t == -1) { // skip event queue
2986
+ drawOverlay();
2987
+ return;
2988
+ }
2989
+
2990
+ if (!redrawTimeout)
2991
+ redrawTimeout = setTimeout(drawOverlay, t);
2992
+ }
2993
+
2994
+ function drawOverlay() {
2995
+ redrawTimeout = null;
2996
+
2997
+ // draw highlights
2998
+ octx.save();
2999
+ overlay.clear();
3000
+ octx.translate(plotOffset.left, plotOffset.top);
3001
+
3002
+ var i, hi;
3003
+ for (i = 0; i < highlights.length; ++i) {
3004
+ hi = highlights[i];
3005
+
3006
+ if (hi.series.bars.show)
3007
+ drawBarHighlight(hi.series, hi.point);
3008
+ else
3009
+ drawPointHighlight(hi.series, hi.point);
3010
+ }
3011
+ octx.restore();
3012
+
3013
+ executeHooks(hooks.drawOverlay, [octx]);
3014
+ }
3015
+
3016
+ function highlight(s, point, auto) {
3017
+ if (typeof s == "number")
3018
+ s = series[s];
3019
+
3020
+ if (typeof point == "number") {
3021
+ var ps = s.datapoints.pointsize;
3022
+ point = s.datapoints.points.slice(ps * point, ps * (point + 1));
3023
+ }
3024
+
3025
+ var i = indexOfHighlight(s, point);
3026
+ if (i == -1) {
3027
+ highlights.push({ series: s, point: point, auto: auto });
3028
+
3029
+ triggerRedrawOverlay();
3030
+ }
3031
+ else if (!auto)
3032
+ highlights[i].auto = false;
3033
+ }
3034
+
3035
+ function unhighlight(s, point) {
3036
+ if (s == null && point == null) {
3037
+ highlights = [];
3038
+ triggerRedrawOverlay();
3039
+ return;
3040
+ }
3041
+
3042
+ if (typeof s == "number")
3043
+ s = series[s];
3044
+
3045
+ if (typeof point == "number") {
3046
+ var ps = s.datapoints.pointsize;
3047
+ point = s.datapoints.points.slice(ps * point, ps * (point + 1));
3048
+ }
3049
+
3050
+ var i = indexOfHighlight(s, point);
3051
+ if (i != -1) {
3052
+ highlights.splice(i, 1);
3053
+
3054
+ triggerRedrawOverlay();
3055
+ }
3056
+ }
3057
+
3058
+ function indexOfHighlight(s, p) {
3059
+ for (var i = 0; i < highlights.length; ++i) {
3060
+ var h = highlights[i];
3061
+ if (h.series == s && h.point[0] == p[0]
3062
+ && h.point[1] == p[1])
3063
+ return i;
3064
+ }
3065
+ return -1;
3066
+ }
3067
+
3068
+ function drawPointHighlight(series, point) {
3069
+ var x = point[0], y = point[1],
3070
+ axisx = series.xaxis, axisy = series.yaxis,
3071
+ highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
3072
+
3073
+ if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
3074
+ return;
3075
+
3076
+ var pointRadius = series.points.radius + series.points.lineWidth / 2;
3077
+ octx.lineWidth = pointRadius;
3078
+ octx.strokeStyle = highlightColor;
3079
+ var radius = 1.5 * pointRadius;
3080
+ x = axisx.p2c(x);
3081
+ y = axisy.p2c(y);
3082
+
3083
+ octx.beginPath();
3084
+ if (series.points.symbol == "circle")
3085
+ octx.arc(x, y, radius, 0, 2 * Math.PI, false);
3086
+ else
3087
+ series.points.symbol(octx, x, y, radius, false);
3088
+ octx.closePath();
3089
+ octx.stroke();
3090
+ }
3091
+
3092
+ function drawBarHighlight(series, point) {
3093
+ var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
3094
+ fillStyle = highlightColor,
3095
+ barLeft;
3096
+
3097
+ switch (series.bars.align) {
3098
+ case "left":
3099
+ barLeft = 0;
3100
+ break;
3101
+ case "right":
3102
+ barLeft = -series.bars.barWidth;
3103
+ break;
3104
+ default:
3105
+ barLeft = -series.bars.barWidth / 2;
3106
+ }
3107
+
3108
+ octx.lineWidth = series.bars.lineWidth;
3109
+ octx.strokeStyle = highlightColor;
3110
+
3111
+ drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
3112
+ function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
3113
+ }
3114
+
3115
+ function getColorOrGradient(spec, bottom, top, defaultColor) {
3116
+ if (typeof spec == "string")
3117
+ return spec;
3118
+ else {
3119
+ // assume this is a gradient spec; IE currently only
3120
+ // supports a simple vertical gradient properly, so that's
3121
+ // what we support too
3122
+ var gradient = ctx.createLinearGradient(0, top, 0, bottom);
3123
+
3124
+ for (var i = 0, l = spec.colors.length; i < l; ++i) {
3125
+ var c = spec.colors[i];
3126
+ if (typeof c != "string") {
3127
+ var co = $.color.parse(defaultColor);
3128
+ if (c.brightness != null)
3129
+ co = co.scale('rgb', c.brightness);
3130
+ if (c.opacity != null)
3131
+ co.a *= c.opacity;
3132
+ c = co.toString();
3133
+ }
3134
+ gradient.addColorStop(i / (l - 1), c);
3135
+ }
3136
+
3137
+ return gradient;
3138
+ }
3139
+ }
3140
+ }
3141
+
3142
+ // Add the plot function to the top level of the jQuery object
3143
+
3144
+ $.plot = function(placeholder, data, options) {
3145
+ //var t0 = new Date();
3146
+ var plot = new Plot($(placeholder), data, options, $.plot.plugins);
3147
+ //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
3148
+ return plot;
3149
+ };
3150
+
3151
+ $.plot.version = "0.8.3";
3152
+
3153
+ $.plot.plugins = [];
3154
+
3155
+ // Also add the plot function as a chainable property
3156
+
3157
+ $.fn.plot = function(data, options) {
3158
+ return this.each(function() {
3159
+ $.plot(this, data, options);
3160
+ });
3161
+ };
3162
+
3163
+ // round to nearby lower multiple of base
3164
+ function floorInBase(n, base) {
3165
+ return base * Math.floor(n / base);
3166
+ }
3167
+
3168
+ })(jQuery);
3169
+
3170
+ /* Pretty handling of time axes.
3171
+
3172
+ Copyright (c) 2007-2014 IOLA and Ole Laursen.
3173
+ Licensed under the MIT license.
3174
+
3175
+ Set axis.mode to "time" to enable. See the section "Time series data" in
3176
+ API.txt for details.
3177
+
3178
+ */
3179
+
3180
+ (function($) {
3181
+
3182
+ var options = {
3183
+ xaxis: {
3184
+ timezone: null, // "browser" for local to the client or timezone for timezone-js
3185
+ timeformat: null, // format string to use
3186
+ twelveHourClock: false, // 12 or 24 time in time mode
3187
+ monthNames: null // list of names of months
3188
+ }
3189
+ };
3190
+
3191
+ // round to nearby lower multiple of base
3192
+
3193
+ function floorInBase(n, base) {
3194
+ return base * Math.floor(n / base);
3195
+ }
3196
+
3197
+ // Returns a string with the date d formatted according to fmt.
3198
+ // A subset of the Open Group's strftime format is supported.
3199
+
3200
+ function formatDate(d, fmt, monthNames, dayNames) {
3201
+
3202
+ if (typeof d.strftime == "function") {
3203
+ return d.strftime(fmt);
3204
+ }
3205
+
3206
+ var leftPad = function(n, pad) {
3207
+ n = "" + n;
3208
+ pad = "" + (pad == null ? "0" : pad);
3209
+ return n.length == 1 ? pad + n : n;
3210
+ };
3211
+
3212
+ var r = [];
3213
+ var escape = false;
3214
+ var hours = d.getHours();
3215
+ var isAM = hours < 12;
3216
+
3217
+ if (monthNames == null) {
3218
+ monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
3219
+ }
3220
+
3221
+ if (dayNames == null) {
3222
+ dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
3223
+ }
3224
+
3225
+ var hours12;
3226
+
3227
+ if (hours > 12) {
3228
+ hours12 = hours - 12;
3229
+ } else if (hours == 0) {
3230
+ hours12 = 12;
3231
+ } else {
3232
+ hours12 = hours;
3233
+ }
3234
+
3235
+ for (var i = 0; i < fmt.length; ++i) {
3236
+
3237
+ var c = fmt.charAt(i);
3238
+
3239
+ if (escape) {
3240
+ switch (c) {
3241
+ case 'a': c = "" + dayNames[d.getDay()]; break;
3242
+ case 'b': c = "" + monthNames[d.getMonth()]; break;
3243
+ case 'd': c = leftPad(d.getDate()); break;
3244
+ case 'e': c = leftPad(d.getDate(), " "); break;
3245
+ case 'h': // For back-compat with 0.7; remove in 1.0
3246
+ case 'H': c = leftPad(hours); break;
3247
+ case 'I': c = leftPad(hours12); break;
3248
+ case 'l': c = leftPad(hours12, " "); break;
3249
+ case 'm': c = leftPad(d.getMonth() + 1); break;
3250
+ case 'M': c = leftPad(d.getMinutes()); break;
3251
+ // quarters not in Open Group's strftime specification
3252
+ case 'q':
3253
+ c = "" + (Math.floor(d.getMonth() / 3) + 1); break;
3254
+ case 'S': c = leftPad(d.getSeconds()); break;
3255
+ case 'y': c = leftPad(d.getFullYear() % 100); break;
3256
+ case 'Y': c = "" + d.getFullYear(); break;
3257
+ case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;
3258
+ case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;
3259
+ case 'w': c = "" + d.getDay(); break;
3260
+ }
3261
+ r.push(c);
3262
+ escape = false;
3263
+ } else {
3264
+ if (c == "%") {
3265
+ escape = true;
3266
+ } else {
3267
+ r.push(c);
3268
+ }
3269
+ }
3270
+ }
3271
+
3272
+ return r.join("");
3273
+ }
3274
+
3275
+ // To have a consistent view of time-based data independent of which time
3276
+ // zone the client happens to be in we need a date-like object independent
3277
+ // of time zones. This is done through a wrapper that only calls the UTC
3278
+ // versions of the accessor methods.
3279
+
3280
+ function makeUtcWrapper(d) {
3281
+
3282
+ function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {
3283
+ sourceObj[sourceMethod] = function() {
3284
+ return targetObj[targetMethod].apply(targetObj, arguments);
3285
+ };
3286
+ };
3287
+
3288
+ var utc = {
3289
+ date: d
3290
+ };
3291
+
3292
+ // support strftime, if found
3293
+
3294
+ if (d.strftime != undefined) {
3295
+ addProxyMethod(utc, "strftime", d, "strftime");
3296
+ }
3297
+
3298
+ addProxyMethod(utc, "getTime", d, "getTime");
3299
+ addProxyMethod(utc, "setTime", d, "setTime");
3300
+
3301
+ var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"];
3302
+
3303
+ for (var p = 0; p < props.length; p++) {
3304
+ addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]);
3305
+ addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]);
3306
+ }
3307
+
3308
+ return utc;
3309
+ };
3310
+
3311
+ // select time zone strategy. This returns a date-like object tied to the
3312
+ // desired timezone
3313
+
3314
+ function dateGenerator(ts, opts) {
3315
+ if (opts.timezone == "browser") {
3316
+ return new Date(ts);
3317
+ } else if (!opts.timezone || opts.timezone == "utc") {
3318
+ return makeUtcWrapper(new Date(ts));
3319
+ } else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") {
3320
+ var d = new timezoneJS.Date();
3321
+ // timezone-js is fickle, so be sure to set the time zone before
3322
+ // setting the time.
3323
+ d.setTimezone(opts.timezone);
3324
+ d.setTime(ts);
3325
+ return d;
3326
+ } else {
3327
+ return makeUtcWrapper(new Date(ts));
3328
+ }
3329
+ }
3330
+
3331
+ // map of app. size of time units in milliseconds
3332
+
3333
+ var timeUnitSize = {
3334
+ "second": 1000,
3335
+ "minute": 60 * 1000,
3336
+ "hour": 60 * 60 * 1000,
3337
+ "day": 24 * 60 * 60 * 1000,
3338
+ "month": 30 * 24 * 60 * 60 * 1000,
3339
+ "quarter": 3 * 30 * 24 * 60 * 60 * 1000,
3340
+ "year": 365.2425 * 24 * 60 * 60 * 1000
3341
+ };
3342
+
3343
+ // the allowed tick sizes, after 1 year we use
3344
+ // an integer algorithm
3345
+
3346
+ var baseSpec = [
3347
+ [1, "second"], [2, "second"], [5, "second"], [10, "second"],
3348
+ [30, "second"],
3349
+ [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
3350
+ [30, "minute"],
3351
+ [1, "hour"], [2, "hour"], [4, "hour"],
3352
+ [8, "hour"], [12, "hour"],
3353
+ [1, "day"], [2, "day"], [3, "day"],
3354
+ [0.25, "month"], [0.5, "month"], [1, "month"],
3355
+ [2, "month"]
3356
+ ];
3357
+
3358
+ // we don't know which variant(s) we'll need yet, but generating both is
3359
+ // cheap
3360
+
3361
+ var specMonths = baseSpec.concat([[3, "month"], [6, "month"],
3362
+ [1, "year"]]);
3363
+ var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"],
3364
+ [1, "year"]]);
3365
+
3366
+ function init(plot) {
3367
+ plot.hooks.processOptions.push(function (plot, options) {
3368
+ $.each(plot.getAxes(), function(axisName, axis) {
3369
+
3370
+ var opts = axis.options;
3371
+
3372
+ if (opts.mode == "time") {
3373
+ axis.tickGenerator = function(axis) {
3374
+
3375
+ var ticks = [];
3376
+ var d = dateGenerator(axis.min, opts);
3377
+ var minSize = 0;
3378
+
3379
+ // make quarter use a possibility if quarters are
3380
+ // mentioned in either of these options
3381
+
3382
+ var spec = (opts.tickSize && opts.tickSize[1] ===
3383
+ "quarter") ||
3384
+ (opts.minTickSize && opts.minTickSize[1] ===
3385
+ "quarter") ? specQuarters : specMonths;
3386
+
3387
+ if (opts.minTickSize != null) {
3388
+ if (typeof opts.tickSize == "number") {
3389
+ minSize = opts.tickSize;
3390
+ } else {
3391
+ minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];
3392
+ }
3393
+ }
3394
+
3395
+ for (var i = 0; i < spec.length - 1; ++i) {
3396
+ if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]
3397
+ + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2
3398
+ && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {
3399
+ break;
3400
+ }
3401
+ }
3402
+
3403
+ var size = spec[i][0];
3404
+ var unit = spec[i][1];
3405
+
3406
+ // special-case the possibility of several years
3407
+
3408
+ if (unit == "year") {
3409
+
3410
+ // if given a minTickSize in years, just use it,
3411
+ // ensuring that it's an integer
3412
+
3413
+ if (opts.minTickSize != null && opts.minTickSize[1] == "year") {
3414
+ size = Math.floor(opts.minTickSize[0]);
3415
+ } else {
3416
+
3417
+ var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));
3418
+ var norm = (axis.delta / timeUnitSize.year) / magn;
3419
+
3420
+ if (norm < 1.5) {
3421
+ size = 1;
3422
+ } else if (norm < 3) {
3423
+ size = 2;
3424
+ } else if (norm < 7.5) {
3425
+ size = 5;
3426
+ } else {
3427
+ size = 10;
3428
+ }
3429
+
3430
+ size *= magn;
3431
+ }
3432
+
3433
+ // minimum size for years is 1
3434
+
3435
+ if (size < 1) {
3436
+ size = 1;
3437
+ }
3438
+ }
3439
+
3440
+ axis.tickSize = opts.tickSize || [size, unit];
3441
+ var tickSize = axis.tickSize[0];
3442
+ unit = axis.tickSize[1];
3443
+
3444
+ var step = tickSize * timeUnitSize[unit];
3445
+
3446
+ if (unit == "second") {
3447
+ d.setSeconds(floorInBase(d.getSeconds(), tickSize));
3448
+ } else if (unit == "minute") {
3449
+ d.setMinutes(floorInBase(d.getMinutes(), tickSize));
3450
+ } else if (unit == "hour") {
3451
+ d.setHours(floorInBase(d.getHours(), tickSize));
3452
+ } else if (unit == "month") {
3453
+ d.setMonth(floorInBase(d.getMonth(), tickSize));
3454
+ } else if (unit == "quarter") {
3455
+ d.setMonth(3 * floorInBase(d.getMonth() / 3,
3456
+ tickSize));
3457
+ } else if (unit == "year") {
3458
+ d.setFullYear(floorInBase(d.getFullYear(), tickSize));
3459
+ }
3460
+
3461
+ // reset smaller components
3462
+
3463
+ d.setMilliseconds(0);
3464
+
3465
+ if (step >= timeUnitSize.minute) {
3466
+ d.setSeconds(0);
3467
+ }
3468
+ if (step >= timeUnitSize.hour) {
3469
+ d.setMinutes(0);
3470
+ }
3471
+ if (step >= timeUnitSize.day) {
3472
+ d.setHours(0);
3473
+ }
3474
+ if (step >= timeUnitSize.day * 4) {
3475
+ d.setDate(1);
3476
+ }
3477
+ if (step >= timeUnitSize.month * 2) {
3478
+ d.setMonth(floorInBase(d.getMonth(), 3));
3479
+ }
3480
+ if (step >= timeUnitSize.quarter * 2) {
3481
+ d.setMonth(floorInBase(d.getMonth(), 6));
3482
+ }
3483
+ if (step >= timeUnitSize.year) {
3484
+ d.setMonth(0);
3485
+ }
3486
+
3487
+ var carry = 0;
3488
+ var v = Number.NaN;
3489
+ var prev;
3490
+
3491
+ do {
3492
+
3493
+ prev = v;
3494
+ v = d.getTime();
3495
+ ticks.push(v);
3496
+
3497
+ if (unit == "month" || unit == "quarter") {
3498
+ if (tickSize < 1) {
3499
+
3500
+ // a bit complicated - we'll divide the
3501
+ // month/quarter up but we need to take
3502
+ // care of fractions so we don't end up in
3503
+ // the middle of a day
3504
+
3505
+ d.setDate(1);
3506
+ var start = d.getTime();
3507
+ d.setMonth(d.getMonth() +
3508
+ (unit == "quarter" ? 3 : 1));
3509
+ var end = d.getTime();
3510
+ d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
3511
+ carry = d.getHours();
3512
+ d.setHours(0);
3513
+ } else {
3514
+ d.setMonth(d.getMonth() +
3515
+ tickSize * (unit == "quarter" ? 3 : 1));
3516
+ }
3517
+ } else if (unit == "year") {
3518
+ d.setFullYear(d.getFullYear() + tickSize);
3519
+ } else {
3520
+ d.setTime(v + step);
3521
+ }
3522
+ } while (v < axis.max && v != prev);
3523
+
3524
+ return ticks;
3525
+ };
3526
+
3527
+ axis.tickFormatter = function (v, axis) {
3528
+
3529
+ var d = dateGenerator(v, axis.options);
3530
+
3531
+ // first check global format
3532
+
3533
+ if (opts.timeformat != null) {
3534
+ return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);
3535
+ }
3536
+
3537
+ // possibly use quarters if quarters are mentioned in
3538
+ // any of these places
3539
+
3540
+ var useQuarters = (axis.options.tickSize &&
3541
+ axis.options.tickSize[1] == "quarter") ||
3542
+ (axis.options.minTickSize &&
3543
+ axis.options.minTickSize[1] == "quarter");
3544
+
3545
+ var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
3546
+ var span = axis.max - axis.min;
3547
+ var suffix = (opts.twelveHourClock) ? " %p" : "";
3548
+ var hourCode = (opts.twelveHourClock) ? "%I" : "%H";
3549
+ var fmt;
3550
+
3551
+ if (t < timeUnitSize.minute) {
3552
+ fmt = hourCode + ":%M:%S" + suffix;
3553
+ } else if (t < timeUnitSize.day) {
3554
+ if (span < 2 * timeUnitSize.day) {
3555
+ fmt = hourCode + ":%M" + suffix;
3556
+ } else {
3557
+ fmt = "%b %d " + hourCode + ":%M" + suffix;
3558
+ }
3559
+ } else if (t < timeUnitSize.month) {
3560
+ fmt = "%b %d";
3561
+ } else if ((useQuarters && t < timeUnitSize.quarter) ||
3562
+ (!useQuarters && t < timeUnitSize.year)) {
3563
+ if (span < timeUnitSize.year) {
3564
+ fmt = "%b";
3565
+ } else {
3566
+ fmt = "%b %Y";
3567
+ }
3568
+ } else if (useQuarters && t < timeUnitSize.year) {
3569
+ if (span < timeUnitSize.year) {
3570
+ fmt = "Q%q";
3571
+ } else {
3572
+ fmt = "Q%q %Y";
3573
+ }
3574
+ } else {
3575
+ fmt = "%Y";
3576
+ }
3577
+
3578
+ var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);
3579
+
3580
+ return rt;
3581
+ };
3582
+ }
3583
+ });
3584
+ });
3585
+ }
3586
+
3587
+ $.plot.plugins.push({
3588
+ init: init,
3589
+ options: options,
3590
+ name: 'time',
3591
+ version: '1.0'
3592
+ });
3593
+
3594
+ // Time-axis support used to be in Flot core, which exposed the
3595
+ // formatDate function on the plot object. Various plugins depend
3596
+ // on the function, so we need to re-expose it here.
3597
+
3598
+ $.plot.formatDate = formatDate;
3599
+ $.plot.dateGenerator = dateGenerator;
3600
+
3601
+ })(jQuery);
assets/admin/scripts/jquery-jvectormap-1.2.2.min.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ /**
2
+ * jVectorMap version 1.2.2
3
+ *
4
+ * Copyright 2011-2013, Kirill Lebedev
5
+ * Licensed under the MIT license.
6
+ *
7
+ */(function(e){var t={set:{colors:1,values:1,backgroundColor:1,scaleColors:1,normalizeFunction:1,focus:1},get:{selectedRegions:1,selectedMarkers:1,mapObject:1,regionName:1}};e.fn.vectorMap=function(e){var n,r,i,n=this.children(".jvectormap-container").data("mapObject");if(e==="addMap")jvm.WorldMap.maps[arguments[1]]=arguments[2];else{if(!(e!=="set"&&e!=="get"||!t[e][arguments[1]]))return r=arguments[1].charAt(0).toUpperCase()+arguments[1].substr(1),n[e+r].apply(n,Array.prototype.slice.call(arguments,2));e=e||{},e.container=this,n=new jvm.WorldMap(e)}return this}})(jQuery),function(e){function r(t){var n=t||window.event,r=[].slice.call(arguments,1),i=0,s=!0,o=0,u=0;return t=e.event.fix(n),t.type="mousewheel",n.wheelDelta&&(i=n.wheelDelta/120),n.detail&&(i=-n.detail/3),u=i,n.axis!==undefined&&n.axis===n.HORIZONTAL_AXIS&&(u=0,o=-1*i),n.wheelDeltaY!==undefined&&(u=n.wheelDeltaY/120),n.wheelDeltaX!==undefined&&(o=-1*n.wheelDeltaX/120),r.unshift(t,i,o,u),(e.event.dispatch||e.event.handle).apply(this,r)}var t=["DOMMouseScroll","mousewheel"];if(e.event.fixHooks)for(var n=t.length;n;)e.event.fixHooks[t[--n]]=e.event.mouseHooks;e.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],r,!1);else this.onmousewheel=r},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],r,!1);else this.onmousewheel=null}},e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}(jQuery);var jvm={inherits:function(e,t){function n(){}n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e,e.parentClass=t},mixin:function(e,t){var n;for(n in t.prototype)t.prototype.hasOwnProperty(n)&&(e.prototype[n]=t.prototype[n])},min:function(e){var t=Number.MAX_VALUE,n;if(e instanceof Array)for(n=0;n<e.length;n++)e[n]<t&&(t=e[n]);else for(n in e)e[n]<t&&(t=e[n]);return t},max:function(e){var t=Number.MIN_VALUE,n;if(e instanceof Array)for(n=0;n<e.length;n++)e[n]>t&&(t=e[n]);else for(n in e)e[n]>t&&(t=e[n]);return t},keys:function(e){var t=[],n;for(n in e)t.push(n);return t},values:function(e){var t=[],n,r;for(r=0;r<arguments.length;r++){e=arguments[r];for(n in e)t.push(e[n])}return t}};jvm.$=jQuery,jvm.AbstractElement=function(e,t){this.node=this.createElement(e),this.name=e,this.properties={},t&&this.set(t)},jvm.AbstractElement.prototype.set=function(e,t){var n;if(typeof e=="object")for(n in e)this.properties[n]=e[n],this.applyAttr(n,e[n]);else this.properties[e]=t,this.applyAttr(e,t)},jvm.AbstractElement.prototype.get=function(e){return this.properties[e]},jvm.AbstractElement.prototype.applyAttr=function(e,t){this.node.setAttribute(e,t)},jvm.AbstractElement.prototype.remove=function(){jvm.$(this.node).remove()},jvm.AbstractCanvasElement=function(e,t,n){this.container=e,this.setSize(t,n),this.rootElement=new jvm[this.classPrefix+"GroupElement"],this.node.appendChild(this.rootElement.node),this.container.appendChild(this.node)},jvm.AbstractCanvasElement.prototype.add=function(e,t){t=t||this.rootElement,t.add(e),e.canvas=this},jvm.AbstractCanvasElement.prototype.addPath=function(e,t,n){var r=new jvm[this.classPrefix+"PathElement"](e,t);return this.add(r,n),r},jvm.AbstractCanvasElement.prototype.addCircle=function(e,t,n){var r=new jvm[this.classPrefix+"CircleElement"](e,t);return this.add(r,n),r},jvm.AbstractCanvasElement.prototype.addGroup=function(e){var t=new jvm[this.classPrefix+"GroupElement"];return e?e.node.appendChild(t.node):this.node.appendChild(t.node),t.canvas=this,t},jvm.AbstractShapeElement=function(e,t,n){this.style=n||{},this.style.current={},this.isHovered=!1,this.isSelected=!1,this.updateStyle()},jvm.AbstractShapeElement.prototype.setHovered=function(e){this.isHovered!==e&&(this.isHovered=e,this.updateStyle())},jvm.AbstractShapeElement.prototype.setSelected=function(e){this.isSelected!==e&&(this.isSelected=e,this.updateStyle(),jvm.$(this.node).trigger("selected",[e]))},jvm.AbstractShapeElement.prototype.setStyle=function(e,t){var n={};typeof e=="object"?n=e:n[e]=t,jvm.$.extend(this.style.current,n),this.updateStyle()},jvm.AbstractShapeElement.prototype.updateStyle=function(){var e={};jvm.AbstractShapeElement.mergeStyles(e,this.style.initial),jvm.AbstractShapeElement.mergeStyles(e,this.style.current),this.isHovered&&jvm.AbstractShapeElement.mergeStyles(e,this.style.hover),this.isSelected&&(jvm.AbstractShapeElement.mergeStyles(e,this.style.selected),this.isHovered&&jvm.AbstractShapeElement.mergeStyles(e,this.style.selectedHover)),this.set(e)},jvm.AbstractShapeElement.mergeStyles=function(e,t){var n;t=t||{};for(n in t)t[n]===null?delete e[n]:e[n]=t[n]},jvm.SVGElement=function(e,t){jvm.SVGElement.parentClass.apply(this,arguments)},jvm.inherits(jvm.SVGElement,jvm.AbstractElement),jvm.SVGElement.svgns="http://www.w3.org/2000/svg",jvm.SVGElement.prototype.createElement=function(e){return document.createElementNS(jvm.SVGElement.svgns,e)},jvm.SVGElement.prototype.addClass=function(e){this.node.setAttribute("class",e)},jvm.SVGElement.prototype.getElementCtr=function(e){return jvm["SVG"+e]},jvm.SVGElement.prototype.getBBox=function(){return this.node.getBBox()},jvm.SVGGroupElement=function(){jvm.SVGGroupElement.parentClass.call(this,"g")},jvm.inherits(jvm.SVGGroupElement,jvm.SVGElement),jvm.SVGGroupElement.prototype.add=function(e){this.node.appendChild(e.node)},jvm.SVGCanvasElement=function(e,t,n){this.classPrefix="SVG",jvm.SVGCanvasElement.parentClass.call(this,"svg"),jvm.AbstractCanvasElement.apply(this,arguments)},jvm.inherits(jvm.SVGCanvasElement,jvm.SVGElement),jvm.mixin(jvm.SVGCanvasElement,jvm.AbstractCanvasElement),jvm.SVGCanvasElement.prototype.setSize=function(e,t){this.width=e,this.height=t,this.node.setAttribute("width",e),this.node.setAttribute("height",t)},jvm.SVGCanvasElement.prototype.applyTransformParams=function(e,t,n){this.scale=e,this.transX=t,this.transY=n,this.rootElement.node.setAttribute("transform","scale("+e+") translate("+t+", "+n+")")},jvm.SVGShapeElement=function(e,t,n){jvm.SVGShapeElement.parentClass.call(this,e,t),jvm.AbstractShapeElement.apply(this,arguments)},jvm.inherits(jvm.SVGShapeElement,jvm.SVGElement),jvm.mixin(jvm.SVGShapeElement,jvm.AbstractShapeElement),jvm.SVGPathElement=function(e,t){jvm.SVGPathElement.parentClass.call(this,"path",e,t),this.node.setAttribute("fill-rule","evenodd")},jvm.inherits(jvm.SVGPathElement,jvm.SVGShapeElement),jvm.SVGCircleElement=function(e,t){jvm.SVGCircleElement.parentClass.call(this,"circle",e,t)},jvm.inherits(jvm.SVGCircleElement,jvm.SVGShapeElement),jvm.VMLElement=function(e,t){jvm.VMLElement.VMLInitialized||jvm.VMLElement.initializeVML(),jvm.VMLElement.parentClass.apply(this,arguments)},jvm.inherits(jvm.VMLElement,jvm.AbstractElement),jvm.VMLElement.VMLInitialized=!1,jvm.VMLElement.initializeVML=function(){try{document.namespaces.rvml||document.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),jvm.VMLElement.prototype.createElement=function(e){return document.createElement("<rvml:"+e+' class="rvml">')}}catch(e){jvm.VMLElement.prototype.createElement=function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}document.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"),jvm.VMLElement.VMLInitialized=!0},jvm.VMLElement.prototype.getElementCtr=function(e){return jvm["VML"+e]},jvm.VMLElement.prototype.addClass=function(e){jvm.$(this.node).addClass(e)},jvm.VMLElement.prototype.applyAttr=function(e,t){this.node[e]=t},jvm.VMLElement.prototype.getBBox=function(){var e=jvm.$(this.node);return{x:e.position().left/this.canvas.scale,y:e.position().top/this.canvas.scale,width:e.width()/this.canvas.scale,height:e.height()/this.canvas.scale}},jvm.VMLGroupElement=function(){jvm.VMLGroupElement.parentClass.call(this,"group"),this.node.style.left="0px",this.node.style.top="0px",this.node.coordorigin="0 0"},jvm.inherits(jvm.VMLGroupElement,jvm.VMLElement),jvm.VMLGroupElement.prototype.add=function(e){this.node.appendChild(e.node)},jvm.VMLCanvasElement=function(e,t,n){this.classPrefix="VML",jvm.VMLCanvasElement.parentClass.call(this,"group"),jvm.AbstractCanvasElement.apply(this,arguments),this.node.style.position="absolute"},jvm.inherits(jvm.VMLCanvasElement,jvm.VMLElement),jvm.mixin(jvm.VMLCanvasElement,jvm.AbstractCanvasElement),jvm.VMLCanvasElement.prototype.setSize=function(e,t){var n,r,i,s;this.width=e,this.height=t,this.node.style.width=e+"px",this.node.style.height=t+"px",this.node.coordsize=e+" "+t,this.node.coordorigin="0 0";if(this.rootElement){n=this.rootElement.node.getElementsByTagName("shape");for(i=0,s=n.length;i<s;i++)n[i].coordsize=e+" "+t,n[i].style.width=e+"px",n[i].style.height=t+"px";r=this.node.getElementsByTagName("group");for(i=0,s=r.length;i<s;i++)r[i].coordsize=e+" "+t,r[i].style.width=e+"px",r[i].style.height=t+"px"}},jvm.VMLCanvasElement.prototype.applyTransformParams=function(e,t,n){this.scale=e,this.transX=t,this.transY=n,this.rootElement.node.coordorigin=this.width-t-this.width/100+","+(this.height-n-this.height/100),this.rootElement.node.coordsize=this.width/e+","+this.height/e},jvm.VMLShapeElement=function(e,t){jvm.VMLShapeElement.parentClass.call(this,e,t),this.fillElement=new jvm.VMLElement("fill"),this.strokeElement=new jvm.VMLElement("stroke"),this.node.appendChild(this.fillElement.node),this.node.appendChild(this.strokeElement.node),this.node.stroked=!1,jvm.AbstractShapeElement.apply(this,arguments)},jvm.inherits(jvm.VMLShapeElement,jvm.VMLElement),jvm.mixin(jvm.VMLShapeElement,jvm.AbstractShapeElement),jvm.VMLShapeElement.prototype.applyAttr=function(e,t){switch(e){case"fill":this.node.fillcolor=t;break;case"fill-opacity":this.fillElement.node.opacity=Math.round(t*100)+"%";break;case"stroke":t==="none"?this.node.stroked=!1:this.node.stroked=!0,this.node.strokecolor=t;break;case"stroke-opacity":this.strokeElement.node.opacity=Math.round(t*100)+"%";break;case"stroke-width":parseInt(t,10)===0?this.node.stroked=!1:this.node.stroked=!0,this.node.strokeweight=t;break;case"d":this.node.path=jvm.VMLPathElement.pathSvgToVml(t);break;default:jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this,arguments)}},jvm.VMLPathElement=function(e,t){var n=new jvm.VMLElement("skew");jvm.VMLPathElement.parentClass.call(this,"shape",e,t),this.node.coordorigin="0 0",n.node.on=!0,n.node.matrix="0.01,0,0,0.01,0,0",n.node.offset="0,0",this.node.appendChild(n.node)},jvm.inherits(jvm.VMLPathElement,jvm.VMLShapeElement),jvm.VMLPathElement.prototype.applyAttr=function(e,t){e==="d"?this.node.path=jvm.VMLPathElement.pathSvgToVml(t):jvm.VMLShapeElement.prototype.applyAttr.call(this,e,t)},jvm.VMLPathElement.pathSvgToVml=function(e){var t="",n=0,r=0,i,s;return e=e.replace(/(-?\d+)e(-?\d+)/g,"0"),e.replace(/([MmLlHhVvCcSs])\s*((?:-?\d*(?:\.\d+)?\s*,?\s*)+)/g,function(e,t,o,u){o=o.replace(/(\d)-/g,"$1,-").replace(/^\s+/g,"").replace(/\s+$/g,"").replace(/\s+/g,",").split(","),o[0]||o.shift();for(var a=0,f=o.length;a<f;a++)o[a]=Math.round(100*o[a]);switch(t){case"m":return n+=o[0],r+=o[1],"t"+o.join(",");case"M":return n=o[0],r=o[1],"m"+o.join(",");case"l":return n+=o[0],r+=o[1],"r"+o.join(",");case"L":return n=o[0],r=o[1],"l"+o.join(",");case"h":return n+=o[0],"r"+o[0]+",0";case"H":return n=o[0],"l"+n+","+r;case"v":return r+=o[0],"r0,"+o[0];case"V":return r=o[0],"l"+n+","+r;case"c":return i=n+o[o.length-4],s=r+o[o.length-3],n+=o[o.length-2],r+=o[o.length-1],"v"+o.join(",");case"C":return i=o[o.length-4],s=o[o.length-3],n=o[o.length-2],r=o[o.length-1],"c"+o.join(",");case"s":return o.unshift(r-s),o.unshift(n-i),i=n+o[o.length-4],s=r+o[o.length-3],n+=o[o.length-2],r+=o[o.length-1],"v"+o.join(",");case"S":return o.unshift(r+r-s),o.unshift(n+n-i),i=o[o.length-4],s=o[o.length-3],n=o[o.length-2],r=o[o.length-1],"c"+o.join(",")}return""}).replace(/z/g,"e")},jvm.VMLCircleElement=function(e,t){jvm.VMLCircleElement.parentClass.call(this,"oval",e,t)},jvm.inherits(jvm.VMLCircleElement,jvm.VMLShapeElement),jvm.VMLCircleElement.prototype.applyAttr=function(e,t){switch(e){case"r":this.node.style.width=t*2+"px",this.node.style.height=t*2+"px",this.applyAttr("cx",this.get("cx")||0),this.applyAttr("cy",this.get("cy")||0);break;case"cx":if(!t)return;this.node.style.left=t-(this.get("r")||0)+"px";break;case"cy":if(!t)return;this.node.style.top=t-(this.get("r")||0)+"px";break;default:jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this,e,t)}},jvm.VectorCanvas=function(e,t,n){return this.mode=window.SVGAngle?"svg":"vml",this.mode=="svg"?this.impl=new jvm.SVGCanvasElement(e,t,n):this.impl=new jvm.VMLCanvasElement(e,t,n),this.impl},jvm.SimpleScale=function(e){this.scale=e},jvm.SimpleScale.prototype.getValue=function(e){return e},jvm.OrdinalScale=function(e){this.scale=e},jvm.OrdinalScale.prototype.getValue=function(e){return this.scale[e]},jvm.NumericScale=function(e,t,n,r){this.scale=[],t=t||"linear",e&&this.setScale(e),t&&this.setNormalizeFunction(t),n&&this.setMin(n),r&&this.setMax(r)},jvm.NumericScale.prototype={setMin:function(e){this.clearMinValue=e,typeof this.normalize=="function"?this.minValue=this.normalize(e):this.minValue=e},setMax:function(e){this.clearMaxValue=e,typeof this.normalize=="function"?this.maxValue=this.normalize(e):this.maxValue=e},setScale:function(e){var t;for(t=0;t<e.length;t++)this.scale[t]=[e[t]]},setNormalizeFunction:function(e){e==="polynomial"?this.normalize=function(e){return Math.pow(e,.2)}:e==="linear"?delete this.normalize:this.normalize=e,this.setMin(this.clearMinValue),this.setMax(this.clearMaxValue)},getValue:function(e){var t=[],n=0,r,i=0,s;typeof this.normalize=="function"&&(e=this.normalize(e));for(i=0;i<this.scale.length-1;i++)r=this.vectorLength(this.vectorSubtract(this.scale[i+1],this.scale[i])),t.push(r),n+=r;s=(this.maxValue-this.minValue)/n;for(i=0;i<t.length;i++)t[i]*=s;i=0,e-=this.minValue;while(e-t[i]>=0)e-=t[i],i++;return i==this.scale.length-1?e=this.vectorToNum(this.scale[i]):e=this.vectorToNum(this.vectorAdd(this.scale[i],this.vectorMult(this.vectorSubtract(this.scale[i+1],this.scale[i]),e/t[i]))),e},vectorToNum:function(e){var t=0,n;for(n=0;n<e.length;n++)t+=Math.round(e[n])*Math.pow(256,e.length-n-1);return t},vectorSubtract:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]-t[r];return n},vectorAdd:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]+t[r];return n},vectorMult:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]*t;return n},vectorLength:function(e){var t=0,n;for(n=0;n<e.length;n++)t+=e[n]*e[n];return Math.sqrt(t)}},jvm.ColorScale=function(e,t,n,r){jvm.ColorScale.parentClass.apply(this,arguments)},jvm.inherits(jvm.ColorScale,jvm.NumericScale),jvm.ColorScale.prototype.setScale=function(e){var t;for(t=0;t<e.length;t++)this.scale[t]=jvm.ColorScale.rgbToArray(e[t])},jvm.ColorScale.prototype.getValue=function(e){return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this,e))},jvm.ColorScale.arrayToRgb=function(e){var t="#",n,r;for(r=0;r<e.length;r++)n=e[r].toString(16),t+=n.length==1?"0"+n:n;return t},jvm.ColorScale.numToRgb=function(e){e=e.toString(16);while(e.length<6)e="0"+e;return"#"+e},jvm.ColorScale.rgbToArray=function(e){return e=e.substr(1),[parseInt(e.substr(0,2),16),parseInt(e.substr(2,2),16),parseInt(e.substr(4,2),16)]},jvm.DataSeries=function(e,t){var n;e=e||{},e.attribute=e.attribute||"fill",this.elements=t,this.params=e,e.attributes&&this.setAttributes(e.attributes),jvm.$.isArray(e.scale)?(n=e.attribute==="fill"||e.attribute==="stroke"?jvm.ColorScale:jvm.NumericScale,this.scale=new n(e.scale,e.normalizeFunction,e.min,e.max)):e.scale?this.scale=new jvm.OrdinalScale(e.scale):this.scale=new jvm.SimpleScale(e.scale),this.values=e.values||{},this.setValues(this.values)},jvm.DataSeries.prototype={setAttributes:function(e,t){var n=e,r;if(typeof e=="string")this.elements[e]&&this.elements[e].setStyle(this.params.attribute,t);else for(r in n)this.elements[r]&&this.elements[r].element.setStyle(this.params.attribute,n[r])},setValues:function(e){var t=Number.MIN_VALUE,n=Number.MAX_VALUE,r,i,s={};if(this.scale instanceof jvm.OrdinalScale||this.scale instanceof jvm.SimpleScale)for(i in e)e[i]?s[i]=this.scale.getValue(e[i]):s[i]=this.elements[i].element.style.initial[this.params.attribute];else{if(!this.params.min||!this.params.max){for(i in e)r=parseFloat(e[i]),r>t&&(t=e[i]),r<n&&(n=r);this.params.min||this.scale.setMin(n),this.params.max||this.scale.setMax(t),this.params.min=n,this.params.max=t}for(i in e)r=parseFloat(e[i]),isNaN(r)?s[i]=this.elements[i].element.style.initial[this.params.attribute]:s[i]=this.scale.getValue(r)}this.setAttributes(s),jvm.$.extend(this.values,e)},clear:function(){var e,t={};for(e in this.values)this.elements[e]&&(t[e]=this.elements[e].element.style.initial[this.params.attribute]);this.setAttributes(t),this.values={}},setScale:function(e){this.scale.setScale(e),this.values&&this.setValues(this.values)},setNormalizeFunction:function(e){this.scale.setNormalizeFunction(e),this.values&&this.setValues(this.values)}},jvm.Proj={degRad:180/Math.PI,radDeg:Math.PI/180,radius:6381372,sgn:function(e){return e>0?1:e<0?-1:e},mill:function(e,t,n){return{x:this.radius*(t-n)*this.radDeg,y:-this.radius*Math.log(Math.tan((45+.4*e)*this.radDeg))/.8}},mill_inv:function(e,t,n){return{lat:(2.5*Math.atan(Math.exp(.8*t/this.radius))-5*Math.PI/8)*this.degRad,lng:(n*this.radDeg+e/this.radius)*this.degRad}},merc:function(e,t,n){return{x:this.radius*(t-n)*this.radDeg,y:-this.radius*Math.log(Math.tan(Math.PI/4+e*Math.PI/360))}},merc_inv:function(e,t,n){return{lat:(2*Math.atan(Math.exp(t/this.radius))-Math.PI/2)*this.degRad,lng:(n*this.radDeg+e/this.radius)*this.degRad}},aea:function(e,t,n){var r=0,i=n*this.radDeg,s=29.5*this.radDeg,o=45.5*this.radDeg,u=e*this.radDeg,a=t*this.radDeg,f=(Math.sin(s)+Math.sin(o))/2,l=Math.cos(s)*Math.cos(s)+2*f*Math.sin(s),c=f*(a-i),h=Math.sqrt(l-2*f*Math.sin(u))/f,p=Math.sqrt(l-2*f*Math.sin(r))/f;return{x:h*Math.sin(c)*this.radius,y:-(p-h*Math.cos(c))*this.radius}},aea_inv:function(e,t,n){var r=e/this.radius,i=t/this.radius,s=0,o=n*this.radDeg,u=29.5*this.radDeg,a=45.5*this.radDeg,f=(Math.sin(u)+Math.sin(a))/2,l=Math.cos(u)*Math.cos(u)+2*f*Math.sin(u),c=Math.sqrt(l-2*f*Math.sin(s))/f,h=Math.sqrt(r*r+(c-i)*(c-i)),p=Math.atan(r/(c-i));return{lat:Math.asin((l-h*h*f*f)/(2*f))*this.degRad,lng:(o+p/f)*this.degRad}},lcc:function(e,t,n){var r=0,i=n*this.radDeg,s=t*this.radDeg,o=33*this.radDeg,u=45*this.radDeg,a=e*this.radDeg,f=Math.log(Math.cos(o)*(1/Math.cos(u)))/Math.log(Math.tan(Math.PI/4+u/2)*(1/Math.tan(Math.PI/4+o/2))),l=Math.cos(o)*Math.pow(Math.tan(Math.PI/4+o/2),f)/f,c=l*Math.pow(1/Math.tan(Math.PI/4+a/2),f),h=l*Math.pow(1/Math.tan(Math.PI/4+r/2),f);return{x:c*Math.sin(f*(s-i))*this.radius,y:-(h-c*Math.cos(f*(s-i)))*this.radius}},lcc_inv:function(e,t,n){var r=e/this.radius,i=t/this.radius,s=0,o=n*this.radDeg,u=33*this.radDeg,a=45*this.radDeg,f=Math.log(Math.cos(u)*(1/Math.cos(a)))/Math.log(Math.tan(Math.PI/4+a/2)*(1/Math.tan(Math.PI/4+u/2))),l=Math.cos(u)*Math.pow(Math.tan(Math.PI/4+u/2),f)/f,c=l*Math.pow(1/Math.tan(Math.PI/4+s/2),f),h=this.sgn(f)*Math.sqrt(r*r+(c-i)*(c-i)),p=Math.atan(r/(c-i));return{lat:(2*Math.atan(Math.pow(l/h,1/f))-Math.PI/2)*this.degRad,lng:(o+p/f)*this.degRad}}},jvm.WorldMap=function(e){var t=this,n;this.params=jvm.$.extend(!0,{},jvm.WorldMap.defaultParams,e);if(!jvm.WorldMap.maps[this.params.map])throw new Error("Attempt to use map which was not loaded: "+this.params.map);this.mapData=jvm.WorldMap.maps[this.params.map],this.markers={},this.regions={},this.regionsColors={},this.regionsData={},this.container=jvm.$("<div>").css({width:"100%",height:"100%"}).addClass("jvectormap-container"),this.params.container.append(this.container),this.container.data("mapObject",this),this.container.css({position:"relative",overflow:"hidden"}),this.defaultWidth=this.mapData.width,this.defaultHeight=this.mapData.height,this.setBackgroundColor(this.params.backgroundColor),this.onResize=function(){t.setSize()},jvm.$(window).resize(this.onResize);for(n in jvm.WorldMap.apiEvents)this.params[n]&&this.container.bind(jvm.WorldMap.apiEvents[n]+".jvectormap",this.params[n]);this.canvas=new jvm.VectorCanvas(this.container[0],this.width,this.height),"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch?this.params.bindTouchEvents&&this.bindContainerTouchEvents():this.bindContainerEvents(),this.bindElementEvents(),this.createLabel(),this.params.zoomButtons&&this.bindZoomButtons(),this.createRegions(),this.createMarkers(this.params.markers||{}),this.setSize(),this.params.focusOn&&(typeof this.params.focusOn=="object"?this.setFocus.call(this,this.params.focusOn.scale,this.params.focusOn.x,this.params.focusOn.y):this.setFocus.call(this,this.params.focusOn)),this.params.selectedRegions&&this.setSelectedRegions(this.params.selectedRegions),this.params.selectedMarkers&&this.setSelectedMarkers(this.params.selectedMarkers),this.params.series&&this.createSeries()},jvm.WorldMap.prototype={transX:0,transY:0,scale:1,baseTransX:0,baseTransY:0,baseScale:1,width:0,height:0,setBackgroundColor:function(e){this.container.css("background-color",e)},resize:function(){var e=this.baseScale;this.width/this.height>this.defaultWidth/this.defaultHeight?(this.baseScale=this.height/this.defaultHeight,this.baseTransX=Math.abs(this.width-this.defaultWidth*this.baseScale)/(2*this.baseScale)):(this.baseScale=this.width/this.defaultWidth,this.baseTransY=Math.abs(this.height-this.defaultHeight*this.baseScale)/(2*this.baseScale)),this.scale*=this.baseScale/e,this.transX*=this.baseScale/e,this.transY*=this.baseScale/e},setSize:function(){this.width=this.container.width(),this.height=this.container.height(),this.resize(),this.canvas.setSize(this.width,this.height),this.applyTransform()},reset:function(){var e,t;for(e in this.series)for(t=0;t<this.series[e].length;t++)this.series[e][t].clear();this.scale=this.baseScale,this.transX=this.baseTransX,this.transY=this.baseTransY,this.applyTransform()},applyTransform:function(){var e,t,n,r;this.defaultWidth*this.scale<=this.width?(e=(this.width-this.defaultWidth*this.scale)/(2*this.scale),n=(this.width-this.defaultWidth*this.scale)/(2*this.scale)):(e=0,n=(this.width-this.defaultWidth*this.scale)/this.scale),this.defaultHeight*this.scale<=this.height?(t=(this.height-this.defaultHeight*this.scale)/(2*this.scale),r=(this.height-this.defaultHeight*this.scale)/(2*this.scale)):(t=0,r=(this.height-this.defaultHeight*this.scale)/this.scale),this.transY>t?this.transY=t:this.transY<r&&(this.transY=r),this.transX>e?this.transX=e:this.transX<n&&(this.transX=n),this.canvas.applyTransformParams(this.scale,this.transX,this.transY),this.markers&&this.repositionMarkers(),this.container.trigger("viewportChange",[this.scale/this.baseScale,this.transX,this.transY])},bindContainerEvents:function(){var e=!1,t,n,r=this;this.container.mousemove(function(i){return e&&(r.transX-=(t-i.pageX)/r.scale,r.transY-=(n-i.pageY)/r.scale,r.applyTransform(),t=i.pageX,n=i.pageY),!1}).mousedown(function(r){return e=!0,t=r.pageX,n=r.pageY,!1}),jvm.$("body").mouseup(function(){e=!1}),this.params.zoomOnScroll&&this.container.mousewheel(function(e,t,n,i){var s=jvm.$(r.container).offset(),o=e.pageX-s.left,u=e.pageY-s.top,a=Math.pow(1.3,i);r.label.hide(),r.setScale(r.scale*a,o,u),e.preventDefault()})},bindContainerTouchEvents:function(){var e,t,n=this,r,i,s,o,u,a=function(a){var f=a.originalEvent.touches,l,c,h,p;a.type=="touchstart"&&(u=0),f.length==1?(u==1&&(h=n.transX,p=n.transY,n.transX-=(r-f[0].pageX)/n.scale,n.transY-=(i-f[0].pageY)/n.scale,n.applyTransform(),n.label.hide(),(h!=n.transX||p!=n.transY)&&a.preventDefault()),r=f[0].pageX,i=f[0].pageY):f.length==2&&(u==2?(c=Math.sqrt(Math.pow(f[0].pageX-f[1].pageX,2)+Math.pow(f[0].pageY-f[1].pageY,2))/t,n.setScale(e*c,s,o),n.label.hide(),a.preventDefault()):(l=jvm.$(n.container).offset(),f[0].pageX>f[1].pageX?s=f[1].pageX+(f[0].pageX-f[1].pageX)/2:s=f[0].pageX+(f[1].pageX-f[0].pageX)/2,f[0].pageY>f[1].pageY?o=f[1].pageY+(f[0].pageY-f[1].pageY)/2:o=f[0].pageY+(f[1].pageY-f[0].pageY)/2,s-=l.left,o-=l.top,e=n.scale,t=Math.sqrt(Math.pow(f[0].pageX-f[1].pageX,2)+Math.pow(f[0].pageY-f[1].pageY,2)))),u=f.length};jvm.$(this.container).bind("touchstart",a),jvm.$(this.container).bind("touchmove",a)},bindElementEvents:function(){var e=this,t;this.container.mousemove(function(){t=!0}),this.container.delegate("[class~='jvectormap-element']","mouseover mouseout",function(t){var n=this,r=jvm.$(this).attr("class").baseVal?jvm.$(this).attr("class").baseVal:jvm.$(this).attr("class"),i=r.indexOf("jvectormap-region")===-1?"marker":"region",s=i=="region"?jvm.$(this).attr("data-code"):jvm.$(this).attr("data-index"),o=i=="region"?e.regions[s].element:e.markers[s].element,u=i=="region"?e.mapData.paths[s].name:e.markers[s].config.name||"",a=jvm.$.Event(i+"LabelShow.jvectormap"),f=jvm.$.Event(i+"Over.jvectormap");t.type=="mouseover"?(e.container.trigger(f,[s]),f.isDefaultPrevented()||o.setHovered(!0),e.label.text(u),e.container.trigger(a,[e.label,s]),a.isDefaultPrevented()||(e.label.show(),e.labelWidth=e.label.width(),e.labelHeight=e.label.height())):(o.setHovered(!1),e.label.hide(),e.container.trigger(i+"Out.jvectormap",[s]))}),this.container.delegate("[class~='jvectormap-element']","mousedown",function(e){t=!1}),this.container.delegate("[class~='jvectormap-element']","mouseup",function(n){var r=this,i=jvm.$(this).attr("class").baseVal?jvm.$(this).attr("class").baseVal:jvm.$(this).attr("class"),s=i.indexOf("jvectormap-region")===-1?"marker":"region",o=s=="region"?jvm.$(this).attr("data-code"):jvm.$(this).attr("data-index"),u=jvm.$.Event(s+"Click.jvectormap"),a=s=="region"?e.regions[o].element:e.markers[o].element;if(!t){e.container.trigger(u,[o]);if(s==="region"&&e.params.regionsSelectable||s==="marker"&&e.params.markersSelectable)u.isDefaultPrevented()||(e.params[s+"sSelectableOne"]&&e.clearSelected(s+"s"),a.setSelected(!a.isSelected))}})},bindZoomButtons:function(){var e=this;jvm.$("<div/>").addClass("jvectormap-zoomin").text("+").appendTo(this.container),jvm.$("<div/>").addClass("jvectormap-zoomout").html("&#x2212;").appendTo(this.container),this.container.find(".jvectormap-zoomin").click(function(){e.setScale(e.scale*e.params.zoomStep,e.width/2,e.height/2)}),this.container.find(".jvectormap-zoomout").click(function(){e.setScale(e.scale/e.params.zoomStep,e.width/2,e.height/2)})},createLabel:function(){var e=this;this.label=jvm.$("<div/>").addClass("jvectormap-label").appendTo(jvm.$("body")),this.container.mousemove(function(t){var n=t.pageX-15-e.labelWidth,r=t.pageY-15-e.labelHeight;n<5&&(n=t.pageX+15),r<5&&(r=t.pageY+15),e.label.is(":visible")&&e.label.css({left:n,top:r})})},setScale:function(e,t,n,r){var i,s=jvm.$.Event("zoom.jvectormap");e>this.params.zoomMax*this.baseScale?e=this.params.zoomMax*this.baseScale:e<this.params.zoomMin*this.baseScale&&(e=this.params.zoomMin*this.baseScale),typeof t!="undefined"&&typeof n!="undefined"&&(i=e/this.scale,r?(this.transX=t+this.defaultWidth*(this.width/(this.defaultWidth*e))/2,this.transY=n+this.defaultHeight*(this.height/(this.defaultHeight*e))/2):(this.transX-=(i-1)/e*t,this.transY-=(i-1)/e*n)),this.scale=e,this.applyTransform(),this.container.trigger(s,[e/this.baseScale])},setFocus:function(e,t,n){var r,i,s,o,u;if(jvm.$.isArray(e)||this.regions[e]){jvm.$.isArray(e)?o=e:o=[e];for(u=0;u<o.length;u++)this.regions[o[u]]&&(i=this.regions[o[u]].element.getBBox(),i&&(typeof r=="undefined"?r=i:(s={x:Math.min(r.x,i.x),y:Math.min(r.y,i.y),width:Math.max(r.x+r.width,i.x+i.width)-Math.min(r.x,i.x),height:Math.max(r.y+r.height,i.y+i.height)-Math.min(r.y,i.y)},r=s)));this.setScale(Math.min(this.width/r.width,this.height/r.height),-(r.x+r.width/2),-(r.y+r.height/2),!0)}else e*=this.baseScale,this.setScale(e,-t*this.defaultWidth,-n*this.defaultHeight,!0)},getSelected:function(e){var t,n=[];for(t in this[e])this[e][t].element.isSelected&&n.push(t);return n},getSelectedRegions:function(){return this.getSelected("regions")},getSelectedMarkers:function(){return this.getSelected("markers")},setSelected:function(e,t){var n;typeof t!="object"&&(t=[t]);if(jvm.$.isArray(t))for(n=0;n<t.length;n++)this[e][t[n]].element.setSelected(!0);else for(n in t)this[e][n].element.setSelected(!!t[n])},setSelectedRegions:function(e){this.setSelected("regions",e)},setSelectedMarkers:function(e){this.setSelected("markers",e)},clearSelected:function(e){var t={},n=this.getSelected(e),r;for(r=0;r<n.length;r++)t[n[r]]=!1;this.setSelected(e,t)},clearSelectedRegions:function(){this.clearSelected("regions")},clearSelectedMarkers:function(){this.clearSelected("markers")},getMapObject:function(){return this},getRegionName:function(e){return this.mapData.paths[e].name},createRegions:function(){var e,t,n=this;for(e in this.mapData.paths)t=this.canvas.addPath({d:this.mapData.paths[e].path,"data-code":e},jvm.$.extend(!0,{},this.params.regionStyle)),jvm.$(t.node).bind("selected",function(e,t){n.container.trigger("regionSelected.jvectormap",[jvm.$(this).attr("data-code"),t,n.getSelectedRegions()])}),t.addClass("jvectormap-region jvectormap-element"),this.regions[e]={element:t,config:this.mapData.paths[e]}},createMarkers:function(e){var t,n,r,i,s,o=this;this.markersGroup=this.markersGroup||this.canvas.addGroup();if(jvm.$.isArray(e)){s=e.slice(),e={};for(t=0;t<s.length;t++)e[t]=s[t]}for(t in e)i=e[t]instanceof Array?{latLng:e[t]}:e[t],r=this.getMarkerPosition(i),r!==!1&&(n=this.canvas.addCircle({"data-index":t,cx:r.x,cy:r.y},jvm.$.extend(!0,{},this.params.markerStyle,{initial:i.style||{}}),this.markersGroup),n.addClass("jvectormap-marker jvectormap-element"),jvm.$(n.node).bind("selected",function(e,t){o.container.trigger("markerSelected.jvectormap",[jvm.$(this).attr("data-index"),t,o.getSelectedMarkers()])}),this.markers[t]&&this.removeMarkers([t]),this.markers[t]={element:n,config:i})},repositionMarkers:function(){var e,t;for(e in this.markers)t=this.getMarkerPosition(this.markers[e].config),t!==!1&&this.markers[e].element.setStyle({cx:t.x,cy:t.y})},getMarkerPosition:function(e){return jvm.WorldMap.maps[this.params.map].projection?this.latLngToPoint.apply(this,e.latLng||[0,0]):{x:e.coords[0]*this.scale+this.transX*this.scale,y:e.coords[1]*this.scale+this.transY*this.scale}},addMarker:function(e,t,n){var r={},i=[],s,o,n=n||[];r[e]=t;for(o=0;o<n.length;o++)s={},s[e]=n[o],i.push(s);this.addMarkers(r,i)},addMarkers:function(e,t){var n;t=t||[],this.createMarkers(e);for(n=0;n<t.length;n++)this.series.markers[n].setValues(t[n]||{})},removeMarkers:function(e){var t;for(t=0;t<e.length;t++)this.markers[e[t]].element.remove(),delete this.markers[e[t]]},removeAllMarkers:function(){var e,t=[];for(e in this.markers)t.push(e);this.removeMarkers(t)},latLngToPoint:function(e,t){var n,r=jvm.WorldMap.maps[this.params.map].projection,i=r.centralMeridian,s=this.width-this.baseTransX*2*this.baseScale,o=this.height-this.baseTransY*2*this.baseScale,u,a,f=this.scale/this.baseScale;return t<-180+i&&(t+=360),n=jvm.Proj[r.type](e,t,i),u=this.getInsetForPoint(n.x,n.y),u?(a=u.bbox,n.x=(n.x-a[0].x)/(a[1].x-a[0].x)*u.width*this.scale,n.y=(n.y-a[0].y)/(a[1].y-a[0].y)*u.height*this.scale,{x:n.x+this.transX*this.scale+u.left*this.scale,y:n.y+this.transY*this.scale+u.top*this.scale}):!1},pointToLatLng:function(e,t){var n=jvm.WorldMap.maps[this.params.map].projection,r=n.centralMeridian,i=jvm.WorldMap.maps[this.params.map].insets,s,o,u,a,f;for(s=0;s<i.length;s++){o=i[s],u=o.bbox,a=e-(this.transX*this.scale+o.left*this.scale),f=t-(this.transY*this.scale+o.top*this.scale),a=a/(o.width*this.scale)*(u[1].x-u[0].x)+u[0].x,f=f/(o.height*this.scale)*(u[1].y-u[0].y)+u[0].y;if(a>u[0].x&&a<u[1].x&&f>u[0].y&&f<u[1].y)return jvm.Proj[n.type+"_inv"](a,-f,r)}return!1},getInsetForPoint:function(e,t){var n=jvm.WorldMap.maps[this.params.map].insets,r,i;for(r=0;r<n.length;r++){i=n[r].bbox;if(e>i[0].x&&e<i[1].x&&t>i[0].y&&t<i[1].y)return n[r]}},createSeries:function(){var e,t;this.series={markers:[],regions:[]};for(t in this.params.series)for(e=0;e<this.params.series[t].length;e++)this.series[t][e]=new jvm.DataSeries(this.params.series[t][e],this[t])},remove:function(){this.label.remove(),this.container.remove(),jvm.$(window).unbind("resize",this.onResize)}},jvm.WorldMap.maps={},jvm.WorldMap.defaultParams={map:"world_mill_en",backgroundColor:"#505050",zoomButtons:!0,zoomOnScroll:!0,zoomMax:8,zoomMin:1,zoomStep:1.6,regionsSelectable:!1,markersSelectable:!1,bindTouchEvents:!0,regionStyle:{initial:{fill:"white","fill-opacity":1,stroke:"none","stroke-width":0,"stroke-opacity":1},hover:{"fill-opacity":.8},selected:{fill:"yellow"},selectedHover
8
+ :{}},markerStyle:{initial:{fill:"grey",stroke:"#505050","fill-opacity":1,"stroke-width":1,"stroke-opacity":1,r:5},hover:{stroke:"black","stroke-width":2},selected:{fill:"blue"},selectedHover:{}}},jvm.WorldMap.apiEvents={onRegionLabelShow:"regionLabelShow",onRegionOver:"regionOver",onRegionOut:"regionOut",onRegionClick:"regionClick",onRegionSelected:"regionSelected",onMarkerLabelShow:"markerLabelShow",onMarkerOver:"markerOver",onMarkerOut:"markerOut",onMarkerClick:"markerClick",onMarkerSelected:"markerSelected",onViewportChange:"viewportChange"};
assets/admin/scripts/jquery-jvectormap-world-mill-en.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery.fn.vectorMap('addMap', 'world_mill_en',{"insets": [{"width": 900.0, "top": 0, "height": 440.7063107441331, "bbox": [{"y": -12671671.123330014, "x": -20004297.151525836}, {"y": 6930392.02513512, "x": 20026572.394749384}], "left": 0}], "paths": {"BD": {"path": "M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z", "name": "Bangladesh"}, "BE": {"path": "M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z", "name": "Belgium"}, "BF": {"path": "M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z", "name": "Burkina Faso"}, "BG": {"path": "M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z", "name": "Bulgaria"}, "BA": {"path": "M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z", "name": "Bosnia and Herzegovina"}, "BN": {"path": "M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z", "name": "Brunei"}, "BO": {"path": "M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z", "name": "Bolivia"}, "JP": {"path": "M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z", "name": "Japan"}, "BI": {"path": "M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z", "name": "Burundi"}, "BJ": {"path": "M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z", "name": "Benin"}, "BT": {"path": "M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z", "name": "Bhutan"}, "JM": {"path": "M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z", "name": "Jamaica"}, "BW": {"path": "M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z", "name": "Botswana"}, "BR": {"path": "M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z", "name": "Brazil"}, "BS": {"path": "M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z", "name": "The Bahamas"}, "BY": {"path": "M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z", "name": "Belarus"}, "BZ": {"path": "M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z", "name": "Belize"}, "RU": {"path": "M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z", "name": "Russia"}, "RW": {"path": "M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z", "name": "Rwanda"}, "RS": {"path": "M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z", "name": "Republic of Serbia"}, "LT": {"path": "M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z", "name": "Lithuania"}, "LU": {"path": "M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z", "name": "Luxembourg"}, "LR": {"path": "M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z", "name": "Liberia"}, "RO": {"path": "M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z", "name": "Romania"}, "GW": {"path": "M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z", "name": "Guinea Bissau"}, "GT": {"path": "M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z", "name": "Guatemala"}, "GR": {"path": "M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z", "name": "Greece"}, "GQ": {"path": "M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z", "name": "Equatorial Guinea"}, "GY": {"path": "M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z", "name": "Guyana"}, "GE": {"path": "M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z", "name": "Georgia"}, "GB": {"path": "M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z", "name": "United Kingdom"}, "GA": {"path": "M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z", "name": "Gabon"}, "GN": {"path": "M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z", "name": "Guinea"}, "GM": {"path": "M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z", "name": "Gambia"}, "GL": {"path": "M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z", "name": "Greenland"}, "KW": {"path": "M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z", "name": "Kuwait"}, "GH": {"path": "M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z", "name": "Ghana"}, "OM": {"path": "M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z", "name": "Oman"}, "_3": {"path": "M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z", "name": "Somaliland"}, "_2": {"path": "M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z", "name": "Western Sahara"}, "_1": {"path": "M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z", "name": "Kosovo"}, "_0": {"path": "M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z", "name": "Northern Cyprus"}, "JO": {"path": "M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z", "name": "Jordan"}, "HR": {"path": "M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z", "name": "Croatia"}, "HT": {"path": "M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z", "name": "Haiti"}, "HU": {"path": "M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z", "name": "Hungary"}, "HN": {"path": "M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z", "name": "Honduras"}, "PR": {"path": "M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z", "name": "Puerto Rico"}, "PS": {"path": "M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z", "name": "West Bank"}, "PT": {"path": "M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z", "name": "Portugal"}, "PY": {"path": "M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z", "name": "Paraguay"}, "PA": {"path": "M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z", "name": "Panama"}, "PG": {"path": "M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z", "name": "Papua New Guinea"}, "PE": {"path": "M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z", "name": "Peru"}, "PK": {"path": "M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z", "name": "Pakistan"}, "PH": {"path": "M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z", "name": "Philippines"}, "PL": {"path": "M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z", "name": "Poland"}, "ZM": {"path": "M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z", "name": "Zambia"}, "EE": {"path": "M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z", "name": "Estonia"}, "EG": {"path": "M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z", "name": "Egypt"}, "ZA": {"path": "M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z", "name": "South Africa"}, "EC": {"path": "M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z", "name": "Ecuador"}, "AL": {"path": "M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z", "name": "Albania"}, "AO": {"path": "M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z", "name": "Angola"}, "KZ": {"path": "M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z", "name": "Kazakhstan"}, "ET": {"path": "M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z", "name": "Ethiopia"}, "ZW": {"path": "M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z", "name": "Zimbabwe"}, "ES": {"path": "M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z", "name": "Spain"}, "ER": {"path": "M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z", "name": "Eritrea"}, "ME": {"path": "M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z", "name": "Montenegro"}, "MD": {"path": "M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z", "name": "Moldova"}, "MG": {"path": "M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z", "name": "Madagascar"}, "MA": {"path": "M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z", "name": "Morocco"}, "UZ": {"path": "M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z", "name": "Uzbekistan"}, "MM": {"path": "M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z", "name": "Myanmar"}, "ML": {"path": "M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z", "name": "Mali"}, "MN": {"path": "M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z", "name": "Mongolia"}, "MK": {"path": "M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z", "name": "Macedonia"}, "MW": {"path": "M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z", "name": "Malawi"}, "MR": {"path": "M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z", "name": "Mauritania"}, "UG": {"path": "M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z", "name": "Uganda"}, "MY": {"path": "M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z", "name": "Malaysia"}, "MX": {"path": "M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z", "name": "Mexico"}, "VU": {"path": "M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z", "name": "Vanuatu"}, "FR": {"path": "M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z", "name": "France"}, "FI": {"path": "M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z", "name": "Finland"}, "FJ": {"path": "M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z", "name": "Fiji"}, "FK": {"path": "M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z", "name": "Falkland Islands"}, "NI": {"path": "M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z", "name": "Nicaragua"}, "NL": {"path": "M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z", "name": "Netherlands"}, "NO": {"path": "M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z", "name": "Norway"}, "NA": {"path": "M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z", "name": "Namibia"}, "NC": {"path": "M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z", "name": "New Caledonia"}, "NE": {"path": "M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z", "name": "Niger"}, "NG": {"path": "M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z", "name": "Nigeria"}, "NZ": {"path": "M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z", "name": "New Zealand"}, "NP": {"path": "M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z", "name": "Nepal"}, "CI": {"path": "M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z", "name": "Ivory Coast"}, "CH": {"path": "M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z", "name": "Switzerland"}, "CO": {"path": "M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z", "name": "Colombia"}, "CN": {"path": "M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z", "name": "China"}, "CM": {"path": "M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z", "name": "Cameroon"}, "CL": {"path": "M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z", "name": "Chile"}, "CA": {"path": "M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z", "name": "Canada"}, "CG": {"path": "M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z", "name": "Republic of the Congo"}, "CF": {"path": "M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z", "name": "Central African Republic"}, "CD": {"path": "M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z", "name": "Democratic Republic of the Congo"}, "CZ": {"path": "M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z", "name": "Czech Republic"}, "CY": {"path": "M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z", "name": "Cyprus"}, "CR": {"path": "M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z", "name": "Costa Rica"}, "CU": {"path": "M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z", "name": "Cuba"}, "SZ": {"path": "M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z", "name": "Swaziland"}, "SY": {"path": "M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z", "name": "Syria"}, "KG": {"path": "M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z", "name": "Kyrgyzstan"}, "KE": {"path": "M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z", "name": "Kenya"}, "SS": {"path": "M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z", "name": "South Sudan"}, "SR": {"path": "M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z", "name": "Suriname"}, "KH": {"path": "M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z", "name": "Cambodia"}, "SV": {"path": "M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z", "name": "El Salvador"}, "SK": {"path": "M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z", "name": "Slovakia"}, "KR": {"path": "M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z", "name": "South Korea"}, "SI": {"path": "M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z", "name": "Slovenia"}, "KP": {"path": "M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z", "name": "North Korea"}, "SO": {"path": "M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z", "name": "Somalia"}, "SN": {"path": "M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z", "name": "Senegal"}, "SL": {"path": "M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z", "name": "Sierra Leone"}, "SB": {"path": "M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z", "name": "Solomon Islands"}, "SA": {"path": "M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z", "name": "Saudi Arabia"}, "SE": {"path": "M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z", "name": "Sweden"}, "SD": {"path": "M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z", "name": "Sudan"}, "DO": {"path": "M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z", "name": "Dominican Republic"}, "DJ": {"path": "M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z", "name": "Djibouti"}, "DK": {"path": "M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z", "name": "Denmark"}, "DE": {"path": "M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z", "name": "Germany"}, "YE": {"path": "M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z", "name": "Yemen"}, "AT": {"path": "M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z", "name": "Austria"}, "DZ": {"path": "M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z", "name": "Algeria"}, "US": {"path": "M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z", "name": "United States of America"}, "LV": {"path": "M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z", "name": "Latvia"}, "UY": {"path": "M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z", "name": "Uruguay"}, "LB": {"path": "M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z", "name": "Lebanon"}, "LA": {"path": "M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z", "name": "Laos"}, "TW": {"path": "M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z", "name": "Taiwan"}, "TT": {"path": "M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z", "name": "Trinidad and Tobago"}, "TR": {"path": "M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z", "name": "Turkey"}, "LK": {"path": "M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z", "name": "Sri Lanka"}, "TN": {"path": "M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z", "name": "Tunisia"}, "TL": {"path": "M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z", "name": "East Timor"}, "TM": {"path": "M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z", "name": "Turkmenistan"}, "TJ": {"path": "M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z", "name": "Tajikistan"}, "LS": {"path": "M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z", "name": "Lesotho"}, "TH": {"path": "M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z", "name": "Thailand"}, "TF": {"path": "M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z", "name": "French Southern and Antarctic Lands"}, "TG": {"path": "M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z", "name": "Togo"}, "TD": {"path": "M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z", "name": "Chad"}, "LY": {"path": "M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z", "name": "Libya"}, "AE": {"path": "M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z", "name": "United Arab Emirates"}, "VE": {"path": "M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z", "name": "Venezuela"}, "AF": {"path": "M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z", "name": "Afghanistan"}, "IQ": {"path": "M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z", "name": "Iraq"}, "IS": {"path": "M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z", "name": "Iceland"}, "IR": {"path": "M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z", "name": "Iran"}, "AM": {"path": "M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z", "name": "Armenia"}, "IT": {"path": "M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z", "name": "Italy"}, "VN": {"path": "M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z", "name": "Vietnam"}, "AR": {"path": "M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z", "name": "Argentina"}, "AU": {"path": "M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z", "name": "Australia"}, "IL": {"path": "M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z", "name": "Israel"}, "IN": {"path": "M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z", "name": "India"}, "TZ": {"path": "M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z", "name": "Tanzania"}, "AZ": {"path": "M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z", "name": "Azerbaijan"}, "IE": {"path": "M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z", "name": "Ireland"}, "ID": {"path": "M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z", "name": "Indonesia"}, "UA": {"path": "M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z", "name": "Ukraine"}, "QA": {"path": "M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z", "name": "Qatar"}, "MZ": {"path": "M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z", "name": "Mozambique"}}, "height": 440.7063107441331, "projection": {"type": "mill", "centralMeridian": 11.5}, "width": 900.0});
assets/admin/scripts/morris.js ADDED
@@ -0,0 +1,1892 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* @license
2
+ morris.js v0.5.0
3
+ Copyright 2014 Olly Smith All rights reserved.
4
+ Licensed under the BSD-2-Clause License.
5
+ */
6
+
7
+
8
+ (function() {
9
+ var $, Morris, minutesSpecHelper, secondsSpecHelper,
10
+ __slice = [].slice,
11
+ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
12
+ __hasProp = {}.hasOwnProperty,
13
+ __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
14
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
15
+
16
+ Morris = window.Morris = {};
17
+
18
+ $ = jQuery;
19
+
20
+ Morris.EventEmitter = (function() {
21
+ function EventEmitter() {}
22
+
23
+ EventEmitter.prototype.on = function(name, handler) {
24
+ if (this.handlers == null) {
25
+ this.handlers = {};
26
+ }
27
+ if (this.handlers[name] == null) {
28
+ this.handlers[name] = [];
29
+ }
30
+ this.handlers[name].push(handler);
31
+ return this;
32
+ };
33
+
34
+ EventEmitter.prototype.fire = function() {
35
+ var args, handler, name, _i, _len, _ref, _results;
36
+ name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
37
+ if ((this.handlers != null) && (this.handlers[name] != null)) {
38
+ _ref = this.handlers[name];
39
+ _results = [];
40
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
41
+ handler = _ref[_i];
42
+ _results.push(handler.apply(null, args));
43
+ }
44
+ return _results;
45
+ }
46
+ };
47
+
48
+ return EventEmitter;
49
+
50
+ })();
51
+
52
+ Morris.commas = function(num) {
53
+ var absnum, intnum, ret, strabsnum;
54
+ if (num != null) {
55
+ ret = num < 0 ? "-" : "";
56
+ absnum = Math.abs(num);
57
+ intnum = Math.floor(absnum).toFixed(0);
58
+ ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ',');
59
+ strabsnum = absnum.toString();
60
+ if (strabsnum.length > intnum.length) {
61
+ ret += strabsnum.slice(intnum.length);
62
+ }
63
+ return ret;
64
+ } else {
65
+ return '-';
66
+ }
67
+ };
68
+
69
+ Morris.pad2 = function(number) {
70
+ return (number < 10 ? '0' : '') + number;
71
+ };
72
+
73
+ Morris.Grid = (function(_super) {
74
+ __extends(Grid, _super);
75
+
76
+ function Grid(options) {
77
+ this.resizeHandler = __bind(this.resizeHandler, this);
78
+ var _this = this;
79
+ if (typeof options.element === 'string') {
80
+ this.el = $(document.getElementById(options.element));
81
+ } else {
82
+ this.el = $(options.element);
83
+ }
84
+ if ((this.el == null) || this.el.length === 0) {
85
+ throw new Error("Graph container element not found");
86
+ }
87
+ if (this.el.css('position') === 'static') {
88
+ this.el.css('position', 'relative');
89
+ }
90
+ this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options);
91
+ if (typeof this.options.units === 'string') {
92
+ this.options.postUnits = options.units;
93
+ }
94
+ this.raphael = new Raphael(this.el[0]);
95
+ this.elementWidth = null;
96
+ this.elementHeight = null;
97
+ this.dirty = false;
98
+ this.selectFrom = null;
99
+ if (this.init) {
100
+ this.init();
101
+ }
102
+ this.setData(this.options.data);
103
+ this.el.bind('mousemove', function(evt) {
104
+ var left, offset, right, width, x;
105
+ offset = _this.el.offset();
106
+ x = evt.pageX - offset.left;
107
+ if (_this.selectFrom) {
108
+ left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x;
109
+ right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x;
110
+ width = right - left;
111
+ return _this.selectionRect.attr({
112
+ x: left,
113
+ width: width
114
+ });
115
+ } else {
116
+ return _this.fire('hovermove', x, evt.pageY - offset.top);
117
+ }
118
+ });
119
+ this.el.bind('mouseleave', function(evt) {
120
+ if (_this.selectFrom) {
121
+ _this.selectionRect.hide();
122
+ _this.selectFrom = null;
123
+ }
124
+ return _this.fire('hoverout');
125
+ });
126
+ this.el.bind('touchstart touchmove touchend', function(evt) {
127
+ var offset, touch;
128
+ touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0];
129
+ offset = _this.el.offset();
130
+ return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top);
131
+ });
132
+ this.el.bind('click', function(evt) {
133
+ var offset;
134
+ offset = _this.el.offset();
135
+ return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);
136
+ });
137
+ if (this.options.rangeSelect) {
138
+ this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({
139
+ fill: this.options.rangeSelectColor,
140
+ stroke: false
141
+ }).toBack().hide();
142
+ this.el.bind('mousedown', function(evt) {
143
+ var offset;
144
+ offset = _this.el.offset();
145
+ return _this.startRange(evt.pageX - offset.left);
146
+ });
147
+ this.el.bind('mouseup', function(evt) {
148
+ var offset;
149
+ offset = _this.el.offset();
150
+ _this.endRange(evt.pageX - offset.left);
151
+ return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top);
152
+ });
153
+ }
154
+ if (this.options.resize) {
155
+ $(window).bind('resize', function(evt) {
156
+ if (_this.timeoutId != null) {
157
+ window.clearTimeout(_this.timeoutId);
158
+ }
159
+ return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);
160
+ });
161
+ }
162
+ this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');
163
+ if (this.postInit) {
164
+ this.postInit();
165
+ }
166
+ }
167
+
168
+ Grid.prototype.gridDefaults = {
169
+ dateFormat: null,
170
+ axes: true,
171
+ grid: true,
172
+ gridLineColor: '#aaa',
173
+ gridStrokeWidth: 0.5,
174
+ gridTextColor: '#888',
175
+ gridTextSize: 12,
176
+ gridTextFamily: 'sans-serif',
177
+ gridTextWeight: 'normal',
178
+ hideHover: false,
179
+ yLabelFormat: null,
180
+ xLabelAngle: 0,
181
+ numLines: 5,
182
+ padding: 25,
183
+ parseTime: true,
184
+ postUnits: '',
185
+ preUnits: '',
186
+ ymax: 'auto',
187
+ ymin: 'auto 0',
188
+ goals: [],
189
+ goalStrokeWidth: 1.0,
190
+ goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'],
191
+ events: [],
192
+ eventStrokeWidth: 1.0,
193
+ eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'],
194
+ rangeSelect: null,
195
+ rangeSelectColor: '#eef',
196
+ resize: false
197
+ };
198
+
199
+ Grid.prototype.setData = function(data, redraw) {
200
+ var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref;
201
+ if (redraw == null) {
202
+ redraw = true;
203
+ }
204
+ this.options.data = data;
205
+ if ((data == null) || data.length === 0) {
206
+ this.data = [];
207
+ this.raphael.clear();
208
+ if (this.hover != null) {
209
+ this.hover.hide();
210
+ }
211
+ return;
212
+ }
213
+ ymax = this.cumulative ? 0 : null;
214
+ ymin = this.cumulative ? 0 : null;
215
+ if (this.options.goals.length > 0) {
216
+ minGoal = Math.min.apply(Math, this.options.goals);
217
+ maxGoal = Math.max.apply(Math, this.options.goals);
218
+ ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal;
219
+ ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal;
220
+ }
221
+ this.data = (function() {
222
+ var _i, _len, _results;
223
+ _results = [];
224
+ for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) {
225
+ row = data[index];
226
+ ret = {
227
+ src: row
228
+ };
229
+ ret.label = row[this.options.xkey];
230
+ if (this.options.parseTime) {
231
+ ret.x = Morris.parseDate(ret.label);
232
+ if (this.options.dateFormat) {
233
+ ret.label = this.options.dateFormat(ret.x);
234
+ } else if (typeof ret.label === 'number') {
235
+ ret.label = new Date(ret.label).toString();
236
+ }
237
+ } else {
238
+ ret.x = index;
239
+ if (this.options.xLabelFormat) {
240
+ ret.label = this.options.xLabelFormat(ret);
241
+ }
242
+ }
243
+ total = 0;
244
+ ret.y = (function() {
245
+ var _j, _len1, _ref, _results1;
246
+ _ref = this.options.ykeys;
247
+ _results1 = [];
248
+ for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) {
249
+ ykey = _ref[idx];
250
+ yval = row[ykey];
251
+ if (typeof yval === 'string') {
252
+ yval = parseFloat(yval);
253
+ }
254
+ if ((yval != null) && typeof yval !== 'number') {
255
+ yval = null;
256
+ }
257
+ if (yval != null) {
258
+ if (this.cumulative) {
259
+ total += yval;
260
+ } else {
261
+ if (ymax != null) {
262
+ ymax = Math.max(yval, ymax);
263
+ ymin = Math.min(yval, ymin);
264
+ } else {
265
+ ymax = ymin = yval;
266
+ }
267
+ }
268
+ }
269
+ if (this.cumulative && (total != null)) {
270
+ ymax = Math.max(total, ymax);
271
+ ymin = Math.min(total, ymin);
272
+ }
273
+ _results1.push(yval);
274
+ }
275
+ return _results1;
276
+ }).call(this);
277
+ _results.push(ret);
278
+ }
279
+ return _results;
280
+ }).call(this);
281
+ if (this.options.parseTime) {
282
+ this.data = this.data.sort(function(a, b) {
283
+ return (a.x > b.x) - (b.x > a.x);
284
+ });
285
+ }
286
+ this.xmin = this.data[0].x;
287
+ this.xmax = this.data[this.data.length - 1].x;
288
+ this.events = [];
289
+ if (this.options.events.length > 0) {
290
+ if (this.options.parseTime) {
291
+ this.events = (function() {
292
+ var _i, _len, _ref, _results;
293
+ _ref = this.options.events;
294
+ _results = [];
295
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
296
+ e = _ref[_i];
297
+ _results.push(Morris.parseDate(e));
298
+ }
299
+ return _results;
300
+ }).call(this);
301
+ } else {
302
+ this.events = this.options.events;
303
+ }
304
+ this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events));
305
+ this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events));
306
+ }
307
+ if (this.xmin === this.xmax) {
308
+ this.xmin -= 1;
309
+ this.xmax += 1;
310
+ }
311
+ this.ymin = this.yboundary('min', ymin);
312
+ this.ymax = this.yboundary('max', ymax);
313
+ if (this.ymin === this.ymax) {
314
+ if (ymin) {
315
+ this.ymin -= 1;
316
+ }
317
+ this.ymax += 1;
318
+ }
319
+ if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) {
320
+ if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {
321
+ this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);
322
+ this.ymin = Math.min(this.ymin, this.grid[0]);
323
+ this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);
324
+ } else {
325
+ step = (this.ymax - this.ymin) / (this.options.numLines - 1);
326
+ this.grid = (function() {
327
+ var _i, _ref1, _ref2, _results;
328
+ _results = [];
329
+ for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) {
330
+ _results.push(y);
331
+ }
332
+ return _results;
333
+ }).call(this);
334
+ }
335
+ }
336
+ this.dirty = true;
337
+ if (redraw) {
338
+ return this.redraw();
339
+ }
340
+ };
341
+
342
+ Grid.prototype.yboundary = function(boundaryType, currentValue) {
343
+ var boundaryOption, suggestedValue;
344
+ boundaryOption = this.options["y" + boundaryType];
345
+ if (typeof boundaryOption === 'string') {
346
+ if (boundaryOption.slice(0, 4) === 'auto') {
347
+ if (boundaryOption.length > 5) {
348
+ suggestedValue = parseInt(boundaryOption.slice(5), 10);
349
+ if (currentValue == null) {
350
+ return suggestedValue;
351
+ }
352
+ return Math[boundaryType](currentValue, suggestedValue);
353
+ } else {
354
+ if (currentValue != null) {
355
+ return currentValue;
356
+ } else {
357
+ return 0;
358
+ }
359
+ }
360
+ } else {
361
+ return parseInt(boundaryOption, 10);
362
+ }
363
+ } else {
364
+ return boundaryOption;
365
+ }
366
+ };
367
+
368
+ Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {
369
+ var gmax, gmin, grid, smag, span, step, unit, y, ymag;
370
+ span = ymax - ymin;
371
+ ymag = Math.floor(Math.log(span) / Math.log(10));
372
+ unit = Math.pow(10, ymag);
373
+ gmin = Math.floor(ymin / unit) * unit;
374
+ gmax = Math.ceil(ymax / unit) * unit;
375
+ step = (gmax - gmin) / (nlines - 1);
376
+ if (unit === 1 && step > 1 && Math.ceil(step) !== step) {
377
+ step = Math.ceil(step);
378
+ gmax = gmin + step * (nlines - 1);
379
+ }
380
+ if (gmin < 0 && gmax > 0) {
381
+ gmin = Math.floor(ymin / step) * step;
382
+ gmax = Math.ceil(ymax / step) * step;
383
+ }
384
+ if (step < 1) {
385
+ smag = Math.floor(Math.log(step) / Math.log(10));
386
+ grid = (function() {
387
+ var _i, _results;
388
+ _results = [];
389
+ for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {
390
+ _results.push(parseFloat(y.toFixed(1 - smag)));
391
+ }
392
+ return _results;
393
+ })();
394
+ } else {
395
+ grid = (function() {
396
+ var _i, _results;
397
+ _results = [];
398
+ for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {
399
+ _results.push(y);
400
+ }
401
+ return _results;
402
+ })();
403
+ }
404
+ return grid;
405
+ };
406
+
407
+ Grid.prototype._calc = function() {
408
+ var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1;
409
+ w = this.el.width();
410
+ h = this.el.height();
411
+ if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {
412
+ this.elementWidth = w;
413
+ this.elementHeight = h;
414
+ this.dirty = false;
415
+ this.left = this.options.padding;
416
+ this.right = this.elementWidth - this.options.padding;
417
+ this.top = this.options.padding;
418
+ this.bottom = this.elementHeight - this.options.padding;
419
+ if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') {
420
+ yLabelWidths = (function() {
421
+ var _i, _len, _ref1, _results;
422
+ _ref1 = this.grid;
423
+ _results = [];
424
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
425
+ gridLine = _ref1[_i];
426
+ _results.push(this.measureText(this.yAxisFormat(gridLine)).width);
427
+ }
428
+ return _results;
429
+ }).call(this);
430
+ this.left += Math.max.apply(Math, yLabelWidths);
431
+ }
432
+ if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') {
433
+ bottomOffsets = (function() {
434
+ var _i, _ref2, _results;
435
+ _results = [];
436
+ for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) {
437
+ _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height);
438
+ }
439
+ return _results;
440
+ }).call(this);
441
+ this.bottom -= Math.max.apply(Math, bottomOffsets);
442
+ }
443
+ this.width = Math.max(1, this.right - this.left);
444
+ this.height = Math.max(1, this.bottom - this.top);
445
+ this.dx = this.width / (this.xmax - this.xmin);
446
+ this.dy = this.height / (this.ymax - this.ymin);
447
+ if (this.calc) {
448
+ return this.calc();
449
+ }
450
+ }
451
+ };
452
+
453
+ Grid.prototype.transY = function(y) {
454
+ return this.bottom - (y - this.ymin) * this.dy;
455
+ };
456
+
457
+ Grid.prototype.transX = function(x) {
458
+ if (this.data.length === 1) {
459
+ return (this.left + this.right) / 2;
460
+ } else {
461
+ return this.left + (x - this.xmin) * this.dx;
462
+ }
463
+ };
464
+
465
+ Grid.prototype.redraw = function() {
466
+ this.raphael.clear();
467
+ this._calc();
468
+ this.drawGrid();
469
+ this.drawGoals();
470
+ this.drawEvents();
471
+ if (this.draw) {
472
+ return this.draw();
473
+ }
474
+ };
475
+
476
+ Grid.prototype.measureText = function(text, angle) {
477
+ var ret, tt;
478
+ if (angle == null) {
479
+ angle = 0;
480
+ }
481
+ tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle);
482
+ ret = tt.getBBox();
483
+ tt.remove();
484
+ return ret;
485
+ };
486
+
487
+ Grid.prototype.yAxisFormat = function(label) {
488
+ return this.yLabelFormat(label);
489
+ };
490
+
491
+ Grid.prototype.yLabelFormat = function(label) {
492
+ if (typeof this.options.yLabelFormat === 'function') {
493
+ return this.options.yLabelFormat(label);
494
+ } else {
495
+ return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits;
496
+ }
497
+ };
498
+
499
+ Grid.prototype.drawGrid = function() {
500
+ var lineY, y, _i, _len, _ref, _ref1, _ref2, _results;
501
+ if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) {
502
+ return;
503
+ }
504
+ _ref1 = this.grid;
505
+ _results = [];
506
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
507
+ lineY = _ref1[_i];
508
+ y = this.transY(lineY);
509
+ if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') {
510
+ this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));
511
+ }
512
+ if (this.options.grid) {
513
+ _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width)));
514
+ } else {
515
+ _results.push(void 0);
516
+ }
517
+ }
518
+ return _results;
519
+ };
520
+
521
+ Grid.prototype.drawGoals = function() {
522
+ var color, goal, i, _i, _len, _ref, _results;
523
+ _ref = this.options.goals;
524
+ _results = [];
525
+ for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
526
+ goal = _ref[i];
527
+ color = this.options.goalLineColors[i % this.options.goalLineColors.length];
528
+ _results.push(this.drawGoal(goal, color));
529
+ }
530
+ return _results;
531
+ };
532
+
533
+ Grid.prototype.drawEvents = function() {
534
+ var color, event, i, _i, _len, _ref, _results;
535
+ _ref = this.events;
536
+ _results = [];
537
+ for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
538
+ event = _ref[i];
539
+ color = this.options.eventLineColors[i % this.options.eventLineColors.length];
540
+ _results.push(this.drawEvent(event, color));
541
+ }
542
+ return _results;
543
+ };
544
+
545
+ Grid.prototype.drawGoal = function(goal, color) {
546
+ return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth);
547
+ };
548
+
549
+ Grid.prototype.drawEvent = function(event, color) {
550
+ return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth);
551
+ };
552
+
553
+ Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) {
554
+ return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end');
555
+ };
556
+
557
+ Grid.prototype.drawGridLine = function(path) {
558
+ return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth);
559
+ };
560
+
561
+ Grid.prototype.startRange = function(x) {
562
+ this.hover.hide();
563
+ this.selectFrom = x;
564
+ return this.selectionRect.attr({
565
+ x: x,
566
+ width: 0
567
+ }).show();
568
+ };
569
+
570
+ Grid.prototype.endRange = function(x) {
571
+ var end, start;
572
+ if (this.selectFrom) {
573
+ start = Math.min(this.selectFrom, x);
574
+ end = Math.max(this.selectFrom, x);
575
+ this.options.rangeSelect.call(this.el, {
576
+ start: this.data[this.hitTest(start)].x,
577
+ end: this.data[this.hitTest(end)].x
578
+ });
579
+ return this.selectFrom = null;
580
+ }
581
+ };
582
+
583
+ Grid.prototype.resizeHandler = function() {
584
+ this.timeoutId = null;
585
+ this.raphael.setSize(this.el.width(), this.el.height());
586
+ return this.redraw();
587
+ };
588
+
589
+ return Grid;
590
+
591
+ })(Morris.EventEmitter);
592
+
593
+ Morris.parseDate = function(date) {
594
+ var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs;
595
+ if (typeof date === 'number') {
596
+ return date;
597
+ }
598
+ m = date.match(/^(\d+) Q(\d)$/);
599
+ n = date.match(/^(\d+)-(\d+)$/);
600
+ o = date.match(/^(\d+)-(\d+)-(\d+)$/);
601
+ p = date.match(/^(\d+) W(\d+)$/);
602
+ q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/);
603
+ r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/);
604
+ if (m) {
605
+ return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime();
606
+ } else if (n) {
607
+ return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime();
608
+ } else if (o) {
609
+ return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime();
610
+ } else if (p) {
611
+ ret = new Date(parseInt(p[1], 10), 0, 1);
612
+ if (ret.getDay() !== 4) {
613
+ ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7);
614
+ }
615
+ return ret.getTime() + parseInt(p[2], 10) * 604800000;
616
+ } else if (q) {
617
+ if (!q[6]) {
618
+ return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime();
619
+ } else {
620
+ offsetmins = 0;
621
+ if (q[6] !== 'Z') {
622
+ offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10);
623
+ if (q[7] === '+') {
624
+ offsetmins = 0 - offsetmins;
625
+ }
626
+ }
627
+ return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins);
628
+ }
629
+ } else if (r) {
630
+ secs = parseFloat(r[6]);
631
+ isecs = Math.floor(secs);
632
+ msecs = Math.round((secs - isecs) * 1000);
633
+ if (!r[8]) {
634
+ return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime();
635
+ } else {
636
+ offsetmins = 0;
637
+ if (r[8] !== 'Z') {
638
+ offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10);
639
+ if (r[9] === '+') {
640
+ offsetmins = 0 - offsetmins;
641
+ }
642
+ }
643
+ return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs);
644
+ }
645
+ } else {
646
+ return new Date(parseInt(date, 10), 0, 1).getTime();
647
+ }
648
+ };
649
+
650
+ Morris.Hover = (function() {
651
+ Hover.defaults = {
652
+ "class": 'morris-hover morris-default-style'
653
+ };
654
+
655
+ function Hover(options) {
656
+ if (options == null) {
657
+ options = {};
658
+ }
659
+ this.options = $.extend({}, Morris.Hover.defaults, options);
660
+ this.el = $("<div class='" + this.options["class"] + "'></div>");
661
+ this.el.hide();
662
+ this.options.parent.append(this.el);
663
+ }
664
+
665
+ Hover.prototype.update = function(html, x, y) {
666
+ if (!html) {
667
+ return this.hide();
668
+ } else {
669
+ this.html(html);
670
+ this.show();
671
+ return this.moveTo(x, y);
672
+ }
673
+ };
674
+
675
+ Hover.prototype.html = function(content) {
676
+ return this.el.html(content);
677
+ };
678
+
679
+ Hover.prototype.moveTo = function(x, y) {
680
+ var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top;
681
+ parentWidth = this.options.parent.innerWidth();
682
+ parentHeight = this.options.parent.innerHeight();
683
+ hoverWidth = this.el.outerWidth();
684
+ hoverHeight = this.el.outerHeight();
685
+ left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth);
686
+ if (y != null) {
687
+ top = y - hoverHeight - 10;
688
+ if (top < 0) {
689
+ top = y + 10;
690
+ if (top + hoverHeight > parentHeight) {
691
+ top = parentHeight / 2 - hoverHeight / 2;
692
+ }
693
+ }
694
+ } else {
695
+ top = parentHeight / 2 - hoverHeight / 2;
696
+ }
697
+ return this.el.css({
698
+ left: left + "px",
699
+ top: parseInt(top) + "px"
700
+ });
701
+ };
702
+
703
+ Hover.prototype.show = function() {
704
+ return this.el.show();
705
+ };
706
+
707
+ Hover.prototype.hide = function() {
708
+ return this.el.hide();
709
+ };
710
+
711
+ return Hover;
712
+
713
+ })();
714
+
715
+ Morris.Line = (function(_super) {
716
+ __extends(Line, _super);
717
+
718
+ function Line(options) {
719
+ this.hilight = __bind(this.hilight, this);
720
+ this.onHoverOut = __bind(this.onHoverOut, this);
721
+ this.onHoverMove = __bind(this.onHoverMove, this);
722
+ this.onGridClick = __bind(this.onGridClick, this);
723
+ if (!(this instanceof Morris.Line)) {
724
+ return new Morris.Line(options);
725
+ }
726
+ Line.__super__.constructor.call(this, options);
727
+ }
728
+
729
+ Line.prototype.init = function() {
730
+ if (this.options.hideHover !== 'always') {
731
+ this.hover = new Morris.Hover({
732
+ parent: this.el
733
+ });
734
+ this.on('hovermove', this.onHoverMove);
735
+ this.on('hoverout', this.onHoverOut);
736
+ return this.on('gridclick', this.onGridClick);
737
+ }
738
+ };
739
+
740
+ Line.prototype.defaults = {
741
+ lineWidth: 3,
742
+ pointSize: 4,
743
+ lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],
744
+ pointStrokeWidths: [1],
745
+ pointStrokeColors: ['#ffffff'],
746
+ pointFillColors: [],
747
+ smooth: true,
748
+ xLabels: 'auto',
749
+ xLabelFormat: null,
750
+ xLabelMargin: 24,
751
+ hideHover: false
752
+ };
753
+
754
+ Line.prototype.calc = function() {
755
+ this.calcPoints();
756
+ return this.generatePaths();
757
+ };
758
+
759
+ Line.prototype.calcPoints = function() {
760
+ var row, y, _i, _len, _ref, _results;
761
+ _ref = this.data;
762
+ _results = [];
763
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
764
+ row = _ref[_i];
765
+ row._x = this.transX(row.x);
766
+ row._y = (function() {
767
+ var _j, _len1, _ref1, _results1;
768
+ _ref1 = row.y;
769
+ _results1 = [];
770
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
771
+ y = _ref1[_j];
772
+ if (y != null) {
773
+ _results1.push(this.transY(y));
774
+ } else {
775
+ _results1.push(y);
776
+ }
777
+ }
778
+ return _results1;
779
+ }).call(this);
780
+ _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() {
781
+ var _j, _len1, _ref1, _results1;
782
+ _ref1 = row._y;
783
+ _results1 = [];
784
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
785
+ y = _ref1[_j];
786
+ if (y != null) {
787
+ _results1.push(y);
788
+ }
789
+ }
790
+ return _results1;
791
+ })())));
792
+ }
793
+ return _results;
794
+ };
795
+
796
+ Line.prototype.hitTest = function(x) {
797
+ var index, r, _i, _len, _ref;
798
+ if (this.data.length === 0) {
799
+ return null;
800
+ }
801
+ _ref = this.data.slice(1);
802
+ for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {
803
+ r = _ref[index];
804
+ if (x < (r._x + this.data[index]._x) / 2) {
805
+ break;
806
+ }
807
+ }
808
+ return index;
809
+ };
810
+
811
+ Line.prototype.onGridClick = function(x, y) {
812
+ var index;
813
+ index = this.hitTest(x);
814
+ return this.fire('click', index, this.data[index].src, x, y);
815
+ };
816
+
817
+ Line.prototype.onHoverMove = function(x, y) {
818
+ var index;
819
+ index = this.hitTest(x);
820
+ return this.displayHoverForRow(index);
821
+ };
822
+
823
+ Line.prototype.onHoverOut = function() {
824
+ if (this.options.hideHover !== false) {
825
+ return this.displayHoverForRow(null);
826
+ }
827
+ };
828
+
829
+ Line.prototype.displayHoverForRow = function(index) {
830
+ var _ref;
831
+ if (index != null) {
832
+ (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));
833
+ return this.hilight(index);
834
+ } else {
835
+ this.hover.hide();
836
+ return this.hilight();
837
+ }
838
+ };
839
+
840
+ Line.prototype.hoverContentForRow = function(index) {
841
+ var content, j, row, y, _i, _len, _ref;
842
+ row = this.data[index];
843
+ content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
844
+ _ref = row.y;
845
+ for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
846
+ y = _ref[j];
847
+ content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
848
+ }
849
+ if (typeof this.options.hoverCallback === 'function') {
850
+ content = this.options.hoverCallback(index, this.options, content, row.src);
851
+ }
852
+ return [content, row._x, row._ymax];
853
+ };
854
+
855
+ Line.prototype.generatePaths = function() {
856
+ var coords, i, r, smooth;
857
+ return this.paths = (function() {
858
+ var _i, _ref, _ref1, _results;
859
+ _results = [];
860
+ for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
861
+ smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0);
862
+ coords = (function() {
863
+ var _j, _len, _ref2, _results1;
864
+ _ref2 = this.data;
865
+ _results1 = [];
866
+ for (_j = 0, _len = _ref2.length; _j < _len; _j++) {
867
+ r = _ref2[_j];
868
+ if (r._y[i] !== void 0) {
869
+ _results1.push({
870
+ x: r._x,
871
+ y: r._y[i]
872
+ });
873
+ }
874
+ }
875
+ return _results1;
876
+ }).call(this);
877
+ if (coords.length > 1) {
878
+ _results.push(Morris.Line.createPath(coords, smooth, this.bottom));
879
+ } else {
880
+ _results.push(null);
881
+ }
882
+ }
883
+ return _results;
884
+ }).call(this);
885
+ };
886
+
887
+ Line.prototype.draw = function() {
888
+ var _ref;
889
+ if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {
890
+ this.drawXAxis();
891
+ }
892
+ this.drawSeries();
893
+ if (this.options.hideHover === false) {
894
+ return this.displayHoverForRow(this.data.length - 1);
895
+ }
896
+ };
897
+
898
+ Line.prototype.drawXAxis = function() {
899
+ var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results,
900
+ _this = this;
901
+ ypos = this.bottom + this.options.padding / 2;
902
+ prevLabelMargin = null;
903
+ prevAngleMargin = null;
904
+ drawLabel = function(labelText, xpos) {
905
+ var label, labelBox, margin, offset, textBox;
906
+ label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText);
907
+ textBox = label.getBBox();
908
+ label.transform("r" + (-_this.options.xLabelAngle));
909
+ labelBox = label.getBBox();
910
+ label.transform("t0," + (labelBox.height / 2) + "...");
911
+ if (_this.options.xLabelAngle !== 0) {
912
+ offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0);
913
+ label.transform("t" + offset + ",0...");
914
+ }
915
+ labelBox = label.getBBox();
916
+ if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) {
917
+ if (_this.options.xLabelAngle !== 0) {
918
+ margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0);
919
+ prevAngleMargin = labelBox.x - margin;
920
+ }
921
+ return prevLabelMargin = labelBox.x - _this.options.xLabelMargin;
922
+ } else {
923
+ return label.remove();
924
+ }
925
+ };
926
+ if (this.options.parseTime) {
927
+ if (this.data.length === 1 && this.options.xLabels === 'auto') {
928
+ labels = [[this.data[0].label, this.data[0].x]];
929
+ } else {
930
+ labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat);
931
+ }
932
+ } else {
933
+ labels = (function() {
934
+ var _i, _len, _ref, _results;
935
+ _ref = this.data;
936
+ _results = [];
937
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
938
+ row = _ref[_i];
939
+ _results.push([row.label, row.x]);
940
+ }
941
+ return _results;
942
+ }).call(this);
943
+ }
944
+ labels.reverse();
945
+ _results = [];
946
+ for (_i = 0, _len = labels.length; _i < _len; _i++) {
947
+ l = labels[_i];
948
+ _results.push(drawLabel(l[0], l[1]));
949
+ }
950
+ return _results;
951
+ };
952
+
953
+ Line.prototype.drawSeries = function() {
954
+ var i, _i, _j, _ref, _ref1, _results;
955
+ this.seriesPoints = [];
956
+ for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {
957
+ this._drawLineFor(i);
958
+ }
959
+ _results = [];
960
+ for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {
961
+ _results.push(this._drawPointFor(i));
962
+ }
963
+ return _results;
964
+ };
965
+
966
+ Line.prototype._drawPointFor = function(index) {
967
+ var circle, row, _i, _len, _ref, _results;
968
+ this.seriesPoints[index] = [];
969
+ _ref = this.data;
970
+ _results = [];
971
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
972
+ row = _ref[_i];
973
+ circle = null;
974
+ if (row._y[index] != null) {
975
+ circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index);
976
+ }
977
+ _results.push(this.seriesPoints[index].push(circle));
978
+ }
979
+ return _results;
980
+ };
981
+
982
+ Line.prototype._drawLineFor = function(index) {
983
+ var path;
984
+ path = this.paths[index];
985
+ if (path !== null) {
986
+ return this.drawLinePath(path, this.colorFor(null, index, 'line'), index);
987
+ }
988
+ };
989
+
990
+ Line.createPath = function(coords, smooth, bottom) {
991
+ var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;
992
+ path = "";
993
+ if (smooth) {
994
+ grads = Morris.Line.gradients(coords);
995
+ }
996
+ prevCoord = {
997
+ y: null
998
+ };
999
+ for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {
1000
+ coord = coords[i];
1001
+ if (coord.y != null) {
1002
+ if (prevCoord.y != null) {
1003
+ if (smooth) {
1004
+ g = grads[i];
1005
+ lg = grads[i - 1];
1006
+ ix = (coord.x - prevCoord.x) / 4;
1007
+ x1 = prevCoord.x + ix;
1008
+ y1 = Math.min(bottom, prevCoord.y + ix * lg);
1009
+ x2 = coord.x - ix;
1010
+ y2 = Math.min(bottom, coord.y - ix * g);
1011
+ path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y;
1012
+ } else {
1013
+ path += "L" + coord.x + "," + coord.y;
1014
+ }
1015
+ } else {
1016
+ if (!smooth || (grads[i] != null)) {
1017
+ path += "M" + coord.x + "," + coord.y;
1018
+ }
1019
+ }
1020
+ }
1021
+ prevCoord = coord;
1022
+ }
1023
+ return path;
1024
+ };
1025
+
1026
+ Line.gradients = function(coords) {
1027
+ var coord, grad, i, nextCoord, prevCoord, _i, _len, _results;
1028
+ grad = function(a, b) {
1029
+ return (a.y - b.y) / (a.x - b.x);
1030
+ };
1031
+ _results = [];
1032
+ for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {
1033
+ coord = coords[i];
1034
+ if (coord.y != null) {
1035
+ nextCoord = coords[i + 1] || {
1036
+ y: null
1037
+ };
1038
+ prevCoord = coords[i - 1] || {
1039
+ y: null
1040
+ };
1041
+ if ((prevCoord.y != null) && (nextCoord.y != null)) {
1042
+ _results.push(grad(prevCoord, nextCoord));
1043
+ } else if (prevCoord.y != null) {
1044
+ _results.push(grad(prevCoord, coord));
1045
+ } else if (nextCoord.y != null) {
1046
+ _results.push(grad(coord, nextCoord));
1047
+ } else {
1048
+ _results.push(null);
1049
+ }
1050
+ } else {
1051
+ _results.push(null);
1052
+ }
1053
+ }
1054
+ return _results;
1055
+ };
1056
+
1057
+ Line.prototype.hilight = function(index) {
1058
+ var i, _i, _j, _ref, _ref1;
1059
+ if (this.prevHilight !== null && this.prevHilight !== index) {
1060
+ for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
1061
+ if (this.seriesPoints[i][this.prevHilight]) {
1062
+ this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i));
1063
+ }
1064
+ }
1065
+ }
1066
+ if (index !== null && this.prevHilight !== index) {
1067
+ for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
1068
+ if (this.seriesPoints[i][index]) {
1069
+ this.seriesPoints[i][index].animate(this.pointGrowSeries(i));
1070
+ }
1071
+ }
1072
+ }
1073
+ return this.prevHilight = index;
1074
+ };
1075
+
1076
+ Line.prototype.colorFor = function(row, sidx, type) {
1077
+ if (typeof this.options.lineColors === 'function') {
1078
+ return this.options.lineColors.call(this, row, sidx, type);
1079
+ } else if (type === 'point') {
1080
+ return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length];
1081
+ } else {
1082
+ return this.options.lineColors[sidx % this.options.lineColors.length];
1083
+ }
1084
+ };
1085
+
1086
+ Line.prototype.drawXAxisLabel = function(xPos, yPos, text) {
1087
+ return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);
1088
+ };
1089
+
1090
+ Line.prototype.drawLinePath = function(path, lineColor, lineIndex) {
1091
+ return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex));
1092
+ };
1093
+
1094
+ Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) {
1095
+ return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex));
1096
+ };
1097
+
1098
+ Line.prototype.pointStrokeWidthForSeries = function(index) {
1099
+ return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length];
1100
+ };
1101
+
1102
+ Line.prototype.pointStrokeColorForSeries = function(index) {
1103
+ return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length];
1104
+ };
1105
+
1106
+ Line.prototype.lineWidthForSeries = function(index) {
1107
+ if (this.options.lineWidth instanceof Array) {
1108
+ return this.options.lineWidth[index % this.options.lineWidth.length];
1109
+ } else {
1110
+ return this.options.lineWidth;
1111
+ }
1112
+ };
1113
+
1114
+ Line.prototype.pointSizeForSeries = function(index) {
1115
+ if (this.options.pointSize instanceof Array) {
1116
+ return this.options.pointSize[index % this.options.pointSize.length];
1117
+ } else {
1118
+ return this.options.pointSize;
1119
+ }
1120
+ };
1121
+
1122
+ Line.prototype.pointGrowSeries = function(index) {
1123
+ return Raphael.animation({
1124
+ r: this.pointSizeForSeries(index) + 3
1125
+ }, 25, 'linear');
1126
+ };
1127
+
1128
+ Line.prototype.pointShrinkSeries = function(index) {
1129
+ return Raphael.animation({
1130
+ r: this.pointSizeForSeries(index)
1131
+ }, 25, 'linear');
1132
+ };
1133
+
1134
+ return Line;
1135
+
1136
+ })(Morris.Grid);
1137
+
1138
+ Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) {
1139
+ var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref;
1140
+ ddensity = 200 * (dmax - dmin) / pxwidth;
1141
+ d0 = new Date(dmin);
1142
+ spec = Morris.LABEL_SPECS[specName];
1143
+ if (spec === void 0) {
1144
+ _ref = Morris.AUTO_LABEL_ORDER;
1145
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1146
+ name = _ref[_i];
1147
+ s = Morris.LABEL_SPECS[name];
1148
+ if (ddensity >= s.span) {
1149
+ spec = s;
1150
+ break;
1151
+ }
1152
+ }
1153
+ }
1154
+ if (spec === void 0) {
1155
+ spec = Morris.LABEL_SPECS["second"];
1156
+ }
1157
+ if (xLabelFormat) {
1158
+ spec = $.extend({}, spec, {
1159
+ fmt: xLabelFormat
1160
+ });
1161
+ }
1162
+ d = spec.start(d0);
1163
+ ret = [];
1164
+ while ((t = d.getTime()) <= dmax) {
1165
+ if (t >= dmin) {
1166
+ ret.push([spec.fmt(d), t]);
1167
+ }
1168
+ spec.incr(d);
1169
+ }
1170
+ return ret;
1171
+ };
1172
+
1173
+ minutesSpecHelper = function(interval) {
1174
+ return {
1175
+ span: interval * 60 * 1000,
1176
+ start: function(d) {
1177
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());
1178
+ },
1179
+ fmt: function(d) {
1180
+ return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes()));
1181
+ },
1182
+ incr: function(d) {
1183
+ return d.setUTCMinutes(d.getUTCMinutes() + interval);
1184
+ }
1185
+ };
1186
+ };
1187
+
1188
+ secondsSpecHelper = function(interval) {
1189
+ return {
1190
+ span: interval * 1000,
1191
+ start: function(d) {
1192
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());
1193
+ },
1194
+ fmt: function(d) {
1195
+ return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds()));
1196
+ },
1197
+ incr: function(d) {
1198
+ return d.setUTCSeconds(d.getUTCSeconds() + interval);
1199
+ }
1200
+ };
1201
+ };
1202
+
1203
+ Morris.LABEL_SPECS = {
1204
+ "decade": {
1205
+ span: 172800000000,
1206
+ start: function(d) {
1207
+ return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1);
1208
+ },
1209
+ fmt: function(d) {
1210
+ return "" + (d.getFullYear());
1211
+ },
1212
+ incr: function(d) {
1213
+ return d.setFullYear(d.getFullYear() + 10);
1214
+ }
1215
+ },
1216
+ "year": {
1217
+ span: 17280000000,
1218
+ start: function(d) {
1219
+ return new Date(d.getFullYear(), 0, 1);
1220
+ },
1221
+ fmt: function(d) {
1222
+ return "" + (d.getFullYear());
1223
+ },
1224
+ incr: function(d) {
1225
+ return d.setFullYear(d.getFullYear() + 1);
1226
+ }
1227
+ },
1228
+ "month": {
1229
+ span: 2419200000,
1230
+ start: function(d) {
1231
+ return new Date(d.getFullYear(), d.getMonth(), 1);
1232
+ },
1233
+ fmt: function(d) {
1234
+ return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1));
1235
+ },
1236
+ incr: function(d) {
1237
+ return d.setMonth(d.getMonth() + 1);
1238
+ }
1239
+ },
1240
+ "week": {
1241
+ span: 604800000,
1242
+ start: function(d) {
1243
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
1244
+ },
1245
+ fmt: function(d) {
1246
+ return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate()));
1247
+ },
1248
+ incr: function(d) {
1249
+ return d.setDate(d.getDate() + 7);
1250
+ }
1251
+ },
1252
+ "day": {
1253
+ span: 86400000,
1254
+ start: function(d) {
1255
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
1256
+ },
1257
+ fmt: function(d) {
1258
+ return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate()));
1259
+ },
1260
+ incr: function(d) {
1261
+ return d.setDate(d.getDate() + 1);
1262
+ }
1263
+ },
1264
+ "hour": minutesSpecHelper(60),
1265
+ "30min": minutesSpecHelper(30),
1266
+ "15min": minutesSpecHelper(15),
1267
+ "10min": minutesSpecHelper(10),
1268
+ "5min": minutesSpecHelper(5),
1269
+ "minute": minutesSpecHelper(1),
1270
+ "30sec": secondsSpecHelper(30),
1271
+ "15sec": secondsSpecHelper(15),
1272
+ "10sec": secondsSpecHelper(10),
1273
+ "5sec": secondsSpecHelper(5),
1274
+ "second": secondsSpecHelper(1)
1275
+ };
1276
+
1277
+ Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"];
1278
+
1279
+ Morris.Area = (function(_super) {
1280
+ var areaDefaults;
1281
+
1282
+ __extends(Area, _super);
1283
+
1284
+ areaDefaults = {
1285
+ fillOpacity: 'auto',
1286
+ behaveLikeLine: false
1287
+ };
1288
+
1289
+ function Area(options) {
1290
+ var areaOptions;
1291
+ if (!(this instanceof Morris.Area)) {
1292
+ return new Morris.Area(options);
1293
+ }
1294
+ areaOptions = $.extend({}, areaDefaults, options);
1295
+ this.cumulative = !areaOptions.behaveLikeLine;
1296
+ if (areaOptions.fillOpacity === 'auto') {
1297
+ areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;
1298
+ }
1299
+ Area.__super__.constructor.call(this, areaOptions);
1300
+ }
1301
+
1302
+ Area.prototype.calcPoints = function() {
1303
+ var row, total, y, _i, _len, _ref, _results;
1304
+ _ref = this.data;
1305
+ _results = [];
1306
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1307
+ row = _ref[_i];
1308
+ row._x = this.transX(row.x);
1309
+ total = 0;
1310
+ row._y = (function() {
1311
+ var _j, _len1, _ref1, _results1;
1312
+ _ref1 = row.y;
1313
+ _results1 = [];
1314
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
1315
+ y = _ref1[_j];
1316
+ if (this.options.behaveLikeLine) {
1317
+ _results1.push(this.transY(y));
1318
+ } else {
1319
+ total += y || 0;
1320
+ _results1.push(this.transY(total));
1321
+ }
1322
+ }
1323
+ return _results1;
1324
+ }).call(this);
1325
+ _results.push(row._ymax = Math.max.apply(Math, row._y));
1326
+ }
1327
+ return _results;
1328
+ };
1329
+
1330
+ Area.prototype.drawSeries = function() {
1331
+ var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;
1332
+ this.seriesPoints = [];
1333
+ if (this.options.behaveLikeLine) {
1334
+ range = (function() {
1335
+ _results = [];
1336
+ for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
1337
+ return _results;
1338
+ }).apply(this);
1339
+ } else {
1340
+ range = (function() {
1341
+ _results1 = [];
1342
+ for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }
1343
+ return _results1;
1344
+ }).apply(this);
1345
+ }
1346
+ _results2 = [];
1347
+ for (_k = 0, _len = range.length; _k < _len; _k++) {
1348
+ i = range[_k];
1349
+ this._drawFillFor(i);
1350
+ this._drawLineFor(i);
1351
+ _results2.push(this._drawPointFor(i));
1352
+ }
1353
+ return _results2;
1354
+ };
1355
+
1356
+ Area.prototype._drawFillFor = function(index) {
1357
+ var path;
1358
+ path = this.paths[index];
1359
+ if (path !== null) {
1360
+ path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z");
1361
+ return this.drawFilledPath(path, this.fillForSeries(index));
1362
+ }
1363
+ };
1364
+
1365
+ Area.prototype.fillForSeries = function(i) {
1366
+ var color;
1367
+ color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));
1368
+ return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));
1369
+ };
1370
+
1371
+ Area.prototype.drawFilledPath = function(path, fill) {
1372
+ return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none');
1373
+ };
1374
+
1375
+ return Area;
1376
+
1377
+ })(Morris.Line);
1378
+
1379
+ Morris.Bar = (function(_super) {
1380
+ __extends(Bar, _super);
1381
+
1382
+ function Bar(options) {
1383
+ this.onHoverOut = __bind(this.onHoverOut, this);
1384
+ this.onHoverMove = __bind(this.onHoverMove, this);
1385
+ this.onGridClick = __bind(this.onGridClick, this);
1386
+ if (!(this instanceof Morris.Bar)) {
1387
+ return new Morris.Bar(options);
1388
+ }
1389
+ Bar.__super__.constructor.call(this, $.extend({}, options, {
1390
+ parseTime: false
1391
+ }));
1392
+ }
1393
+
1394
+ Bar.prototype.init = function() {
1395
+ this.cumulative = this.options.stacked;
1396
+ if (this.options.hideHover !== 'always') {
1397
+ this.hover = new Morris.Hover({
1398
+ parent: this.el
1399
+ });
1400
+ this.on('hovermove', this.onHoverMove);
1401
+ this.on('hoverout', this.onHoverOut);
1402
+ return this.on('gridclick', this.onGridClick);
1403
+ }
1404
+ };
1405
+
1406
+ Bar.prototype.defaults = {
1407
+ barSizeRatio: 0.75,
1408
+ barGap: 3,
1409
+ barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],
1410
+ barOpacity: 1.0,
1411
+ barRadius: [0, 0, 0, 0],
1412
+ xLabelMargin: 50
1413
+ };
1414
+
1415
+ Bar.prototype.calc = function() {
1416
+ var _ref;
1417
+ this.calcBars();
1418
+ if (this.options.hideHover === false) {
1419
+ return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1));
1420
+ }
1421
+ };
1422
+
1423
+ Bar.prototype.calcBars = function() {
1424
+ var idx, row, y, _i, _len, _ref, _results;
1425
+ _ref = this.data;
1426
+ _results = [];
1427
+ for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {
1428
+ row = _ref[idx];
1429
+ row._x = this.left + this.width * (idx + 0.5) / this.data.length;
1430
+ _results.push(row._y = (function() {
1431
+ var _j, _len1, _ref1, _results1;
1432
+ _ref1 = row.y;
1433
+ _results1 = [];
1434
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
1435
+ y = _ref1[_j];
1436
+ if (y != null) {
1437
+ _results1.push(this.transY(y));
1438
+ } else {
1439
+ _results1.push(null);
1440
+ }
1441
+ }
1442
+ return _results1;
1443
+ }).call(this));
1444
+ }
1445
+ return _results;
1446
+ };
1447
+
1448
+ Bar.prototype.draw = function() {
1449
+ var _ref;
1450
+ if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {
1451
+ this.drawXAxis();
1452
+ }
1453
+ return this.drawSeries();
1454
+ };
1455
+
1456
+ Bar.prototype.drawXAxis = function() {
1457
+ var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results;
1458
+ ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2);
1459
+ prevLabelMargin = null;
1460
+ prevAngleMargin = null;
1461
+ _results = [];
1462
+ for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
1463
+ row = this.data[this.data.length - 1 - i];
1464
+ label = this.drawXAxisLabel(row._x, ypos, row.label);
1465
+ textBox = label.getBBox();
1466
+ label.transform("r" + (-this.options.xLabelAngle));
1467
+ labelBox = label.getBBox();
1468
+ label.transform("t0," + (labelBox.height / 2) + "...");
1469
+ if (this.options.xLabelAngle !== 0) {
1470
+ offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0);
1471
+ label.transform("t" + offset + ",0...");
1472
+ }
1473
+ if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) {
1474
+ if (this.options.xLabelAngle !== 0) {
1475
+ margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0);
1476
+ prevAngleMargin = labelBox.x - margin;
1477
+ }
1478
+ _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin);
1479
+ } else {
1480
+ _results.push(label.remove());
1481
+ }
1482
+ }
1483
+ return _results;
1484
+ };
1485
+
1486
+ Bar.prototype.drawSeries = function() {
1487
+ var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos;
1488
+ groupWidth = this.width / this.options.data.length;
1489
+ numBars = this.options.stacked ? 1 : this.options.ykeys.length;
1490
+ barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars;
1491
+ if (this.options.barSize) {
1492
+ barWidth = Math.min(barWidth, this.options.barSize);
1493
+ }
1494
+ spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1);
1495
+ leftPadding = spaceLeft / 2;
1496
+ zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null;
1497
+ return this.bars = (function() {
1498
+ var _i, _len, _ref, _results;
1499
+ _ref = this.data;
1500
+ _results = [];
1501
+ for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {
1502
+ row = _ref[idx];
1503
+ lastTop = 0;
1504
+ _results.push((function() {
1505
+ var _j, _len1, _ref1, _results1;
1506
+ _ref1 = row._y;
1507
+ _results1 = [];
1508
+ for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) {
1509
+ ypos = _ref1[sidx];
1510
+ if (ypos !== null) {
1511
+ if (zeroPos) {
1512
+ top = Math.min(ypos, zeroPos);
1513
+ bottom = Math.max(ypos, zeroPos);
1514
+ } else {
1515
+ top = ypos;
1516
+ bottom = this.bottom;
1517
+ }
1518
+ left = this.left + idx * groupWidth + leftPadding;
1519
+ if (!this.options.stacked) {
1520
+ left += sidx * (barWidth + this.options.barGap);
1521
+ }
1522
+ size = bottom - top;
1523
+ if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) {
1524
+ this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius);
1525
+ }
1526
+ if (this.options.stacked) {
1527
+ top -= lastTop;
1528
+ }
1529
+ this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius);
1530
+ _results1.push(lastTop += size);
1531
+ } else {
1532
+ _results1.push(null);
1533
+ }
1534
+ }
1535
+ return _results1;
1536
+ }).call(this));
1537
+ }
1538
+ return _results;
1539
+ }).call(this);
1540
+ };
1541
+
1542
+ Bar.prototype.colorFor = function(row, sidx, type) {
1543
+ var r, s;
1544
+ if (typeof this.options.barColors === 'function') {
1545
+ r = {
1546
+ x: row.x,
1547
+ y: row.y[sidx],
1548
+ label: row.label
1549
+ };
1550
+ s = {
1551
+ index: sidx,
1552
+ key: this.options.ykeys[sidx],
1553
+ label: this.options.labels[sidx]
1554
+ };
1555
+ return this.options.barColors.call(this, r, s, type);
1556
+ } else {
1557
+ return this.options.barColors[sidx % this.options.barColors.length];
1558
+ }
1559
+ };
1560
+
1561
+ Bar.prototype.hitTest = function(x) {
1562
+ if (this.data.length === 0) {
1563
+ return null;
1564
+ }
1565
+ x = Math.max(Math.min(x, this.right), this.left);
1566
+ return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));
1567
+ };
1568
+
1569
+ Bar.prototype.onGridClick = function(x, y) {
1570
+ var index;
1571
+ index = this.hitTest(x);
1572
+ return this.fire('click', index, this.data[index].src, x, y);
1573
+ };
1574
+
1575
+ Bar.prototype.onHoverMove = function(x, y) {
1576
+ var index, _ref;
1577
+ index = this.hitTest(x);
1578
+ return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));
1579
+ };
1580
+
1581
+ Bar.prototype.onHoverOut = function() {
1582
+ if (this.options.hideHover !== false) {
1583
+ return this.hover.hide();
1584
+ }
1585
+ };
1586
+
1587
+ Bar.prototype.hoverContentForRow = function(index) {
1588
+ var content, j, row, x, y, _i, _len, _ref;
1589
+ row = this.data[index];
1590
+ content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
1591
+ _ref = row.y;
1592
+ for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
1593
+ y = _ref[j];
1594
+ content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
1595
+ }
1596
+ if (typeof this.options.hoverCallback === 'function') {
1597
+ content = this.options.hoverCallback(index, this.options, content, row.src);
1598
+ }
1599
+ x = this.left + (index + 0.5) * this.width / this.data.length;
1600
+ return [content, x];
1601
+ };
1602
+
1603
+ Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) {
1604
+ var label;
1605
+ return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);
1606
+ };
1607
+
1608
+ Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) {
1609
+ var maxRadius, path;
1610
+ maxRadius = Math.max.apply(Math, radiusArray);
1611
+ if (maxRadius === 0 || maxRadius > height) {
1612
+ path = this.raphael.rect(xPos, yPos, width, height);
1613
+ } else {
1614
+ path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray));
1615
+ }
1616
+ return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none');
1617
+ };
1618
+
1619
+ Bar.prototype.roundedRect = function(x, y, w, h, r) {
1620
+ if (r == null) {
1621
+ r = [0, 0, 0, 0];
1622
+ }
1623
+ return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"];
1624
+ };
1625
+
1626
+ return Bar;
1627
+
1628
+ })(Morris.Grid);
1629
+
1630
+ Morris.Donut = (function(_super) {
1631
+ __extends(Donut, _super);
1632
+
1633
+ Donut.prototype.defaults = {
1634
+ colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],
1635
+ backgroundColor: '#FFFFFF',
1636
+ labelColor: '#000000',
1637
+ formatter: Morris.commas,
1638
+ resize: false
1639
+ };
1640
+
1641
+ function Donut(options) {
1642
+ this.resizeHandler = __bind(this.resizeHandler, this);
1643
+ this.select = __bind(this.select, this);
1644
+ this.click = __bind(this.click, this);
1645
+ var _this = this;
1646
+ if (!(this instanceof Morris.Donut)) {
1647
+ return new Morris.Donut(options);
1648
+ }
1649
+ this.options = $.extend({}, this.defaults, options);
1650
+ if (typeof options.element === 'string') {
1651
+ this.el = $(document.getElementById(options.element));
1652
+ } else {
1653
+ this.el = $(options.element);
1654
+ }
1655
+ if (this.el === null || this.el.length === 0) {
1656
+ throw new Error("Graph placeholder not found.");
1657
+ }
1658
+ if (options.data === void 0 || options.data.length === 0) {
1659
+ return;
1660
+ }
1661
+ this.raphael = new Raphael(this.el[0]);
1662
+ if (this.options.resize) {
1663
+ $(window).bind('resize', function(evt) {
1664
+ if (_this.timeoutId != null) {
1665
+ window.clearTimeout(_this.timeoutId);
1666
+ }
1667
+ return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);
1668
+ });
1669
+ }
1670
+ this.setData(options.data);
1671
+ }
1672
+
1673
+ Donut.prototype.redraw = function() {
1674
+ var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
1675
+ this.raphael.clear();
1676
+ cx = this.el.width() / 2;
1677
+ cy = this.el.height() / 2;
1678
+ w = (Math.min(cx, cy) - 10) / 3;
1679
+ total = 0;
1680
+ _ref = this.values;
1681
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1682
+ value = _ref[_i];
1683
+ total += value;
1684
+ }
1685
+ min = 5 / (2 * w);
1686
+ C = 1.9999 * Math.PI - min * this.data.length;
1687
+ last = 0;
1688
+ idx = 0;
1689
+ this.segments = [];
1690
+ _ref1 = this.values;
1691
+ for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {
1692
+ value = _ref1[i];
1693
+ next = last + min + C * (value / total);
1694
+ seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);
1695
+ seg.render();
1696
+ this.segments.push(seg);
1697
+ seg.on('hover', this.select);
1698
+ seg.on('click', this.click);
1699
+ last = next;
1700
+ idx += 1;
1701
+ }
1702
+ this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800);
1703
+ this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);
1704
+ max_value = Math.max.apply(Math, this.values);
1705
+ idx = 0;
1706
+ _ref2 = this.values;
1707
+ _results = [];
1708
+ for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
1709
+ value = _ref2[_k];
1710
+ if (value === max_value) {
1711
+ this.select(idx);
1712
+ break;
1713
+ }
1714
+ _results.push(idx += 1);
1715
+ }
1716
+ return _results;
1717
+ };
1718
+
1719
+ Donut.prototype.setData = function(data) {
1720
+ var row;
1721
+ this.data = data;
1722
+ this.values = (function() {
1723
+ var _i, _len, _ref, _results;
1724
+ _ref = this.data;
1725
+ _results = [];
1726
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1727
+ row = _ref[_i];
1728
+ _results.push(parseFloat(row.value));
1729
+ }
1730
+ return _results;
1731
+ }).call(this);
1732
+ return this.redraw();
1733
+ };
1734
+
1735
+ Donut.prototype.click = function(idx) {
1736
+ return this.fire('click', idx, this.data[idx]);
1737
+ };
1738
+
1739
+ Donut.prototype.select = function(idx) {
1740
+ var row, s, segment, _i, _len, _ref;
1741
+ _ref = this.segments;
1742
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1743
+ s = _ref[_i];
1744
+ s.deselect();
1745
+ }
1746
+ segment = this.segments[idx];
1747
+ segment.select();
1748
+ row = this.data[idx];
1749
+ return this.setLabels(row.label, this.options.formatter(row.value, row));
1750
+ };
1751
+
1752
+ Donut.prototype.setLabels = function(label1, label2) {
1753
+ var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale;
1754
+ inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3;
1755
+ maxWidth = 1.8 * inner;
1756
+ maxHeightTop = inner / 2;
1757
+ maxHeightBottom = inner / 3;
1758
+ this.text1.attr({
1759
+ text: label1,
1760
+ transform: ''
1761
+ });
1762
+ text1bbox = this.text1.getBBox();
1763
+ text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height);
1764
+ this.text1.attr({
1765
+ transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height)
1766
+ });
1767
+ this.text2.attr({
1768
+ text: label2,
1769
+ transform: ''
1770
+ });
1771
+ text2bbox = this.text2.getBBox();
1772
+ text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height);
1773
+ return this.text2.attr({
1774
+ transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y
1775
+ });
1776
+ };
1777
+
1778
+ Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) {
1779
+ var text;
1780
+ text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color);
1781
+ if (fontWeight != null) {
1782
+ text.attr('font-weight', fontWeight);
1783
+ }
1784
+ return text;
1785
+ };
1786
+
1787
+ Donut.prototype.resizeHandler = function() {
1788
+ this.timeoutId = null;
1789
+ this.raphael.setSize(this.el.width(), this.el.height());
1790
+ return this.redraw();
1791
+ };
1792
+
1793
+ return Donut;
1794
+
1795
+ })(Morris.EventEmitter);
1796
+
1797
+ Morris.DonutSegment = (function(_super) {
1798
+ __extends(DonutSegment, _super);
1799
+
1800
+ function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {
1801
+ this.cx = cx;
1802
+ this.cy = cy;
1803
+ this.inner = inner;
1804
+ this.outer = outer;
1805
+ this.color = color;
1806
+ this.backgroundColor = backgroundColor;
1807
+ this.index = index;
1808
+ this.raphael = raphael;
1809
+ this.deselect = __bind(this.deselect, this);
1810
+ this.select = __bind(this.select, this);
1811
+ this.sin_p0 = Math.sin(p0);
1812
+ this.cos_p0 = Math.cos(p0);
1813
+ this.sin_p1 = Math.sin(p1);
1814
+ this.cos_p1 = Math.cos(p1);
1815
+ this.is_long = (p1 - p0) > Math.PI ? 1 : 0;
1816
+ this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5);
1817
+ this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer);
1818
+ this.hilight = this.calcArc(this.inner);
1819
+ }
1820
+
1821
+ DonutSegment.prototype.calcArcPoints = function(r) {
1822
+ return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1];
1823
+ };
1824
+
1825
+ DonutSegment.prototype.calcSegment = function(r1, r2) {
1826
+ var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1;
1827
+ _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];
1828
+ _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3];
1829
+ return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z";
1830
+ };
1831
+
1832
+ DonutSegment.prototype.calcArc = function(r) {
1833
+ var ix0, ix1, iy0, iy1, _ref;
1834
+ _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];
1835
+ return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1);
1836
+ };
1837
+
1838
+ DonutSegment.prototype.render = function() {
1839
+ var _this = this;
1840
+ this.arc = this.drawDonutArc(this.hilight, this.color);
1841
+ return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {
1842
+ return _this.fire('hover', _this.index);
1843
+ }, function() {
1844
+ return _this.fire('click', _this.index);
1845
+ });
1846
+ };
1847
+
1848
+ DonutSegment.prototype.drawDonutArc = function(path, color) {
1849
+ return this.raphael.path(path).attr({
1850
+ stroke: color,
1851
+ 'stroke-width': 2,
1852
+ opacity: 0
1853
+ });
1854
+ };
1855
+
1856
+ DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {
1857
+ return this.raphael.path(path).attr({
1858
+ fill: fillColor,
1859
+ stroke: strokeColor,
1860
+ 'stroke-width': 3
1861
+ }).hover(hoverFunction).click(clickFunction);
1862
+ };
1863
+
1864
+ DonutSegment.prototype.select = function() {
1865
+ if (!this.selected) {
1866
+ this.seg.animate({
1867
+ path: this.selectedPath
1868
+ }, 150, '<>');
1869
+ this.arc.animate({
1870
+ opacity: 1
1871
+ }, 150, '<>');
1872
+ return this.selected = true;
1873
+ }
1874
+ };
1875
+
1876
+ DonutSegment.prototype.deselect = function() {
1877
+ if (this.selected) {
1878
+ this.seg.animate({
1879
+ path: this.path
1880
+ }, 150, '<>');
1881
+ this.arc.animate({
1882
+ opacity: 0
1883
+ }, 150, '<>');
1884
+ return this.selected = false;
1885
+ }
1886
+ };
1887
+
1888
+ return DonutSegment;
1889
+
1890
+ })(Morris.EventEmitter);
1891
+
1892
+ }).call(this);
assets/admin/scripts/raphael.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ // ┌────────────────────────────────────────────────────────────────────┐ \\
2
+ // │ Raphaël 2.1.2 - JavaScript Vector Library │ \\
3
+ // ├────────────────────────────────────────────────────────────────────┤ \\
4
+ // │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
5
+ // │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\
6
+ // ├────────────────────────────────────────────────────────────────────┤ \\
7
+ // │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
8
+ // └────────────────────────────────────────────────────────────────────┘ \\
9
+ !function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g="*",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return void(k._events=j={n:{}});var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(window||this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)<i)){var k,l=1,m=l/2,n=l-m,o=.01;for(k=j(a,b,c,d,e,f,g,h,n);Q(k-i)>o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)<P(e,g)||P(a,c)>O(e,g)||O(b,d)<P(f,h)||P(b,d)>O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)<b)return e;if(h=(3*l*e+2*k)*e+j,Q(h)<1e-6)break;e-=f/h}if(c=0,d=1,e=a,c>e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;b<ic.length;b++)ic[b].el.paper==a&&ic.splice(b--,1)}c.version="2.1.2",c.eve=b;var u,v,w=/[, ]+/,x={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},y=/\{(\d+)\}/g,z="hasOwnProperty",A={doc:document,win:a},B={was:Object.prototype[z].call(A.win,"Raphael"),is:A.win.Raphael},C=function(){this.ca=this.customAttributes={}},D="apply",E="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,G="",H=" ",I=String,J="split",K="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[J](H),L={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},M=I.prototype.toLowerCase,N=Math,O=N.max,P=N.min,Q=N.abs,R=N.pow,S=N.PI,T="number",U="string",V="array",W=Object.prototype.toString,X=(c._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),Y={NaN:1,Infinity:1,"-Infinity":1},Z=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,$=N.round,_=parseFloat,ab=parseInt,bb=I.prototype.toUpperCase,cb=c._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},db=c._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},eb=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,fb={hs:1,rg:1},gb=/,?([achlmqrstvxz]),?/gi,hb=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,ib=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,jb=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,kb=(c._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),lb=function(a,b){return _(a)-_(b)},mb=function(){},nb=function(a){return a},ob=c._rectPath=function(a,b,c,d,e){return e?[["M",a+e,b],["l",c-2*e,0],["a",e,e,0,0,1,e,e],["l",0,d-2*e],["a",e,e,0,0,1,-e,e],["l",2*e-c,0],["a",e,e,0,0,1,-e,-e],["l",0,2*e-d],["a",e,e,0,0,1,e,-e],["z"]]:[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},pb=function(a,b,c,d){return null==d&&(d=c),[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},qb=c._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)},set:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)}},rb=c.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=Kb(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='<v:shape adj="1"/>',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b};c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*N.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")};c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a};c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){{var e=[];M.call(c)}d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&n(a,[["M",b,d],["H",e.x2+10]],1)%2==1},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),l=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=O(d.length,e&&e.length||0))},k=0,l=O(d.length,e&&e.length||0);l>k;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var m=d[k],n=e&&e[k],o=m.length,p=e&&n.length;f.x=m[o-2],f.y=m[o-1],f.bx=_(m[o-4])||f.x,f.by=_(m[o-3])||f.y,g.bx=e&&(_(n[p-4])||g.x),g.by=e&&(_(n[p-3])||g.y),g.x=e&&n[p-2],g.y=e&&n[p-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[];for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])
10
+ }return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],e,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin(2*(a-.075)*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;d<ic.length;d++){var e=ic[d];if(!e.el.removed&&!e.paused){var f,g,h=a-e.start,i=e.ms,j=e.easing,k=e.from,l=e.diff,m=e.to,n=(e.t,e.el),o={},p={};if(e.initstatus?(h=(e.initstatus*e.anim.top-e.prev)/(e.percent-e.prev)*i,e.status=e.initstatus,delete e.initstatus,e.stop&&ic.splice(d--,1)):e.status=(e.prev+(e.percent-e.prev)*(h/i))/e.anim.top,!(0>h))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);return f?(d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b)):new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.pause."+this.id,this,ic[c].anim)!==!1&&(ic[c].paused=!0);return this},$b.resume=function(a){for(var c=0;c<ic.length;c++)if(ic[c].el.id==this.id&&(!a||ic[c].anim==a)){var d=ic[c];b("raphael.anim.resume."+this.id,this,d.anim)!==!1&&(delete d.paused,this.status(d.anim,d.status))}return this},$b.stop=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.stop."+this.id,this,ic[c].anim)!==!1&&ic.splice(c--,1);return this},b.on("raphael.remove",t),b.on("raphael.clear",t),$b.toString=function(){return"Raphaël’s object"};var mc=function(a){if(this.items=[],this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;c<arguments.length;c++)f.push(arguments[c]);for(c=0;b>c;c++)e.push(this[a+c]);for(;c<this.length-a;c++)d.push(this[a+c]);var g=f.length;for(c=0;c<g+d.length;c++)this.items[a+c]=this[a+c]=g>c?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b.on("raphael.DOMload",function(){u=!0}),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=b(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=c.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=c._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=b(p).match(c._ISURL);if(F){B=q("pattern");var G=q("image");B.id=c.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(a){c._preload(F[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(G,{width:b,height:c}),d.paper.safari()})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=c.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[a]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=c.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[a]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break;case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;
11
+ if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},A=c.el;z.prototype=A,A.constructor=z,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},A.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},A.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},A.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},A.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},A.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},A.remove=function(){if(!this.removed&&this.node.parentNode){var a=this.paper;a.__set__&&a.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&a.defs.removeChild(this.gradient),c._tear(this,a),"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var b in this)this[b]="function"==typeof this[b]?c._removedFactory(b):null;this.removed=!0}},A._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}return a&&this.hide(),b},A.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},A.toFront=function(){if(this.removed)return this;"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var a=this.paper;return a.top!=this&&c._tofront(this,a),this},A.toBack=function(){if(this.removed)return this;var a=this.node.parentNode;"a"==a.tagName.toLowerCase()?a.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):a.firstChild!=this.node&&a.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper);this.paper;return this},A.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;return b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this},A.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;return b.parentNode.insertBefore(this.node,b),c._insertbefore(this,a,this.paper),this},A.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,font:c._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=g(c/this.width,d/this.height),j=this.top,l=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(i=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=i,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:l});i&&j;)h="stroke-width"in j.attrs?j.attrs["stroke-width"]:1,j.attr({"stroke-width":h}),j._.dirty=1,j._.dirtyT=1,j=j.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var B=c.st;for(var C in A)A[a](C)&&!B[a](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return d&&(this._.transform=d),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var h,i,j=this.width,k=this.height,l=1/g(d/j,e/k);return f&&(h=k/e,i=j/d,j>d*h&&(a-=(j-d*h)/2/h),k>e*i&&(b-=(k-e*i)/2/i)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:l},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,c});
assets/admin/styles/bootstrap.css ADDED
@@ -0,0 +1,6174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ /*!
8
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=f9376f2970c50a5ddc7b)
9
+ * Config saved to config.json and https://gist.github.com/f9376f2970c50a5ddc7b
10
+ */
11
+ /*! normalize.css v3.0.1 | MIT License | git.io/normalize */
12
+ html {
13
+ font-family: sans-serif;
14
+ -ms-text-size-adjust: 100%;
15
+ -webkit-text-size-adjust: 100%;
16
+ }
17
+ body {
18
+ margin: 0;
19
+ }
20
+ article,
21
+ aside,
22
+ details,
23
+ figcaption,
24
+ figure,
25
+ footer,
26
+ header,
27
+ hgroup,
28
+ main,
29
+ nav,
30
+ section,
31
+ summary {
32
+ display: block;
33
+ }
34
+ audio,
35
+ canvas,
36
+ progress,
37
+ video {
38
+ display: inline-block;
39
+ vertical-align: baseline;
40
+ }
41
+ audio:not([controls]) {
42
+ display: none;
43
+ height: 0;
44
+ }
45
+ [hidden],
46
+ template {
47
+ display: none;
48
+ }
49
+ a {
50
+ background: transparent;
51
+ }
52
+ a:active,
53
+ a:hover {
54
+ outline: 0;
55
+ }
56
+ abbr[title] {
57
+ border-bottom: 1px dotted;
58
+ }
59
+ b,
60
+ strong {
61
+ font-weight: bold;
62
+ }
63
+ dfn {
64
+ font-style: italic;
65
+ }
66
+ h1 {
67
+ font-size: 2em;
68
+ margin: 0.67em 0;
69
+ }
70
+ mark {
71
+ background: #ff0;
72
+ color: #000;
73
+ }
74
+ small {
75
+ font-size: 80%;
76
+ }
77
+ sub,
78
+ sup {
79
+ font-size: 75%;
80
+ line-height: 0;
81
+ position: relative;
82
+ vertical-align: baseline;
83
+ }
84
+ sup {
85
+ top: -0.5em;
86
+ }
87
+ sub {
88
+ bottom: -0.25em;
89
+ }
90
+ img {
91
+ border: 0;
92
+ }
93
+ svg:not(:root) {
94
+ overflow: hidden;
95
+ }
96
+ figure {
97
+ margin: 1em 40px;
98
+ }
99
+ hr {
100
+ -moz-box-sizing: content-box;
101
+ box-sizing: content-box;
102
+ height: 0;
103
+ }
104
+ pre {
105
+ overflow: auto;
106
+ }
107
+ code,
108
+ kbd,
109
+ pre,
110
+ samp {
111
+ font-family: monospace, monospace;
112
+ font-size: 1em;
113
+ }
114
+ button,
115
+ input,
116
+ optgroup,
117
+ select,
118
+ textarea {
119
+ color: inherit;
120
+ font: inherit;
121
+ margin: 0;
122
+ }
123
+ button {
124
+ overflow: visible;
125
+ }
126
+ button,
127
+ select {
128
+ text-transform: none;
129
+ }
130
+ button,
131
+ html input[type="button"],
132
+ input[type="reset"],
133
+ input[type="submit"] {
134
+ -webkit-appearance: button;
135
+ cursor: pointer;
136
+ }
137
+ button[disabled],
138
+ html input[disabled] {
139
+ cursor: default;
140
+ }
141
+ button::-moz-focus-inner,
142
+ input::-moz-focus-inner {
143
+ border: 0;
144
+ padding: 0;
145
+ }
146
+ input {
147
+ line-height: normal;
148
+ }
149
+ input[type="checkbox"],
150
+ input[type="radio"] {
151
+ box-sizing: border-box;
152
+ padding: 0;
153
+ }
154
+ input[type="number"]::-webkit-inner-spin-button,
155
+ input[type="number"]::-webkit-outer-spin-button {
156
+ height: auto;
157
+ }
158
+ input[type="search"] {
159
+ -webkit-appearance: textfield;
160
+ -moz-box-sizing: content-box;
161
+ -webkit-box-sizing: content-box;
162
+ box-sizing: content-box;
163
+ }
164
+ input[type="search"]::-webkit-search-cancel-button,
165
+ input[type="search"]::-webkit-search-decoration {
166
+ -webkit-appearance: none;
167
+ }
168
+ fieldset {
169
+ border: 1px solid #c0c0c0;
170
+ margin: 0 2px;
171
+ padding: 0.35em 0.625em 0.75em;
172
+ }
173
+ legend {
174
+ border: 0;
175
+ padding: 0;
176
+ }
177
+ textarea {
178
+ overflow: auto;
179
+ }
180
+ optgroup {
181
+ font-weight: bold;
182
+ }
183
+ table {
184
+ border-collapse: collapse;
185
+ border-spacing: 0;
186
+ }
187
+ td,
188
+ th {
189
+ padding: 0;
190
+ }
191
+ @media print {
192
+ * {
193
+ text-shadow: none !important;
194
+ color: #000 !important;
195
+ background: transparent !important;
196
+ box-shadow: none !important;
197
+ }
198
+ a,
199
+ a:visited {
200
+ text-decoration: underline;
201
+ }
202
+ a[href]:after {
203
+ content: " (" attr(href) ")";
204
+ }
205
+ abbr[title]:after {
206
+ content: " (" attr(title) ")";
207
+ }
208
+ a[href^="javascript:"]:after,
209
+ a[href^="#"]:after {
210
+ content: "";
211
+ }
212
+ pre,
213
+ blockquote {
214
+ border: 1px solid #999;
215
+ page-break-inside: avoid;
216
+ }
217
+ thead {
218
+ display: table-header-group;
219
+ }
220
+ tr,
221
+ img {
222
+ page-break-inside: avoid;
223
+ }
224
+ img {
225
+ max-width: 100% !important;
226
+ }
227
+ p,
228
+ h2,
229
+ h3 {
230
+ orphans: 3;
231
+ widows: 3;
232
+ }
233
+ h2,
234
+ h3 {
235
+ page-break-after: avoid;
236
+ }
237
+ select {
238
+ background: #fff !important;
239
+ }
240
+ .navbar {
241
+ display: none;
242
+ }
243
+ .table td,
244
+ .table th {
245
+ background-color: #fff !important;
246
+ }
247
+ .btn > .caret,
248
+ .dropup > .btn > .caret {
249
+ border-top-color: #000 !important;
250
+ }
251
+ .label {
252
+ border: 1px solid #000;
253
+ }
254
+ .table {
255
+ border-collapse: collapse !important;
256
+ }
257
+ .table-bordered th,
258
+ .table-bordered td {
259
+ border: 1px solid #ddd !important;
260
+ }
261
+ }
262
+ @font-face {
263
+ font-family: 'Glyphicons Halflings';
264
+ src: url('fonts/glyphicons-halflings-regular.eot');
265
+ src: url('fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('fonts/glyphicons-halflings-regular.woff') format('woff'), url('fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
266
+ }
267
+ .glyphicon {
268
+ position: relative;
269
+ top: 1px;
270
+ display: inline-block;
271
+ font-family: 'Glyphicons Halflings';
272
+ font-style: normal;
273
+ font-weight: normal;
274
+ line-height: 1;
275
+ -webkit-font-smoothing: antialiased;
276
+ -moz-osx-font-smoothing: grayscale;
277
+ }
278
+ .glyphicon-asterisk:before {
279
+ content: "\2a";
280
+ }
281
+ .glyphicon-plus:before {
282
+ content: "\2b";
283
+ }
284
+ .glyphicon-euro:before {
285
+ content: "\20ac";
286
+ }
287
+ .glyphicon-minus:before {
288
+ content: "\2212";
289
+ }
290
+ .glyphicon-cloud:before {
291
+ content: "\2601";
292
+ }
293
+ .glyphicon-envelope:before {
294
+ content: "\2709";
295
+ }
296
+ .glyphicon-pencil:before {
297
+ content: "\270f";
298
+ }
299
+ .glyphicon-glass:before {
300
+ content: "\e001";
301
+ }
302
+ .glyphicon-music:before {
303
+ content: "\e002";
304
+ }
305
+ .glyphicon-search:before {
306
+ content: "\e003";
307
+ }
308
+ .glyphicon-heart:before {
309
+ content: "\e005";
310
+ }
311
+ .glyphicon-star:before {
312
+ content: "\e006";
313
+ }
314
+ .glyphicon-star-empty:before {
315
+ content: "\e007";
316
+ }
317
+ .glyphicon-user:before {
318
+ content: "\e008";
319
+ }
320
+ .glyphicon-film:before {
321
+ content: "\e009";
322
+ }
323
+ .glyphicon-th-large:before {
324
+ content: "\e010";
325
+ }
326
+ .glyphicon-th:before {
327
+ content: "\e011";
328
+ }
329
+ .glyphicon-th-list:before {
330
+ content: "\e012";
331
+ }
332
+ .glyphicon-ok:before {
333
+ content: "\e013";
334
+ }
335
+ .glyphicon-remove:before {
336
+ content: "\e014";
337
+ }
338
+ .glyphicon-zoom-in:before {
339
+ content: "\e015";
340
+ }
341
+ .glyphicon-zoom-out:before {
342
+ content: "\e016";
343
+ }
344
+ .glyphicon-off:before {
345
+ content: "\e017";
346
+ }
347
+ .glyphicon-signal:before {
348
+ content: "\e018";
349
+ }
350
+ .glyphicon-cog:before {
351
+ content: "\e019";
352
+ }
353
+ .glyphicon-trash:before {
354
+ content: "\e020";
355
+ }
356
+ .glyphicon-home:before {
357
+ content: "\e021";
358
+ }
359
+ .glyphicon-file:before {
360
+ content: "\e022";
361
+ }
362
+ .glyphicon-time:before {
363
+ content: "\e023";
364
+ }
365
+ .glyphicon-road:before {
366
+ content: "\e024";
367
+ }
368
+ .glyphicon-download-alt:before {
369
+ content: "\e025";
370
+ }
371
+ .glyphicon-download:before {
372
+ content: "\e026";
373
+ }
374
+ .glyphicon-upload:before {
375
+ content: "\e027";
376
+ }
377
+ .glyphicon-inbox:before {
378
+ content: "\e028";
379
+ }
380
+ .glyphicon-play-circle:before {
381
+ content: "\e029";
382
+ }
383
+ .glyphicon-repeat:before {
384
+ content: "\e030";
385
+ }
386
+ .glyphicon-refresh:before {
387
+ content: "\e031";
388
+ }
389
+ .glyphicon-list-alt:before {
390
+ content: "\e032";
391
+ }
392
+ .glyphicon-lock:before {
393
+ content: "\e033";
394
+ }
395
+ .glyphicon-flag:before {
396
+ content: "\e034";
397
+ }
398
+ .glyphicon-headphones:before {
399
+ content: "\e035";
400
+ }
401
+ .glyphicon-volume-off:before {
402
+ content: "\e036";
403
+ }
404
+ .glyphicon-volume-down:before {
405
+ content: "\e037";
406
+ }
407
+ .glyphicon-volume-up:before {
408
+ content: "\e038";
409
+ }
410
+ .glyphicon-qrcode:before {
411
+ content: "\e039";
412
+ }
413
+ .glyphicon-barcode:before {
414
+ content: "\e040";
415
+ }
416
+ .glyphicon-tag:before {
417
+ content: "\e041";
418
+ }
419
+ .glyphicon-tags:before {
420
+ content: "\e042";
421
+ }
422
+ .glyphicon-book:before {
423
+ content: "\e043";
424
+ }
425
+ .glyphicon-bookmark:before {
426
+ content: "\e044";
427
+ }
428
+ .glyphicon-print:before {
429
+ content: "\e045";
430
+ }
431
+ .glyphicon-camera:before {
432
+ content: "\e046";
433
+ }
434
+ .glyphicon-font:before {
435
+ content: "\e047";
436
+ }
437
+ .glyphicon-bold:before {
438
+ content: "\e048";
439
+ }
440
+ .glyphicon-italic:before {
441
+ content: "\e049";
442
+ }
443
+ .glyphicon-text-height:before {
444
+ content: "\e050";
445
+ }
446
+ .glyphicon-text-width:before {
447
+ content: "\e051";
448
+ }
449
+ .glyphicon-align-left:before {
450
+ content: "\e052";
451
+ }
452
+ .glyphicon-align-center:before {
453
+ content: "\e053";
454
+ }
455
+ .glyphicon-align-right:before {
456
+ content: "\e054";
457
+ }
458
+ .glyphicon-align-justify:before {
459
+ content: "\e055";
460
+ }
461
+ .glyphicon-list:before {
462
+ content: "\e056";
463
+ }
464
+ .glyphicon-indent-left:before {
465
+ content: "\e057";
466
+ }
467
+ .glyphicon-indent-right:before {
468
+ content: "\e058";
469
+ }
470
+ .glyphicon-facetime-video:before {
471
+ content: "\e059";
472
+ }
473
+ .glyphicon-picture:before {
474
+ content: "\e060";
475
+ }
476
+ .glyphicon-map-marker:before {
477
+ content: "\e062";
478
+ }
479
+ .glyphicon-adjust:before {
480
+ content: "\e063";
481
+ }
482
+ .glyphicon-tint:before {
483
+ content: "\e064";
484
+ }
485
+ .glyphicon-edit:before {
486
+ content: "\e065";
487
+ }
488
+ .glyphicon-share:before {
489
+ content: "\e066";
490
+ }
491
+ .glyphicon-check:before {
492
+ content: "\e067";
493
+ }
494
+ .glyphicon-move:before {
495
+ content: "\e068";
496
+ }
497
+ .glyphicon-step-backward:before {
498
+ content: "\e069";
499
+ }
500
+ .glyphicon-fast-backward:before {
501
+ content: "\e070";
502
+ }
503
+ .glyphicon-backward:before {
504
+ content: "\e071";
505
+ }
506
+ .glyphicon-play:before {
507
+ content: "\e072";
508
+ }
509
+ .glyphicon-pause:before {
510
+ content: "\e073";
511
+ }
512
+ .glyphicon-stop:before {
513
+ content: "\e074";
514
+ }
515
+ .glyphicon-forward:before {
516
+ content: "\e075";
517
+ }
518
+ .glyphicon-fast-forward:before {
519
+ content: "\e076";
520
+ }
521
+ .glyphicon-step-forward:before {
522
+ content: "\e077";
523
+ }
524
+ .glyphicon-eject:before {
525
+ content: "\e078";
526
+ }
527
+ .glyphicon-chevron-left:before {
528
+ content: "\e079";
529
+ }
530
+ .glyphicon-chevron-right:before {
531
+ content: "\e080";
532
+ }
533
+ .glyphicon-plus-sign:before {
534
+ content: "\e081";
535
+ }
536
+ .glyphicon-minus-sign:before {
537
+ content: "\e082";
538
+ }
539
+ .glyphicon-remove-sign:before {
540
+ content: "\e083";
541
+ }
542
+ .glyphicon-ok-sign:before {
543
+ content: "\e084";
544
+ }
545
+ .glyphicon-question-sign:before {
546
+ content: "\e085";
547
+ }
548
+ .glyphicon-info-sign:before {
549
+ content: "\e086";
550
+ }
551
+ .glyphicon-screenshot:before {
552
+ content: "\e087";
553
+ }
554
+ .glyphicon-remove-circle:before {
555
+ content: "\e088";
556
+ }
557
+ .glyphicon-ok-circle:before {
558
+ content: "\e089";
559
+ }
560
+ .glyphicon-ban-circle:before {
561
+ content: "\e090";
562
+ }
563
+ .glyphicon-arrow-left:before {
564
+ content: "\e091";
565
+ }
566
+ .glyphicon-arrow-right:before {
567
+ content: "\e092";
568
+ }
569
+ .glyphicon-arrow-up:before {
570
+ content: "\e093";
571
+ }
572
+ .glyphicon-arrow-down:before {
573
+ content: "\e094";
574
+ }
575
+ .glyphicon-share-alt:before {
576
+ content: "\e095";
577
+ }
578
+ .glyphicon-resize-full:before {
579
+ content: "\e096";
580
+ }
581
+ .glyphicon-resize-small:before {
582
+ content: "\e097";
583
+ }
584
+ .glyphicon-exclamation-sign:before {
585
+ content: "\e101";
586
+ }
587
+ .glyphicon-gift:before {
588
+ content: "\e102";
589
+ }
590
+ .glyphicon-leaf:before {
591
+ content: "\e103";
592
+ }
593
+ .glyphicon-fire:before {
594
+ content: "\e104";
595
+ }
596
+ .glyphicon-eye-open:before {
597
+ content: "\e105";
598
+ }
599
+ .glyphicon-eye-close:before {
600
+ content: "\e106";
601
+ }
602
+ .glyphicon-warning-sign:before {
603
+ content: "\e107";
604
+ }
605
+ .glyphicon-plane:before {
606
+ content: "\e108";
607
+ }
608
+ .glyphicon-calendar:before {
609
+ content: "\e109";
610
+ }
611
+ .glyphicon-random:before {
612
+ content: "\e110";
613
+ }
614
+ .glyphicon-comment:before {
615
+ content: "\e111";
616
+ }
617
+ .glyphicon-magnet:before {
618
+ content: "\e112";
619
+ }
620
+ .glyphicon-chevron-up:before {
621
+ content: "\e113";
622
+ }
623
+ .glyphicon-chevron-down:before {
624
+ content: "\e114";
625
+ }
626
+ .glyphicon-retweet:before {
627
+ content: "\e115";
628
+ }
629
+ .glyphicon-shopping-cart:before {
630
+ content: "\e116";
631
+ }
632
+ .glyphicon-folder-close:before {
633
+ content: "\e117";
634
+ }
635
+ .glyphicon-folder-open:before {
636
+ content: "\e118";
637
+ }
638
+ .glyphicon-resize-vertical:before {
639
+ content: "\e119";
640
+ }
641
+ .glyphicon-resize-horizontal:before {
642
+ content: "\e120";
643
+ }
644
+ .glyphicon-hdd:before {
645
+ content: "\e121";
646
+ }
647
+ .glyphicon-bullhorn:before {
648
+ content: "\e122";
649
+ }
650
+ .glyphicon-bell:before {
651
+ content: "\e123";
652
+ }
653
+ .glyphicon-certificate:before {
654
+ content: "\e124";
655
+ }
656
+ .glyphicon-thumbs-up:before {
657
+ content: "\e125";
658
+ }
659
+ .glyphicon-thumbs-down:before {
660
+ content: "\e126";
661
+ }
662
+ .glyphicon-hand-right:before {
663
+ content: "\e127";
664
+ }
665
+ .glyphicon-hand-left:before {
666
+ content: "\e128";
667
+ }
668
+ .glyphicon-hand-up:before {
669
+ content: "\e129";
670
+ }
671
+ .glyphicon-hand-down:before {
672
+ content: "\e130";
673
+ }
674
+ .glyphicon-circle-arrow-right:before {
675
+ content: "\e131";
676
+ }
677
+ .glyphicon-circle-arrow-left:before {
678
+ content: "\e132";
679
+ }
680
+ .glyphicon-circle-arrow-up:before {
681
+ content: "\e133";
682
+ }
683
+ .glyphicon-circle-arrow-down:before {
684
+ content: "\e134";
685
+ }
686
+ .glyphicon-globe:before {
687
+ content: "\e135";
688
+ }
689
+ .glyphicon-wrench:before {
690
+ content: "\e136";
691
+ }
692
+ .glyphicon-tasks:before {
693
+ content: "\e137";
694
+ }
695
+ .glyphicon-filter:before {
696
+ content: "\e138";
697
+ }
698
+ .glyphicon-briefcase:before {
699
+ content: "\e139";
700
+ }
701
+ .glyphicon-fullscreen:before {
702
+ content: "\e140";
703
+ }
704
+ .glyphicon-dashboard:before {
705
+ content: "\e141";
706
+ }
707
+ .glyphicon-paperclip:before {
708
+ content: "\e142";
709
+ }
710
+ .glyphicon-heart-empty:before {
711
+ content: "\e143";
712
+ }
713
+ .glyphicon-link:before {
714
+ content: "\e144";
715
+ }
716
+ .glyphicon-phone:before {
717
+ content: "\e145";
718
+ }
719
+ .glyphicon-pushpin:before {
720
+ content: "\e146";
721
+ }
722
+ .glyphicon-usd:before {
723
+ content: "\e148";
724
+ }
725
+ .glyphicon-gbp:before {
726
+ content: "\e149";
727
+ }
728
+ .glyphicon-sort:before {
729
+ content: "\e150";
730
+ }
731
+ .glyphicon-sort-by-alphabet:before {
732
+ content: "\e151";
733
+ }
734
+ .glyphicon-sort-by-alphabet-alt:before {
735
+ content: "\e152";
736
+ }
737
+ .glyphicon-sort-by-order:before {
738
+ content: "\e153";
739
+ }
740
+ .glyphicon-sort-by-order-alt:before {
741
+ content: "\e154";
742
+ }
743
+ .glyphicon-sort-by-attributes:before {
744
+ content: "\e155";
745
+ }
746
+ .glyphicon-sort-by-attributes-alt:before {
747
+ content: "\e156";
748
+ }
749
+ .glyphicon-unchecked:before {
750
+ content: "\e157";
751
+ }
752
+ .glyphicon-expand:before {
753
+ content: "\e158";
754
+ }
755
+ .glyphicon-collapse-down:before {
756
+ content: "\e159";
757
+ }
758
+ .glyphicon-collapse-up:before {
759
+ content: "\e160";
760
+ }
761
+ .glyphicon-log-in:before {
762
+ content: "\e161";
763
+ }
764
+ .glyphicon-flash:before {
765
+ content: "\e162";
766
+ }
767
+ .glyphicon-log-out:before {
768
+ content: "\e163";
769
+ }
770
+ .glyphicon-new-window:before {
771
+ content: "\e164";
772
+ }
773
+ .glyphicon-record:before {
774
+ content: "\e165";
775
+ }
776
+ .glyphicon-save:before {
777
+ content: "\e166";
778
+ }
779
+ .glyphicon-open:before {
780
+ content: "\e167";
781
+ }
782
+ .glyphicon-saved:before {
783
+ content: "\e168";
784
+ }
785
+ .glyphicon-import:before {
786
+ content: "\e169";
787
+ }
788
+ .glyphicon-export:before {
789
+ content: "\e170";
790
+ }
791
+ .glyphicon-send:before {
792
+ content: "\e171";
793
+ }
794
+ .glyphicon-floppy-disk:before {
795
+ content: "\e172";
796
+ }
797
+ .glyphicon-floppy-saved:before {
798
+ content: "\e173";
799
+ }
800
+ .glyphicon-floppy-remove:before {
801
+ content: "\e174";
802
+ }
803
+ .glyphicon-floppy-save:before {
804
+ content: "\e175";
805
+ }
806
+ .glyphicon-floppy-open:before {
807
+ content: "\e176";
808
+ }
809
+ .glyphicon-credit-card:before {
810
+ content: "\e177";
811
+ }
812
+ .glyphicon-transfer:before {
813
+ content: "\e178";
814
+ }
815
+ .glyphicon-cutlery:before {
816
+ content: "\e179";
817
+ }
818
+ .glyphicon-header:before {
819
+ content: "\e180";
820
+ }
821
+ .glyphicon-compressed:before {
822
+ content: "\e181";
823
+ }
824
+ .glyphicon-earphone:before {
825
+ content: "\e182";
826
+ }
827
+ .glyphicon-phone-alt:before {
828
+ content: "\e183";
829
+ }
830
+ .glyphicon-tower:before {
831
+ content: "\e184";
832
+ }
833
+ .glyphicon-stats:before {
834
+ content: "\e185";
835
+ }
836
+ .glyphicon-sd-video:before {
837
+ content: "\e186";
838
+ }
839
+ .glyphicon-hd-video:before {
840
+ content: "\e187";
841
+ }
842
+ .glyphicon-subtitles:before {
843
+ content: "\e188";
844
+ }
845
+ .glyphicon-sound-stereo:before {
846
+ content: "\e189";
847
+ }
848
+ .glyphicon-sound-dolby:before {
849
+ content: "\e190";
850
+ }
851
+ .glyphicon-sound-5-1:before {
852
+ content: "\e191";
853
+ }
854
+ .glyphicon-sound-6-1:before {
855
+ content: "\e192";
856
+ }
857
+ .glyphicon-sound-7-1:before {
858
+ content: "\e193";
859
+ }
860
+ .glyphicon-copyright-mark:before {
861
+ content: "\e194";
862
+ }
863
+ .glyphicon-registration-mark:before {
864
+ content: "\e195";
865
+ }
866
+ .glyphicon-cloud-download:before {
867
+ content: "\e197";
868
+ }
869
+ .glyphicon-cloud-upload:before {
870
+ content: "\e198";
871
+ }
872
+ .glyphicon-tree-conifer:before {
873
+ content: "\e199";
874
+ }
875
+ .glyphicon-tree-deciduous:before {
876
+ content: "\e200";
877
+ }
878
+ * {
879
+ -webkit-box-sizing: border-box;
880
+ -moz-box-sizing: border-box;
881
+ box-sizing: border-box;
882
+ }
883
+ *:before,
884
+ *:after {
885
+ -webkit-box-sizing: border-box;
886
+ -moz-box-sizing: border-box;
887
+ box-sizing: border-box;
888
+ }
889
+ html {
890
+ font-size: 10px;
891
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
892
+ }
893
+ body {
894
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
895
+ font-size: 14px;
896
+ line-height: 1.42857143;
897
+ color: #333333;
898
+ background-color: #ffffff;
899
+ }
900
+ input,
901
+ button,
902
+ select,
903
+ textarea {
904
+ font-family: inherit;
905
+ font-size: inherit;
906
+ line-height: inherit;
907
+ }
908
+ a {
909
+ color: #428bca;
910
+ text-decoration: none;
911
+ }
912
+ a:hover,
913
+ a:focus {
914
+ color: #2a6496;
915
+ text-decoration: underline;
916
+ }
917
+ a:focus {
918
+ outline: 5px auto -webkit-focus-ring-color;
919
+ outline-offset: -2px;
920
+ }
921
+ figure {
922
+ margin: 0;
923
+ }
924
+ img {
925
+ vertical-align: middle;
926
+ }
927
+ .img-responsive,
928
+ .thumbnail > img,
929
+ .thumbnail a > img,
930
+ .carousel-inner > .item > img,
931
+ .carousel-inner > .item > a > img {
932
+ display: block;
933
+ width: 100% \9;
934
+ max-width: 100%;
935
+ height: auto;
936
+ }
937
+ .img-rounded {
938
+ border-radius: 6px;
939
+ }
940
+ .img-thumbnail {
941
+ padding: 4px;
942
+ line-height: 1.42857143;
943
+ background-color: #ffffff;
944
+ border: 1px solid #dddddd;
945
+ border-radius: 4px;
946
+ -webkit-transition: all 0.2s ease-in-out;
947
+ -o-transition: all 0.2s ease-in-out;
948
+ transition: all 0.2s ease-in-out;
949
+ display: inline-block;
950
+ width: 100% \9;
951
+ max-width: 100%;
952
+ height: auto;
953
+ }
954
+ .img-circle {
955
+ border-radius: 50%;
956
+ }
957
+ hr {
958
+ margin-top: 20px;
959
+ margin-bottom: 20px;
960
+ border: 0;
961
+ border-top: 1px solid #eeeeee;
962
+ }
963
+ .sr-only {
964
+ position: absolute;
965
+ width: 1px;
966
+ height: 1px;
967
+ margin: -1px;
968
+ padding: 0;
969
+ overflow: hidden;
970
+ clip: rect(0, 0, 0, 0);
971
+ border: 0;
972
+ }
973
+ .sr-only-focusable:active,
974
+ .sr-only-focusable:focus {
975
+ position: static;
976
+ width: auto;
977
+ height: auto;
978
+ margin: 0;
979
+ overflow: visible;
980
+ clip: auto;
981
+ }
982
+ h1,
983
+ h2,
984
+ h3,
985
+ h4,
986
+ h5,
987
+ h6,
988
+ .h1,
989
+ .h2,
990
+ .h3,
991
+ .h4,
992
+ .h5,
993
+ .h6 {
994
+ font-family: inherit;
995
+ font-weight: 500;
996
+ line-height: 1.1;
997
+ color: inherit;
998
+ }
999
+ h1 small,
1000
+ h2 small,
1001
+ h3 small,
1002
+ h4 small,
1003
+ h5 small,
1004
+ h6 small,
1005
+ .h1 small,
1006
+ .h2 small,
1007
+ .h3 small,
1008
+ .h4 small,
1009
+ .h5 small,
1010
+ .h6 small,
1011
+ h1 .small,
1012
+ h2 .small,
1013
+ h3 .small,
1014
+ h4 .small,
1015
+ h5 .small,
1016
+ h6 .small,
1017
+ .h1 .small,
1018
+ .h2 .small,
1019
+ .h3 .small,
1020
+ .h4 .small,
1021
+ .h5 .small,
1022
+ .h6 .small {
1023
+ font-weight: normal;
1024
+ line-height: 1;
1025
+ color: #777777;
1026
+ }
1027
+ h1,
1028
+ .h1,
1029
+ h2,
1030
+ .h2,
1031
+ h3,
1032
+ .h3 {
1033
+ margin-top: 20px;
1034
+ margin-bottom: 10px;
1035
+ }
1036
+ h1 small,
1037
+ .h1 small,
1038
+ h2 small,
1039
+ .h2 small,
1040
+ h3 small,
1041
+ .h3 small,
1042
+ h1 .small,
1043
+ .h1 .small,
1044
+ h2 .small,
1045
+ .h2 .small,
1046
+ h3 .small,
1047
+ .h3 .small {
1048
+ font-size: 65%;
1049
+ }
1050
+ h4,
1051
+ .h4,
1052
+ h5,
1053
+ .h5,
1054
+ h6,
1055
+ .h6 {
1056
+ margin-top: 10px;
1057
+ margin-bottom: 10px;
1058
+ }
1059
+ h4 small,
1060
+ .h4 small,
1061
+ h5 small,
1062
+ .h5 small,
1063
+ h6 small,
1064
+ .h6 small,
1065
+ h4 .small,
1066
+ .h4 .small,
1067
+ h5 .small,
1068
+ .h5 .small,
1069
+ h6 .small,
1070
+ .h6 .small {
1071
+ font-size: 75%;
1072
+ }
1073
+ h1,
1074
+ .h1 {
1075
+ font-size: 36px;
1076
+ }
1077
+ h2,
1078
+ .h2 {
1079
+ font-size: 30px;
1080
+ }
1081
+ h3,
1082
+ .h3 {
1083
+ font-size: 24px;
1084
+ }
1085
+ h4,
1086
+ .h4 {
1087
+ font-size: 18px;
1088
+ }
1089
+ h5,
1090
+ .h5 {
1091
+ font-size: 14px;
1092
+ }
1093
+ h6,
1094
+ .h6 {
1095
+ font-size: 12px;
1096
+ }
1097
+ p {
1098
+ margin: 0 0 10px;
1099
+ }
1100
+ .lead {
1101
+ margin-bottom: 20px;
1102
+ font-size: 16px;
1103
+ font-weight: 300;
1104
+ line-height: 1.4;
1105
+ }
1106
+ @media (min-width: 768px) {
1107
+ .lead {
1108
+ font-size: 21px;
1109
+ }
1110
+ }
1111
+ small,
1112
+ .small {
1113
+ font-size: 85%;
1114
+ }
1115
+ cite {
1116
+ font-style: normal;
1117
+ }
1118
+ mark,
1119
+ .mark {
1120
+ background-color: #fcf8e3;
1121
+ padding: .2em;
1122
+ }
1123
+ .text-left {
1124
+ text-align: left;
1125
+ }
1126
+ .text-right {
1127
+ text-align: right;
1128
+ }
1129
+ .text-center {
1130
+ text-align: center;
1131
+ }
1132
+ .text-justify {
1133
+ text-align: justify;
1134
+ }
1135
+ .text-nowrap {
1136
+ white-space: nowrap;
1137
+ }
1138
+ .text-lowercase {
1139
+ text-transform: lowercase;
1140
+ }
1141
+ .text-uppercase {
1142
+ text-transform: uppercase;
1143
+ }
1144
+ .text-capitalize {
1145
+ text-transform: capitalize;
1146
+ }
1147
+ .text-muted {
1148
+ color: #777777;
1149
+ }
1150
+ .text-primary {
1151
+ color: #428bca;
1152
+ }
1153
+ a.text-primary:hover {
1154
+ color: #3071a9;
1155
+ }
1156
+ .text-success {
1157
+ color: #3c763d;
1158
+ }
1159
+ a.text-success:hover {
1160
+ color: #2b542c;
1161
+ }
1162
+ .text-info {
1163
+ color: #31708f;
1164
+ }
1165
+ a.text-info:hover {
1166
+ color: #245269;
1167
+ }
1168
+ .text-warning {
1169
+ color: #8a6d3b;
1170
+ }
1171
+ a.text-warning:hover {
1172
+ color: #66512c;
1173
+ }
1174
+ .text-danger {
1175
+ color: #a94442;
1176
+ }
1177
+ a.text-danger:hover {
1178
+ color: #843534;
1179
+ }
1180
+ .bg-primary {
1181
+ color: #fff;
1182
+ background-color: #428bca;
1183
+ }
1184
+ a.bg-primary:hover {
1185
+ background-color: #3071a9;
1186
+ }
1187
+ .bg-success {
1188
+ background-color: #dff0d8;
1189
+ }
1190
+ a.bg-success:hover {
1191
+ background-color: #c1e2b3;
1192
+ }
1193
+ .bg-info {
1194
+ background-color: #d9edf7;
1195
+ }
1196
+ a.bg-info:hover {
1197
+ background-color: #afd9ee;
1198
+ }
1199
+ .bg-warning {
1200
+ background-color: #fcf8e3;
1201
+ }
1202
+ a.bg-warning:hover {
1203
+ background-color: #f7ecb5;
1204
+ }
1205
+ .bg-danger {
1206
+ background-color: #f2dede;
1207
+ }
1208
+ a.bg-danger:hover {
1209
+ background-color: #e4b9b9;
1210
+ }
1211
+ .page-header {
1212
+ padding-bottom: 9px;
1213
+ margin: 40px 0 20px;
1214
+ border-bottom: 1px solid #eeeeee;
1215
+ }
1216
+ ul,
1217
+ ol {
1218
+ margin-top: 0;
1219
+ margin-bottom: 10px;
1220
+ }
1221
+ ul ul,
1222
+ ol ul,
1223
+ ul ol,
1224
+ ol ol {
1225
+ margin-bottom: 0;
1226
+ }
1227
+ .list-unstyled {
1228
+ padding-left: 0;
1229
+ list-style: none;
1230
+ }
1231
+ .list-inline {
1232
+ padding-left: 0;
1233
+ list-style: none;
1234
+ margin-left: -5px;
1235
+ }
1236
+ .list-inline > li {
1237
+ display: inline-block;
1238
+ padding-left: 5px;
1239
+ padding-right: 5px;
1240
+ }
1241
+ dl {
1242
+ margin-top: 0;
1243
+ margin-bottom: 20px;
1244
+ }
1245
+ dt,
1246
+ dd {
1247
+ line-height: 1.42857143;
1248
+ }
1249
+ dt {
1250
+ font-weight: bold;
1251
+ }
1252
+ dd {
1253
+ margin-left: 0;
1254
+ }
1255
+ @media (min-width: 768px) {
1256
+ .dl-horizontal dt {
1257
+ float: left;
1258
+ width: 160px;
1259
+ clear: left;
1260
+ text-align: right;
1261
+ overflow: hidden;
1262
+ text-overflow: ellipsis;
1263
+ white-space: nowrap;
1264
+ }
1265
+ .dl-horizontal dd {
1266
+ margin-left: 180px;
1267
+ }
1268
+ }
1269
+ abbr[title],
1270
+ abbr[data-original-title] {
1271
+ cursor: help;
1272
+ border-bottom: 1px dotted #777777;
1273
+ }
1274
+ .initialism {
1275
+ font-size: 90%;
1276
+ text-transform: uppercase;
1277
+ }
1278
+ blockquote {
1279
+ padding: 10px 20px;
1280
+ margin: 0 0 20px;
1281
+ font-size: 17.5px;
1282
+ border-left: 5px solid #eeeeee;
1283
+ }
1284
+ blockquote p:last-child,
1285
+ blockquote ul:last-child,
1286
+ blockquote ol:last-child {
1287
+ margin-bottom: 0;
1288
+ }
1289
+ blockquote footer,
1290
+ blockquote small,
1291
+ blockquote .small {
1292
+ display: block;
1293
+ font-size: 80%;
1294
+ line-height: 1.42857143;
1295
+ color: #777777;
1296
+ }
1297
+ blockquote footer:before,
1298
+ blockquote small:before,
1299
+ blockquote .small:before {
1300
+ content: '\2014 \00A0';
1301
+ }
1302
+ .blockquote-reverse,
1303
+ blockquote.pull-right {
1304
+ padding-right: 15px;
1305
+ padding-left: 0;
1306
+ border-right: 5px solid #eeeeee;
1307
+ border-left: 0;
1308
+ text-align: right;
1309
+ }
1310
+ .blockquote-reverse footer:before,
1311
+ blockquote.pull-right footer:before,
1312
+ .blockquote-reverse small:before,
1313
+ blockquote.pull-right small:before,
1314
+ .blockquote-reverse .small:before,
1315
+ blockquote.pull-right .small:before {
1316
+ content: '';
1317
+ }
1318
+ .blockquote-reverse footer:after,
1319
+ blockquote.pull-right footer:after,
1320
+ .blockquote-reverse small:after,
1321
+ blockquote.pull-right small:after,
1322
+ .blockquote-reverse .small:after,
1323
+ blockquote.pull-right .small:after {
1324
+ content: '\00A0 \2014';
1325
+ }
1326
+ blockquote:before,
1327
+ blockquote:after {
1328
+ content: "";
1329
+ }
1330
+ address {
1331
+ margin-bottom: 20px;
1332
+ font-style: normal;
1333
+ line-height: 1.42857143;
1334
+ }
1335
+ code,
1336
+ kbd,
1337
+ pre,
1338
+ samp {
1339
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
1340
+ }
1341
+ code {
1342
+ padding: 2px 4px;
1343
+ font-size: 90%;
1344
+ color: #c7254e;
1345
+ background-color: #f9f2f4;
1346
+ border-radius: 4px;
1347
+ }
1348
+ kbd {
1349
+ padding: 2px 4px;
1350
+ font-size: 90%;
1351
+ color: #ffffff;
1352
+ background-color: #333333;
1353
+ border-radius: 3px;
1354
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
1355
+ }
1356
+ kbd kbd {
1357
+ padding: 0;
1358
+ font-size: 100%;
1359
+ box-shadow: none;
1360
+ }
1361
+ pre {
1362
+ display: block;
1363
+ padding: 9.5px;
1364
+ margin: 0 0 10px;
1365
+ font-size: 13px;
1366
+ line-height: 1.42857143;
1367
+ word-break: break-all;
1368
+ word-wrap: break-word;
1369
+ color: #333333;
1370
+ background-color: #f5f5f5;
1371
+ border: 1px solid #cccccc;
1372
+ border-radius: 4px;
1373
+ }
1374
+ pre code {
1375
+ padding: 0;
1376
+ font-size: inherit;
1377
+ color: inherit;
1378
+ white-space: pre-wrap;
1379
+ background-color: transparent;
1380
+ border-radius: 0;
1381
+ }
1382
+ .pre-scrollable {
1383
+ max-height: 340px;
1384
+ overflow-y: scroll;
1385
+ }
1386
+ .container {
1387
+ margin-right: auto;
1388
+ margin-left: auto;
1389
+ padding-left: 15px;
1390
+ padding-right: 15px;
1391
+ }
1392
+ @media (min-width: 768px) {
1393
+ .container {
1394
+ width: 750px;
1395
+ }
1396
+ }
1397
+ @media (min-width: 992px) {
1398
+ .container {
1399
+ width: 970px;
1400
+ }
1401
+ }
1402
+ @media (min-width: 1200px) {
1403
+ .container {
1404
+ width: 1170px;
1405
+ }
1406
+ }
1407
+ .container-fluid {
1408
+ margin-right: auto;
1409
+ margin-left: auto;
1410
+ padding-left: 15px;
1411
+ padding-right: 15px;
1412
+ }
1413
+ .row {
1414
+ margin-left: -15px;
1415
+ margin-right: -15px;
1416
+ }
1417
+ .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
1418
+ position: relative;
1419
+ min-height: 1px;
1420
+ padding-left: 15px;
1421
+ padding-right: 15px;
1422
+ }
1423
+ .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
1424
+ float: left;
1425
+ }
1426
+ .col-xs-12 {
1427
+ width: 100%;
1428
+ }
1429
+ .col-xs-11 {
1430
+ width: 91.66666667%;
1431
+ }
1432
+ .col-xs-10 {
1433
+ width: 83.33333333%;
1434
+ }
1435
+ .col-xs-9 {
1436
+ width: 75%;
1437
+ }
1438
+ .col-xs-8 {
1439
+ width: 66.66666667%;
1440
+ }
1441
+ .col-xs-7 {
1442
+ width: 58.33333333%;
1443
+ }
1444
+ .col-xs-6 {
1445
+ width: 50%;
1446
+ }
1447
+ .col-xs-5 {
1448
+ width: 41.66666667%;
1449
+ }
1450
+ .col-xs-4 {
1451
+ width: 33.33333333%;
1452
+ }
1453
+ .col-xs-3 {
1454
+ width: 25%;
1455
+ }
1456
+ .col-xs-2 {
1457
+ width: 16.66666667%;
1458
+ }
1459
+ .col-xs-1 {
1460
+ width: 8.33333333%;
1461
+ }
1462
+ .col-xs-pull-12 {
1463
+ right: 100%;
1464
+ }
1465
+ .col-xs-pull-11 {
1466
+ right: 91.66666667%;
1467
+ }
1468
+ .col-xs-pull-10 {
1469
+ right: 83.33333333%;
1470
+ }
1471
+ .col-xs-pull-9 {
1472
+ right: 75%;
1473
+ }
1474
+ .col-xs-pull-8 {
1475
+ right: 66.66666667%;
1476
+ }
1477
+ .col-xs-pull-7 {
1478
+ right: 58.33333333%;
1479
+ }
1480
+ .col-xs-pull-6 {
1481
+ right: 50%;
1482
+ }
1483
+ .col-xs-pull-5 {
1484
+ right: 41.66666667%;
1485
+ }
1486
+ .col-xs-pull-4 {
1487
+ right: 33.33333333%;
1488
+ }
1489
+ .col-xs-pull-3 {
1490
+ right: 25%;
1491
+ }
1492
+ .col-xs-pull-2 {
1493
+ right: 16.66666667%;
1494
+ }
1495
+ .col-xs-pull-1 {
1496
+ right: 8.33333333%;
1497
+ }
1498
+ .col-xs-pull-0 {
1499
+ right: auto;
1500
+ }
1501
+ .col-xs-push-12 {
1502
+ left: 100%;
1503
+ }
1504
+ .col-xs-push-11 {
1505
+ left: 91.66666667%;
1506
+ }
1507
+ .col-xs-push-10 {
1508
+ left: 83.33333333%;
1509
+ }
1510
+ .col-xs-push-9 {
1511
+ left: 75%;
1512
+ }
1513
+ .col-xs-push-8 {
1514
+ left: 66.66666667%;
1515
+ }
1516
+ .col-xs-push-7 {
1517
+ left: 58.33333333%;
1518
+ }
1519
+ .col-xs-push-6 {
1520
+ left: 50%;
1521
+ }
1522
+ .col-xs-push-5 {
1523
+ left: 41.66666667%;
1524
+ }
1525
+ .col-xs-push-4 {
1526
+ left: 33.33333333%;
1527
+ }
1528
+ .col-xs-push-3 {
1529
+ left: 25%;
1530
+ }
1531
+ .col-xs-push-2 {
1532
+ left: 16.66666667%;
1533
+ }
1534
+ .col-xs-push-1 {
1535
+ left: 8.33333333%;
1536
+ }
1537
+ .col-xs-push-0 {
1538
+ left: auto;
1539
+ }
1540
+ .col-xs-offset-12 {
1541
+ margin-left: 100%;
1542
+ }
1543
+ .col-xs-offset-11 {
1544
+ margin-left: 91.66666667%;
1545
+ }
1546
+ .col-xs-offset-10 {
1547
+ margin-left: 83.33333333%;
1548
+ }
1549
+ .col-xs-offset-9 {
1550
+ margin-left: 75%;
1551
+ }
1552
+ .col-xs-offset-8 {
1553
+ margin-left: 66.66666667%;
1554
+ }
1555
+ .col-xs-offset-7 {
1556
+ margin-left: 58.33333333%;
1557
+ }
1558
+ .col-xs-offset-6 {
1559
+ margin-left: 50%;
1560
+ }
1561
+ .col-xs-offset-5 {
1562
+ margin-left: 41.66666667%;
1563
+ }
1564
+ .col-xs-offset-4 {
1565
+ margin-left: 33.33333333%;
1566
+ }
1567
+ .col-xs-offset-3 {
1568
+ margin-left: 25%;
1569
+ }
1570
+ .col-xs-offset-2 {
1571
+ margin-left: 16.66666667%;
1572
+ }
1573
+ .col-xs-offset-1 {
1574
+ margin-left: 8.33333333%;
1575
+ }
1576
+ .col-xs-offset-0 {
1577
+ margin-left: 0%;
1578
+ }
1579
+ @media (min-width: 768px) {
1580
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
1581
+ float: left;
1582
+ }
1583
+ .col-sm-12 {
1584
+ width: 100%;
1585
+ }
1586
+ .col-sm-11 {
1587
+ width: 91.66666667%;
1588
+ }
1589
+ .col-sm-10 {
1590
+ width: 83.33333333%;
1591
+ }
1592
+ .col-sm-9 {
1593
+ width: 75%;
1594
+ }
1595
+ .col-sm-8 {
1596
+ width: 66.66666667%;
1597
+ }
1598
+ .col-sm-7 {
1599
+ width: 58.33333333%;
1600
+ }
1601
+ .col-sm-6 {
1602
+ width: 50%;
1603
+ }
1604
+ .col-sm-5 {
1605
+ width: 41.66666667%;
1606
+ }
1607
+ .col-sm-4 {
1608
+ width: 33.33333333%;
1609
+ }
1610
+ .col-sm-3 {
1611
+ width: 25%;
1612
+ }
1613
+ .col-sm-2 {
1614
+ width: 16.66666667%;
1615
+ }
1616
+ .col-sm-1 {
1617
+ width: 8.33333333%;
1618
+ }
1619
+ .col-sm-pull-12 {
1620
+ right: 100%;
1621
+ }
1622
+ .col-sm-pull-11 {
1623
+ right: 91.66666667%;
1624
+ }
1625
+ .col-sm-pull-10 {
1626
+ right: 83.33333333%;
1627
+ }
1628
+ .col-sm-pull-9 {
1629
+ right: 75%;
1630
+ }
1631
+ .col-sm-pull-8 {
1632
+ right: 66.66666667%;
1633
+ }
1634
+ .col-sm-pull-7 {
1635
+ right: 58.33333333%;
1636
+ }
1637
+ .col-sm-pull-6 {
1638
+ right: 50%;
1639
+ }
1640
+ .col-sm-pull-5 {
1641
+ right: 41.66666667%;
1642
+ }
1643
+ .col-sm-pull-4 {
1644
+ right: 33.33333333%;
1645
+ }
1646
+ .col-sm-pull-3 {
1647
+ right: 25%;
1648
+ }
1649
+ .col-sm-pull-2 {
1650
+ right: 16.66666667%;
1651
+ }
1652
+ .col-sm-pull-1 {
1653
+ right: 8.33333333%;
1654
+ }
1655
+ .col-sm-pull-0 {
1656
+ right: auto;
1657
+ }
1658
+ .col-sm-push-12 {
1659
+ left: 100%;
1660
+ }
1661
+ .col-sm-push-11 {
1662
+ left: 91.66666667%;
1663
+ }
1664
+ .col-sm-push-10 {
1665
+ left: 83.33333333%;
1666
+ }
1667
+ .col-sm-push-9 {
1668
+ left: 75%;
1669
+ }
1670
+ .col-sm-push-8 {
1671
+ left: 66.66666667%;
1672
+ }
1673
+ .col-sm-push-7 {
1674
+ left: 58.33333333%;
1675
+ }
1676
+ .col-sm-push-6 {
1677
+ left: 50%;
1678
+ }
1679
+ .col-sm-push-5 {
1680
+ left: 41.66666667%;
1681
+ }
1682
+ .col-sm-push-4 {
1683
+ left: 33.33333333%;
1684
+ }
1685
+ .col-sm-push-3 {
1686
+ left: 25%;
1687
+ }
1688
+ .col-sm-push-2 {
1689
+ left: 16.66666667%;
1690
+ }
1691
+ .col-sm-push-1 {
1692
+ left: 8.33333333%;
1693
+ }
1694
+ .col-sm-push-0 {
1695
+ left: auto;
1696
+ }
1697
+ .col-sm-offset-12 {
1698
+ margin-left: 100%;
1699
+ }
1700
+ .col-sm-offset-11 {
1701
+ margin-left: 91.66666667%;
1702
+ }
1703
+ .col-sm-offset-10 {
1704
+ margin-left: 83.33333333%;
1705
+ }
1706
+ .col-sm-offset-9 {
1707
+ margin-left: 75%;
1708
+ }
1709
+ .col-sm-offset-8 {
1710
+ margin-left: 66.66666667%;
1711
+ }
1712
+ .col-sm-offset-7 {
1713
+ margin-left: 58.33333333%;
1714
+ }
1715
+ .col-sm-offset-6 {
1716
+ margin-left: 50%;
1717
+ }
1718
+ .col-sm-offset-5 {
1719
+ margin-left: 41.66666667%;
1720
+ }
1721
+ .col-sm-offset-4 {
1722
+ margin-left: 33.33333333%;
1723
+ }
1724
+ .col-sm-offset-3 {
1725
+ margin-left: 25%;
1726
+ }
1727
+ .col-sm-offset-2 {
1728
+ margin-left: 16.66666667%;
1729
+ }
1730
+ .col-sm-offset-1 {
1731
+ margin-left: 8.33333333%;
1732
+ }
1733
+ .col-sm-offset-0 {
1734
+ margin-left: 0%;
1735
+ }
1736
+ }
1737
+ @media (min-width: 992px) {
1738
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
1739
+ float: left;
1740
+ }
1741
+ .col-md-12 {
1742
+ width: 100%;
1743
+ }
1744
+ .col-md-11 {
1745
+ width: 91.66666667%;
1746
+ }
1747
+ .col-md-10 {
1748
+ width: 83.33333333%;
1749
+ }
1750
+ .col-md-9 {
1751
+ width: 75%;
1752
+ }
1753
+ .col-md-8 {
1754
+ width: 66.66666667%;
1755
+ }
1756
+ .col-md-7 {
1757
+ width: 58.33333333%;
1758
+ }
1759
+ .col-md-6 {
1760
+ width: 50%;
1761
+ }
1762
+ .col-md-5 {
1763
+ width: 41.66666667%;
1764
+ }
1765
+ .col-md-4 {
1766
+ width: 33.33333333%;
1767
+ }
1768
+ .col-md-3 {
1769
+ width: 25%;
1770
+ }
1771
+ .col-md-2 {
1772
+ width: 16.66666667%;
1773
+ }
1774
+ .col-md-1 {
1775
+ width: 8.33333333%;
1776
+ }
1777
+ .col-md-pull-12 {
1778
+ right: 100%;
1779
+ }
1780
+ .col-md-pull-11 {
1781
+ right: 91.66666667%;
1782
+ }
1783
+ .col-md-pull-10 {
1784
+ right: 83.33333333%;
1785
+ }
1786
+ .col-md-pull-9 {
1787
+ right: 75%;
1788
+ }
1789
+ .col-md-pull-8 {
1790
+ right: 66.66666667%;
1791
+ }
1792
+ .col-md-pull-7 {
1793
+ right: 58.33333333%;
1794
+ }
1795
+ .col-md-pull-6 {
1796
+ right: 50%;
1797
+ }
1798
+ .col-md-pull-5 {
1799
+ right: 41.66666667%;
1800
+ }
1801
+ .col-md-pull-4 {
1802
+ right: 33.33333333%;
1803
+ }
1804
+ .col-md-pull-3 {
1805
+ right: 25%;
1806
+ }
1807
+ .col-md-pull-2 {
1808
+ right: 16.66666667%;
1809
+ }
1810
+ .col-md-pull-1 {
1811
+ right: 8.33333333%;
1812
+ }
1813
+ .col-md-pull-0 {
1814
+ right: auto;
1815
+ }
1816
+ .col-md-push-12 {
1817
+ left: 100%;
1818
+ }
1819
+ .col-md-push-11 {
1820
+ left: 91.66666667%;
1821
+ }
1822
+ .col-md-push-10 {
1823
+ left: 83.33333333%;
1824
+ }
1825
+ .col-md-push-9 {
1826
+ left: 75%;
1827
+ }
1828
+ .col-md-push-8 {
1829
+ left: 66.66666667%;
1830
+ }
1831
+ .col-md-push-7 {
1832
+ left: 58.33333333%;
1833
+ }
1834
+ .col-md-push-6 {
1835
+ left: 50%;
1836
+ }
1837
+ .col-md-push-5 {
1838
+ left: 41.66666667%;
1839
+ }
1840
+ .col-md-push-4 {
1841
+ left: 33.33333333%;
1842
+ }
1843
+ .col-md-push-3 {
1844
+ left: 25%;
1845
+ }
1846
+ .col-md-push-2 {
1847
+ left: 16.66666667%;
1848
+ }
1849
+ .col-md-push-1 {
1850
+ left: 8.33333333%;
1851
+ }
1852
+ .col-md-push-0 {
1853
+ left: auto;
1854
+ }
1855
+ .col-md-offset-12 {
1856
+ margin-left: 100%;
1857
+ }
1858
+ .col-md-offset-11 {
1859
+ margin-left: 91.66666667%;
1860
+ }
1861
+ .col-md-offset-10 {
1862
+ margin-left: 83.33333333%;
1863
+ }
1864
+ .col-md-offset-9 {
1865
+ margin-left: 75%;
1866
+ }
1867
+ .col-md-offset-8 {
1868
+ margin-left: 66.66666667%;
1869
+ }
1870
+ .col-md-offset-7 {
1871
+ margin-left: 58.33333333%;
1872
+ }
1873
+ .col-md-offset-6 {
1874
+ margin-left: 50%;
1875
+ }
1876
+ .col-md-offset-5 {
1877
+ margin-left: 41.66666667%;
1878
+ }
1879
+ .col-md-offset-4 {
1880
+ margin-left: 33.33333333%;
1881
+ }
1882
+ .col-md-offset-3 {
1883
+ margin-left: 25%;
1884
+ }
1885
+ .col-md-offset-2 {
1886
+ margin-left: 16.66666667%;
1887
+ }
1888
+ .col-md-offset-1 {
1889
+ margin-left: 8.33333333%;
1890
+ }
1891
+ .col-md-offset-0 {
1892
+ margin-left: 0%;
1893
+ }
1894
+ }
1895
+ @media (min-width: 1200px) {
1896
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
1897
+ float: left;
1898
+ }
1899
+ .col-lg-12 {
1900
+ width: 100%;
1901
+ }
1902
+ .col-lg-11 {
1903
+ width: 91.66666667%;
1904
+ }
1905
+ .col-lg-10 {
1906
+ width: 83.33333333%;
1907
+ }
1908
+ .col-lg-9 {
1909
+ width: 75%;
1910
+ }
1911
+ .col-lg-8 {
1912
+ width: 66.66666667%;
1913
+ }
1914
+ .col-lg-7 {
1915
+ width: 58.33333333%;
1916
+ }
1917
+ .col-lg-6 {
1918
+ width: 50%;
1919
+ }
1920
+ .col-lg-5 {
1921
+ width: 41.66666667%;
1922
+ }
1923
+ .col-lg-4 {
1924
+ width: 33.33333333%;
1925
+ }
1926
+ .col-lg-3 {
1927
+ width: 25%;
1928
+ }
1929
+ .col-lg-2 {
1930
+ width: 16.66666667%;
1931
+ }
1932
+ .col-lg-1 {
1933
+ width: 8.33333333%;
1934
+ }
1935
+ .col-lg-pull-12 {
1936
+ right: 100%;
1937
+ }
1938
+ .col-lg-pull-11 {
1939
+ right: 91.66666667%;
1940
+ }
1941
+ .col-lg-pull-10 {
1942
+ right: 83.33333333%;
1943
+ }
1944
+ .col-lg-pull-9 {
1945
+ right: 75%;
1946
+ }
1947
+ .col-lg-pull-8 {
1948
+ right: 66.66666667%;
1949
+ }
1950
+ .col-lg-pull-7 {
1951
+ right: 58.33333333%;
1952
+ }
1953
+ .col-lg-pull-6 {
1954
+ right: 50%;
1955
+ }
1956
+ .col-lg-pull-5 {
1957
+ right: 41.66666667%;
1958
+ }
1959
+ .col-lg-pull-4 {
1960
+ right: 33.33333333%;
1961
+ }
1962
+ .col-lg-pull-3 {
1963
+ right: 25%;
1964
+ }
1965
+ .col-lg-pull-2 {
1966
+ right: 16.66666667%;
1967
+ }
1968
+ .col-lg-pull-1 {
1969
+ right: 8.33333333%;
1970
+ }
1971
+ .col-lg-pull-0 {
1972
+ right: auto;
1973
+ }
1974
+ .col-lg-push-12 {
1975
+ left: 100%;
1976
+ }
1977
+ .col-lg-push-11 {
1978
+ left: 91.66666667%;
1979
+ }
1980
+ .col-lg-push-10 {
1981
+ left: 83.33333333%;
1982
+ }
1983
+ .col-lg-push-9 {
1984
+ left: 75%;
1985
+ }
1986
+ .col-lg-push-8 {
1987
+ left: 66.66666667%;
1988
+ }
1989
+ .col-lg-push-7 {
1990
+ left: 58.33333333%;
1991
+ }
1992
+ .col-lg-push-6 {
1993
+ left: 50%;
1994
+ }
1995
+ .col-lg-push-5 {
1996
+ left: 41.66666667%;
1997
+ }
1998
+ .col-lg-push-4 {
1999
+ left: 33.33333333%;
2000
+ }
2001
+ .col-lg-push-3 {
2002
+ left: 25%;
2003
+ }
2004
+ .col-lg-push-2 {
2005
+ left: 16.66666667%;
2006
+ }
2007
+ .col-lg-push-1 {
2008
+ left: 8.33333333%;
2009
+ }
2010
+ .col-lg-push-0 {
2011
+ left: auto;
2012
+ }
2013
+ .col-lg-offset-12 {
2014
+ margin-left: 100%;
2015
+ }
2016
+ .col-lg-offset-11 {
2017
+ margin-left: 91.66666667%;
2018
+ }
2019
+ .col-lg-offset-10 {
2020
+ margin-left: 83.33333333%;
2021
+ }
2022
+ .col-lg-offset-9 {
2023
+ margin-left: 75%;
2024
+ }
2025
+ .col-lg-offset-8 {
2026
+ margin-left: 66.66666667%;
2027
+ }
2028
+ .col-lg-offset-7 {
2029
+ margin-left: 58.33333333%;
2030
+ }
2031
+ .col-lg-offset-6 {
2032
+ margin-left: 50%;
2033
+ }
2034
+ .col-lg-offset-5 {
2035
+ margin-left: 41.66666667%;
2036
+ }
2037
+ .col-lg-offset-4 {
2038
+ margin-left: 33.33333333%;
2039
+ }
2040
+ .col-lg-offset-3 {
2041
+ margin-left: 25%;
2042
+ }
2043
+ .col-lg-offset-2 {
2044
+ margin-left: 16.66666667%;
2045
+ }
2046
+ .col-lg-offset-1 {
2047
+ margin-left: 8.33333333%;
2048
+ }
2049
+ .col-lg-offset-0 {
2050
+ margin-left: 0%;
2051
+ }
2052
+ }
2053
+ table {
2054
+ background-color: transparent;
2055
+ }
2056
+ th {
2057
+ text-align: left;
2058
+ }
2059
+ .table {
2060
+ width: 100%;
2061
+ max-width: 100%;
2062
+ margin-bottom: 20px;
2063
+ }
2064
+ .table > thead > tr > th,
2065
+ .table > tbody > tr > th,
2066
+ .table > tfoot > tr > th,
2067
+ .table > thead > tr > td,
2068
+ .table > tbody > tr > td,
2069
+ .table > tfoot > tr > td {
2070
+ padding: 8px;
2071
+ line-height: 1.42857143;
2072
+ vertical-align: top;
2073
+ border-top: 1px solid #dddddd;
2074
+ }
2075
+ .table > thead > tr > th {
2076
+ vertical-align: bottom;
2077
+ border-bottom: 2px solid #dddddd;
2078
+ }
2079
+ .table > caption + thead > tr:first-child > th,
2080
+ .table > colgroup + thead > tr:first-child > th,
2081
+ .table > thead:first-child > tr:first-child > th,
2082
+ .table > caption + thead > tr:first-child > td,
2083
+ .table > colgroup + thead > tr:first-child > td,
2084
+ .table > thead:first-child > tr:first-child > td {
2085
+ border-top: 0;
2086
+ }
2087
+ .table > tbody + tbody {
2088
+ border-top: 2px solid #dddddd;
2089
+ }
2090
+ .table .table {
2091
+ background-color: #ffffff;
2092
+ }
2093
+ .table-condensed > thead > tr > th,
2094
+ .table-condensed > tbody > tr > th,
2095
+ .table-condensed > tfoot > tr > th,
2096
+ .table-condensed > thead > tr > td,
2097
+ .table-condensed > tbody > tr > td,
2098
+ .table-condensed > tfoot > tr > td {
2099
+ padding: 5px;
2100
+ }
2101
+ .table-bordered {
2102
+ border: 1px solid #dddddd;
2103
+ }
2104
+ .table-bordered > thead > tr > th,
2105
+ .table-bordered > tbody > tr > th,
2106
+ .table-bordered > tfoot > tr > th,
2107
+ .table-bordered > thead > tr > td,
2108
+ .table-bordered > tbody > tr > td,
2109
+ .table-bordered > tfoot > tr > td {
2110
+ border: 1px solid #dddddd;
2111
+ }
2112
+ .table-bordered > thead > tr > th,
2113
+ .table-bordered > thead > tr > td {
2114
+ border-bottom-width: 2px;
2115
+ }
2116
+ .table-striped > tbody > tr:nth-child(odd) > td,
2117
+ .table-striped > tbody > tr:nth-child(odd) > th {
2118
+ background-color: #f9f9f9;
2119
+ }
2120
+ .table-hover > tbody > tr:hover > td,
2121
+ .table-hover > tbody > tr:hover > th {
2122
+ background-color: #f5f5f5;
2123
+ }
2124
+ table col[class*="col-"] {
2125
+ position: static;
2126
+ float: none;
2127
+ display: table-column;
2128
+ }
2129
+ table td[class*="col-"],
2130
+ table th[class*="col-"] {
2131
+ position: static;
2132
+ float: none;
2133
+ display: table-cell;
2134
+ }
2135
+ .table > thead > tr > td.active,
2136
+ .table > tbody > tr > td.active,
2137
+ .table > tfoot > tr > td.active,
2138
+ .table > thead > tr > th.active,
2139
+ .table > tbody > tr > th.active,
2140
+ .table > tfoot > tr > th.active,
2141
+ .table > thead > tr.active > td,
2142
+ .table > tbody > tr.active > td,
2143
+ .table > tfoot > tr.active > td,
2144
+ .table > thead > tr.active > th,
2145
+ .table > tbody > tr.active > th,
2146
+ .table > tfoot > tr.active > th {
2147
+ background-color: #f5f5f5;
2148
+ }
2149
+ .table-hover > tbody > tr > td.active:hover,
2150
+ .table-hover > tbody > tr > th.active:hover,
2151
+ .table-hover > tbody > tr.active:hover > td,
2152
+ .table-hover > tbody > tr:hover > .active,
2153
+ .table-hover > tbody > tr.active:hover > th {
2154
+ background-color: #e8e8e8;
2155
+ }
2156
+ .table > thead > tr > td.success,
2157
+ .table > tbody > tr > td.success,
2158
+ .table > tfoot > tr > td.success,
2159
+ .table > thead > tr > th.success,
2160
+ .table > tbody > tr > th.success,
2161
+ .table > tfoot > tr > th.success,
2162
+ .table > thead > tr.success > td,
2163
+ .table > tbody > tr.success > td,
2164
+ .table > tfoot > tr.success > td,
2165
+ .table > thead > tr.success > th,
2166
+ .table > tbody > tr.success > th,
2167
+ .table > tfoot > tr.success > th {
2168
+ background-color: #dff0d8;
2169
+ }
2170
+ .table-hover > tbody > tr > td.success:hover,
2171
+ .table-hover > tbody > tr > th.success:hover,
2172
+ .table-hover > tbody > tr.success:hover > td,
2173
+ .table-hover > tbody > tr:hover > .success,
2174
+ .table-hover > tbody > tr.success:hover > th {
2175
+ background-color: #d0e9c6;
2176
+ }
2177
+ .table > thead > tr > td.info,
2178
+ .table > tbody > tr > td.info,
2179
+ .table > tfoot > tr > td.info,
2180
+ .table > thead > tr > th.info,
2181
+ .table > tbody > tr > th.info,
2182
+ .table > tfoot > tr > th.info,
2183
+ .table > thead > tr.info > td,
2184
+ .table > tbody > tr.info > td,
2185
+ .table > tfoot > tr.info > td,
2186
+ .table > thead > tr.info > th,
2187
+ .table > tbody > tr.info > th,
2188
+ .table > tfoot > tr.info > th {
2189
+ background-color: #d9edf7;
2190
+ }
2191
+ .table-hover > tbody > tr > td.info:hover,
2192
+ .table-hover > tbody > tr > th.info:hover,
2193
+ .table-hover > tbody > tr.info:hover > td,
2194
+ .table-hover > tbody > tr:hover > .info,
2195
+ .table-hover > tbody > tr.info:hover > th {
2196
+ background-color: #c4e3f3;
2197
+ }
2198
+ .table > thead > tr > td.warning,
2199
+ .table > tbody > tr > td.warning,
2200
+ .table > tfoot > tr > td.warning,
2201
+ .table > thead > tr > th.warning,
2202
+ .table > tbody > tr > th.warning,
2203
+ .table > tfoot > tr > th.warning,
2204
+ .table > thead > tr.warning > td,
2205
+ .table > tbody > tr.warning > td,
2206
+ .table > tfoot > tr.warning > td,
2207
+ .table > thead > tr.warning > th,
2208
+ .table > tbody > tr.warning > th,
2209
+ .table > tfoot > tr.warning > th {
2210
+ background-color: #fcf8e3;
2211
+ }
2212
+ .table-hover > tbody > tr > td.warning:hover,
2213
+ .table-hover > tbody > tr > th.warning:hover,
2214
+ .table-hover > tbody > tr.warning:hover > td,
2215
+ .table-hover > tbody > tr:hover > .warning,
2216
+ .table-hover > tbody > tr.warning:hover > th {
2217
+ background-color: #faf2cc;
2218
+ }
2219
+ .table > thead > tr > td.danger,
2220
+ .table > tbody > tr > td.danger,
2221
+ .table > tfoot > tr > td.danger,
2222
+ .table > thead > tr > th.danger,
2223
+ .table > tbody > tr > th.danger,
2224
+ .table > tfoot > tr > th.danger,
2225
+ .table > thead > tr.danger > td,
2226
+ .table > tbody > tr.danger > td,
2227
+ .table > tfoot > tr.danger > td,
2228
+ .table > thead > tr.danger > th,
2229
+ .table > tbody > tr.danger > th,
2230
+ .table > tfoot > tr.danger > th {
2231
+ background-color: #f2dede;
2232
+ }
2233
+ .table-hover > tbody > tr > td.danger:hover,
2234
+ .table-hover > tbody > tr > th.danger:hover,
2235
+ .table-hover > tbody > tr.danger:hover > td,
2236
+ .table-hover > tbody > tr:hover > .danger,
2237
+ .table-hover > tbody > tr.danger:hover > th {
2238
+ background-color: #ebcccc;
2239
+ }
2240
+ @media screen and (max-width: 767px) {
2241
+ .table-responsive {
2242
+ width: 100%;
2243
+ margin-bottom: 15px;
2244
+ overflow-y: hidden;
2245
+ overflow-x: auto;
2246
+ -ms-overflow-style: -ms-autohiding-scrollbar;
2247
+ border: 1px solid #dddddd;
2248
+ -webkit-overflow-scrolling: touch;
2249
+ }
2250
+ .table-responsive > .table {
2251
+ margin-bottom: 0;
2252
+ }
2253
+ .table-responsive > .table > thead > tr > th,
2254
+ .table-responsive > .table > tbody > tr > th,
2255
+ .table-responsive > .table > tfoot > tr > th,
2256
+ .table-responsive > .table > thead > tr > td,
2257
+ .table-responsive > .table > tbody > tr > td,
2258
+ .table-responsive > .table > tfoot > tr > td {
2259
+ white-space: nowrap;
2260
+ }
2261
+ .table-responsive > .table-bordered {
2262
+ border: 0;
2263
+ }
2264
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
2265
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
2266
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
2267
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
2268
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
2269
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
2270
+ border-left: 0;
2271
+ }
2272
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
2273
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
2274
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
2275
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
2276
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
2277
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
2278
+ border-right: 0;
2279
+ }
2280
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
2281
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
2282
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
2283
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
2284
+ border-bottom: 0;
2285
+ }
2286
+ }
2287
+ fieldset {
2288
+ padding: 0;
2289
+ margin: 0;
2290
+ border: 0;
2291
+ min-width: 0;
2292
+ }
2293
+ legend {
2294
+ display: block;
2295
+ width: 100%;
2296
+ padding: 0;
2297
+ margin-bottom: 20px;
2298
+ font-size: 21px;
2299
+ line-height: inherit;
2300
+ color: #333333;
2301
+ border: 0;
2302
+ border-bottom: 1px solid #e5e5e5;
2303
+ }
2304
+ label {
2305
+ display: inline-block;
2306
+ max-width: 100%;
2307
+ margin-bottom: 5px;
2308
+ font-weight: bold;
2309
+ }
2310
+ input[type="search"] {
2311
+ -webkit-box-sizing: border-box;
2312
+ -moz-box-sizing: border-box;
2313
+ box-sizing: border-box;
2314
+ }
2315
+ input[type="radio"],
2316
+ input[type="checkbox"] {
2317
+ margin: 4px 0 0;
2318
+ margin-top: 1px \9;
2319
+ line-height: normal;
2320
+ }
2321
+ input[type="file"] {
2322
+ display: block;
2323
+ }
2324
+ input[type="range"] {
2325
+ display: block;
2326
+ width: 100%;
2327
+ }
2328
+ select[multiple],
2329
+ select[size] {
2330
+ height: auto;
2331
+ }
2332
+ input[type="file"]:focus,
2333
+ input[type="radio"]:focus,
2334
+ input[type="checkbox"]:focus {
2335
+ outline: 5px auto -webkit-focus-ring-color;
2336
+ outline-offset: -2px;
2337
+ }
2338
+ output {
2339
+ display: block;
2340
+ padding-top: 7px;
2341
+ font-size: 14px;
2342
+ line-height: 1.42857143;
2343
+ color: #555555;
2344
+ }
2345
+ .form-control {
2346
+ display: block;
2347
+ width: 100%;
2348
+ height: 34px;
2349
+ padding: 6px 12px;
2350
+ font-size: 14px;
2351
+ line-height: 1.42857143;
2352
+ color: #555555;
2353
+ background-color: #ffffff;
2354
+ background-image: none;
2355
+ border: 1px solid #cccccc;
2356
+ border-radius: 4px;
2357
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2358
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2359
+ -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2360
+ -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2361
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2362
+ }
2363
+ .form-control:focus {
2364
+ border-color: #66afe9;
2365
+ outline: 0;
2366
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
2367
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
2368
+ }
2369
+ .form-control::-moz-placeholder {
2370
+ color: #777777;
2371
+ opacity: 1;
2372
+ }
2373
+ .form-control:-ms-input-placeholder {
2374
+ color: #777777;
2375
+ }
2376
+ .form-control::-webkit-input-placeholder {
2377
+ color: #777777;
2378
+ }
2379
+ .form-control[disabled],
2380
+ .form-control[readonly],
2381
+ fieldset[disabled] .form-control {
2382
+ cursor: not-allowed;
2383
+ background-color: #eeeeee;
2384
+ opacity: 1;
2385
+ }
2386
+ textarea.form-control {
2387
+ height: auto;
2388
+ }
2389
+ input[type="search"] {
2390
+ -webkit-appearance: none;
2391
+ }
2392
+ input[type="date"],
2393
+ input[type="time"],
2394
+ input[type="datetime-local"],
2395
+ input[type="month"] {
2396
+ line-height: 1.42857143 \0;
2397
+ }
2398
+ input[type="date"].input-sm,
2399
+ input[type="time"].input-sm,
2400
+ input[type="datetime-local"].input-sm,
2401
+ input[type="month"].input-sm {
2402
+ line-height: 30px;
2403
+ }
2404
+ input[type="date"].input-lg,
2405
+ input[type="time"].input-lg,
2406
+ input[type="datetime-local"].input-lg,
2407
+ input[type="month"].input-lg {
2408
+ line-height: 46px;
2409
+ }
2410
+ .form-group {
2411
+ margin-bottom: 15px;
2412
+ }
2413
+ .radio,
2414
+ .checkbox {
2415
+ position: relative;
2416
+ display: block;
2417
+ min-height: 20px;
2418
+ margin-top: 10px;
2419
+ margin-bottom: 10px;
2420
+ }
2421
+ .radio label,
2422
+ .checkbox label {
2423
+ padding-left: 20px;
2424
+ margin-bottom: 0;
2425
+ font-weight: normal;
2426
+ cursor: pointer;
2427
+ }
2428
+ .radio input[type="radio"],
2429
+ .radio-inline input[type="radio"],
2430
+ .checkbox input[type="checkbox"],
2431
+ .checkbox-inline input[type="checkbox"] {
2432
+ position: absolute;
2433
+ margin-left: -20px;
2434
+ margin-top: 4px \9;
2435
+ }
2436
+ .radio + .radio,
2437
+ .checkbox + .checkbox {
2438
+ margin-top: -5px;
2439
+ }
2440
+ .radio-inline,
2441
+ .checkbox-inline {
2442
+ display: inline-block;
2443
+ padding-left: 20px;
2444
+ margin-bottom: 0;
2445
+ vertical-align: middle;
2446
+ font-weight: normal;
2447
+ cursor: pointer;
2448
+ }
2449
+ .radio-inline + .radio-inline,
2450
+ .checkbox-inline + .checkbox-inline {
2451
+ margin-top: 0;
2452
+ margin-left: 10px;
2453
+ }
2454
+ input[type="radio"][disabled],
2455
+ input[type="checkbox"][disabled],
2456
+ input[type="radio"].disabled,
2457
+ input[type="checkbox"].disabled,
2458
+ fieldset[disabled] input[type="radio"],
2459
+ fieldset[disabled] input[type="checkbox"] {
2460
+ cursor: not-allowed;
2461
+ }
2462
+ .radio-inline.disabled,
2463
+ .checkbox-inline.disabled,
2464
+ fieldset[disabled] .radio-inline,
2465
+ fieldset[disabled] .checkbox-inline {
2466
+ cursor: not-allowed;
2467
+ }
2468
+ .radio.disabled label,
2469
+ .checkbox.disabled label,
2470
+ fieldset[disabled] .radio label,
2471
+ fieldset[disabled] .checkbox label {
2472
+ cursor: not-allowed;
2473
+ }
2474
+ .form-control-static {
2475
+ padding-top: 7px;
2476
+ padding-bottom: 7px;
2477
+ margin-bottom: 0;
2478
+ }
2479
+ .form-control-static.input-lg,
2480
+ .form-control-static.input-sm {
2481
+ padding-left: 0;
2482
+ padding-right: 0;
2483
+ }
2484
+ .input-sm,
2485
+ .form-horizontal .form-group-sm .form-control {
2486
+ height: 30px;
2487
+ padding: 5px 10px;
2488
+ font-size: 12px;
2489
+ line-height: 1.5;
2490
+ border-radius: 3px;
2491
+ }
2492
+ select.input-sm {
2493
+ height: 30px;
2494
+ line-height: 30px;
2495
+ }
2496
+ textarea.input-sm,
2497
+ select[multiple].input-sm {
2498
+ height: auto;
2499
+ }
2500
+ .input-lg,
2501
+ .form-horizontal .form-group-lg .form-control {
2502
+ height: 46px;
2503
+ padding: 10px 16px;
2504
+ font-size: 18px;
2505
+ line-height: 1.33;
2506
+ border-radius: 6px;
2507
+ }
2508
+ select.input-lg {
2509
+ height: 46px;
2510
+ line-height: 46px;
2511
+ }
2512
+ textarea.input-lg,
2513
+ select[multiple].input-lg {
2514
+ height: auto;
2515
+ }
2516
+ .has-feedback {
2517
+ position: relative;
2518
+ }
2519
+ .has-feedback .form-control {
2520
+ padding-right: 42.5px;
2521
+ }
2522
+ .form-control-feedback {
2523
+ position: absolute;
2524
+ top: 25px;
2525
+ right: 0;
2526
+ z-index: 2;
2527
+ display: block;
2528
+ width: 34px;
2529
+ height: 34px;
2530
+ line-height: 34px;
2531
+ text-align: center;
2532
+ }
2533
+ .input-lg + .form-control-feedback {
2534
+ width: 46px;
2535
+ height: 46px;
2536
+ line-height: 46px;
2537
+ }
2538
+ .input-sm + .form-control-feedback {
2539
+ width: 30px;
2540
+ height: 30px;
2541
+ line-height: 30px;
2542
+ }
2543
+ .has-success .help-block,
2544
+ .has-success .control-label,
2545
+ .has-success .radio,
2546
+ .has-success .checkbox,
2547
+ .has-success .radio-inline,
2548
+ .has-success .checkbox-inline {
2549
+ color: #3c763d;
2550
+ }
2551
+ .has-success .form-control {
2552
+ border-color: #3c763d;
2553
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2554
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2555
+ }
2556
+ .has-success .form-control:focus {
2557
+ border-color: #2b542c;
2558
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
2559
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
2560
+ }
2561
+ .has-success .input-group-addon {
2562
+ color: #3c763d;
2563
+ border-color: #3c763d;
2564
+ background-color: #dff0d8;
2565
+ }
2566
+ .has-success .form-control-feedback {
2567
+ color: #3c763d;
2568
+ }
2569
+ .has-warning .help-block,
2570
+ .has-warning .control-label,
2571
+ .has-warning .radio,
2572
+ .has-warning .checkbox,
2573
+ .has-warning .radio-inline,
2574
+ .has-warning .checkbox-inline {
2575
+ color: #8a6d3b;
2576
+ }
2577
+ .has-warning .form-control {
2578
+ border-color: #8a6d3b;
2579
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2580
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2581
+ }
2582
+ .has-warning .form-control:focus {
2583
+ border-color: #66512c;
2584
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
2585
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
2586
+ }
2587
+ .has-warning .input-group-addon {
2588
+ color: #8a6d3b;
2589
+ border-color: #8a6d3b;
2590
+ background-color: #fcf8e3;
2591
+ }
2592
+ .has-warning .form-control-feedback {
2593
+ color: #8a6d3b;
2594
+ }
2595
+ .has-error .help-block,
2596
+ .has-error .control-label,
2597
+ .has-error .radio,
2598
+ .has-error .checkbox,
2599
+ .has-error .radio-inline,
2600
+ .has-error .checkbox-inline {
2601
+ color: #a94442;
2602
+ }
2603
+ .has-error .form-control {
2604
+ border-color: #a94442;
2605
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2606
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
2607
+ }
2608
+ .has-error .form-control:focus {
2609
+ border-color: #843534;
2610
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
2611
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
2612
+ }
2613
+ .has-error .input-group-addon {
2614
+ color: #a94442;
2615
+ border-color: #a94442;
2616
+ background-color: #f2dede;
2617
+ }
2618
+ .has-error .form-control-feedback {
2619
+ color: #a94442;
2620
+ }
2621
+ .has-feedback label.sr-only ~ .form-control-feedback {
2622
+ top: 0;
2623
+ }
2624
+ .help-block {
2625
+ display: block;
2626
+ margin-top: 5px;
2627
+ margin-bottom: 10px;
2628
+ color: #737373;
2629
+ }
2630
+ @media (min-width: 768px) {
2631
+ .form-inline .form-group {
2632
+ display: inline-block;
2633
+ margin-bottom: 0;
2634
+ vertical-align: middle;
2635
+ }
2636
+ .form-inline .form-control {
2637
+ display: inline-block;
2638
+ width: auto;
2639
+ vertical-align: middle;
2640
+ }
2641
+ .form-inline .input-group {
2642
+ display: inline-table;
2643
+ vertical-align: middle;
2644
+ }
2645
+ .form-inline .input-group .input-group-addon,
2646
+ .form-inline .input-group .input-group-btn,
2647
+ .form-inline .input-group .form-control {
2648
+ width: auto;
2649
+ }
2650
+ .form-inline .input-group > .form-control {
2651
+ width: 100%;
2652
+ }
2653
+ .form-inline .control-label {
2654
+ margin-bottom: 0;
2655
+ vertical-align: middle;
2656
+ }
2657
+ .form-inline .radio,
2658
+ .form-inline .checkbox {
2659
+ display: inline-block;
2660
+ margin-top: 0;
2661
+ margin-bottom: 0;
2662
+ vertical-align: middle;
2663
+ }
2664
+ .form-inline .radio label,
2665
+ .form-inline .checkbox label {
2666
+ padding-left: 0;
2667
+ }
2668
+ .form-inline .radio input[type="radio"],
2669
+ .form-inline .checkbox input[type="checkbox"] {
2670
+ position: relative;
2671
+ margin-left: 0;
2672
+ }
2673
+ .form-inline .has-feedback .form-control-feedback {
2674
+ top: 0;
2675
+ }
2676
+ }
2677
+ .form-horizontal .radio,
2678
+ .form-horizontal .checkbox,
2679
+ .form-horizontal .radio-inline,
2680
+ .form-horizontal .checkbox-inline {
2681
+ margin-top: 0;
2682
+ margin-bottom: 0;
2683
+ padding-top: 7px;
2684
+ }
2685
+ .form-horizontal .radio,
2686
+ .form-horizontal .checkbox {
2687
+ min-height: 27px;
2688
+ }
2689
+ .form-horizontal .form-group {
2690
+ margin-left: -15px;
2691
+ margin-right: -15px;
2692
+ }
2693
+ @media (min-width: 768px) {
2694
+ .form-horizontal .control-label {
2695
+ text-align: right;
2696
+ margin-bottom: 0;
2697
+ padding-top: 7px;
2698
+ }
2699
+ }
2700
+ .form-horizontal .has-feedback .form-control-feedback {
2701
+ top: 0;
2702
+ right: 15px;
2703
+ }
2704
+ @media (min-width: 768px) {
2705
+ .form-horizontal .form-group-lg .control-label {
2706
+ padding-top: 14.3px;
2707
+ }
2708
+ }
2709
+ @media (min-width: 768px) {
2710
+ .form-horizontal .form-group-sm .control-label {
2711
+ padding-top: 6px;
2712
+ }
2713
+ }
2714
+ .btn {
2715
+ display: inline-block;
2716
+ margin-bottom: 0;
2717
+ font-weight: normal;
2718
+ text-align: center;
2719
+ vertical-align: middle;
2720
+ cursor: pointer;
2721
+ background-image: none;
2722
+ border: 1px solid transparent;
2723
+ white-space: nowrap;
2724
+ padding: 6px 12px;
2725
+ font-size: 14px;
2726
+ line-height: 1.42857143;
2727
+ border-radius: 4px;
2728
+ -webkit-user-select: none;
2729
+ -moz-user-select: none;
2730
+ -ms-user-select: none;
2731
+ user-select: none;
2732
+ }
2733
+ .btn:focus,
2734
+ .btn:active:focus,
2735
+ .btn.active:focus {
2736
+ outline: 5px auto -webkit-focus-ring-color;
2737
+ outline-offset: -2px;
2738
+ }
2739
+ .btn:hover,
2740
+ .btn:focus {
2741
+ color: #333333;
2742
+ text-decoration: none;
2743
+ }
2744
+ .btn:active,
2745
+ .btn.active {
2746
+ outline: 0;
2747
+ background-image: none;
2748
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
2749
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
2750
+ }
2751
+ .btn.disabled,
2752
+ .btn[disabled],
2753
+ fieldset[disabled] .btn {
2754
+ cursor: not-allowed;
2755
+ pointer-events: none;
2756
+ opacity: 0.65;
2757
+ filter: alpha(opacity=65);
2758
+ -webkit-box-shadow: none;
2759
+ box-shadow: none;
2760
+ }
2761
+ .btn-default {
2762
+ color: #333333;
2763
+ background-color: #ffffff;
2764
+ border-color: #cccccc;
2765
+ }
2766
+ .btn-default:hover,
2767
+ .btn-default:focus,
2768
+ .btn-default:active,
2769
+ .btn-default.active,
2770
+ .open > .dropdown-toggle.btn-default {
2771
+ color: #333333;
2772
+ background-color: #e6e6e6;
2773
+ border-color: #adadad;
2774
+ }
2775
+ .btn-default:active,
2776
+ .btn-default.active,
2777
+ .open > .dropdown-toggle.btn-default {
2778
+ background-image: none;
2779
+ }
2780
+ .btn-default.disabled,
2781
+ .btn-default[disabled],
2782
+ fieldset[disabled] .btn-default,
2783
+ .btn-default.disabled:hover,
2784
+ .btn-default[disabled]:hover,
2785
+ fieldset[disabled] .btn-default:hover,
2786
+ .btn-default.disabled:focus,
2787
+ .btn-default[disabled]:focus,
2788
+ fieldset[disabled] .btn-default:focus,
2789
+ .btn-default.disabled:active,
2790
+ .btn-default[disabled]:active,
2791
+ fieldset[disabled] .btn-default:active,
2792
+ .btn-default.disabled.active,
2793
+ .btn-default[disabled].active,
2794
+ fieldset[disabled] .btn-default.active {
2795
+ background-color: #ffffff;
2796
+ border-color: #cccccc;
2797
+ }
2798
+ .btn-default .badge {
2799
+ color: #ffffff;
2800
+ background-color: #333333;
2801
+ }
2802
+ .btn-primary {
2803
+ color: #ffffff;
2804
+ background-color: #428bca;
2805
+ border-color: #357ebd;
2806
+ }
2807
+ .btn-primary:hover,
2808
+ .btn-primary:focus,
2809
+ .btn-primary:active,
2810
+ .btn-primary.active,
2811
+ .open > .dropdown-toggle.btn-primary {
2812
+ color: #ffffff;
2813
+ background-color: #3071a9;
2814
+ border-color: #285e8e;
2815
+ }
2816
+ .btn-primary:active,
2817
+ .btn-primary.active,
2818
+ .open > .dropdown-toggle.btn-primary {
2819
+ background-image: none;
2820
+ }
2821
+ .btn-primary.disabled,
2822
+ .btn-primary[disabled],
2823
+ fieldset[disabled] .btn-primary,
2824
+ .btn-primary.disabled:hover,
2825
+ .btn-primary[disabled]:hover,
2826
+ fieldset[disabled] .btn-primary:hover,
2827
+ .btn-primary.disabled:focus,
2828
+ .btn-primary[disabled]:focus,
2829
+ fieldset[disabled] .btn-primary:focus,
2830
+ .btn-primary.disabled:active,
2831
+ .btn-primary[disabled]:active,
2832
+ fieldset[disabled] .btn-primary:active,
2833
+ .btn-primary.disabled.active,
2834
+ .btn-primary[disabled].active,
2835
+ fieldset[disabled] .btn-primary.active {
2836
+ background-color: #428bca;
2837
+ border-color: #357ebd;
2838
+ }
2839
+ .btn-primary .badge {
2840
+ color: #428bca;
2841
+ background-color: #ffffff;
2842
+ }
2843
+ .btn-success {
2844
+ color: #ffffff;
2845
+ background-color: #5cb85c;
2846
+ border-color: #4cae4c;
2847
+ }
2848
+ .btn-success:hover,
2849
+ .btn-success:focus,
2850
+ .btn-success:active,
2851
+ .btn-success.active,
2852
+ .open > .dropdown-toggle.btn-success {
2853
+ color: #ffffff;
2854
+ background-color: #449d44;
2855
+ border-color: #398439;
2856
+ }
2857
+ .btn-success:active,
2858
+ .btn-success.active,
2859
+ .open > .dropdown-toggle.btn-success {
2860
+ background-image: none;
2861
+ }
2862
+ .btn-success.disabled,
2863
+ .btn-success[disabled],
2864
+ fieldset[disabled] .btn-success,
2865
+ .btn-success.disabled:hover,
2866
+ .btn-success[disabled]:hover,
2867
+ fieldset[disabled] .btn-success:hover,
2868
+ .btn-success.disabled:focus,
2869
+ .btn-success[disabled]:focus,
2870
+ fieldset[disabled] .btn-success:focus,
2871
+ .btn-success.disabled:active,
2872
+ .btn-success[disabled]:active,
2873
+ fieldset[disabled] .btn-success:active,
2874
+ .btn-success.disabled.active,
2875
+ .btn-success[disabled].active,
2876
+ fieldset[disabled] .btn-success.active {
2877
+ background-color: #5cb85c;
2878
+ border-color: #4cae4c;
2879
+ }
2880
+ .btn-success .badge {
2881
+ color: #5cb85c;
2882
+ background-color: #ffffff;
2883
+ }
2884
+ .btn-info {
2885
+ color: #ffffff;
2886
+ background-color: #5bc0de;
2887
+ border-color: #46b8da;
2888
+ }
2889
+ .btn-info:hover,
2890
+ .btn-info:focus,
2891
+ .btn-info:active,
2892
+ .btn-info.active,
2893
+ .open > .dropdown-toggle.btn-info {
2894
+ color: #ffffff;
2895
+ background-color: #31b0d5;
2896
+ border-color: #269abc;
2897
+ }
2898
+ .btn-info:active,
2899
+ .btn-info.active,
2900
+ .open > .dropdown-toggle.btn-info {
2901
+ background-image: none;
2902
+ }
2903
+ .btn-info.disabled,
2904
+ .btn-info[disabled],
2905
+ fieldset[disabled] .btn-info,
2906
+ .btn-info.disabled:hover,
2907
+ .btn-info[disabled]:hover,
2908
+ fieldset[disabled] .btn-info:hover,
2909
+ .btn-info.disabled:focus,
2910
+ .btn-info[disabled]:focus,
2911
+ fieldset[disabled] .btn-info:focus,
2912
+ .btn-info.disabled:active,
2913
+ .btn-info[disabled]:active,
2914
+ fieldset[disabled] .btn-info:active,
2915
+ .btn-info.disabled.active,
2916
+ .btn-info[disabled].active,
2917
+ fieldset[disabled] .btn-info.active {
2918
+ background-color: #5bc0de;
2919
+ border-color: #46b8da;
2920
+ }
2921
+ .btn-info .badge {
2922
+ color: #5bc0de;
2923
+ background-color: #ffffff;
2924
+ }
2925
+ .btn-warning {
2926
+ color: #ffffff;
2927
+ background-color: #f0ad4e;
2928
+ border-color: #eea236;
2929
+ }
2930
+ .btn-warning:hover,
2931
+ .btn-warning:focus,
2932
+ .btn-warning:active,
2933
+ .btn-warning.active,
2934
+ .open > .dropdown-toggle.btn-warning {
2935
+ color: #ffffff;
2936
+ background-color: #ec971f;
2937
+ border-color: #d58512;
2938
+ }
2939
+ .btn-warning:active,
2940
+ .btn-warning.active,
2941
+ .open > .dropdown-toggle.btn-warning {
2942
+ background-image: none;
2943
+ }
2944
+ .btn-warning.disabled,
2945
+ .btn-warning[disabled],
2946
+ fieldset[disabled] .btn-warning,
2947
+ .btn-warning.disabled:hover,
2948
+ .btn-warning[disabled]:hover,
2949
+ fieldset[disabled] .btn-warning:hover,
2950
+ .btn-warning.disabled:focus,
2951
+ .btn-warning[disabled]:focus,
2952
+ fieldset[disabled] .btn-warning:focus,
2953
+ .btn-warning.disabled:active,
2954
+ .btn-warning[disabled]:active,
2955
+ fieldset[disabled] .btn-warning:active,
2956
+ .btn-warning.disabled.active,
2957
+ .btn-warning[disabled].active,
2958
+ fieldset[disabled] .btn-warning.active {
2959
+ background-color: #f0ad4e;
2960
+ border-color: #eea236;
2961
+ }
2962
+ .btn-warning .badge {
2963
+ color: #f0ad4e;
2964
+ background-color: #ffffff;
2965
+ }
2966
+ .btn-danger {
2967
+ color: #ffffff;
2968
+ background-color: #d9534f;
2969
+ border-color: #d43f3a;
2970
+ }
2971
+ .btn-danger:hover,
2972
+ .btn-danger:focus,
2973
+ .btn-danger:active,
2974
+ .btn-danger.active,
2975
+ .open > .dropdown-toggle.btn-danger {
2976
+ color: #ffffff;
2977
+ background-color: #c9302c;
2978
+ border-color: #ac2925;
2979
+ }
2980
+ .btn-danger:active,
2981
+ .btn-danger.active,
2982
+ .open > .dropdown-toggle.btn-danger {
2983
+ background-image: none;
2984
+ }
2985
+ .btn-danger.disabled,
2986
+ .btn-danger[disabled],
2987
+ fieldset[disabled] .btn-danger,
2988
+ .btn-danger.disabled:hover,
2989
+ .btn-danger[disabled]:hover,
2990
+ fieldset[disabled] .btn-danger:hover,
2991
+ .btn-danger.disabled:focus,
2992
+ .btn-danger[disabled]:focus,
2993
+ fieldset[disabled] .btn-danger:focus,
2994
+ .btn-danger.disabled:active,
2995
+ .btn-danger[disabled]:active,
2996
+ fieldset[disabled] .btn-danger:active,
2997
+ .btn-danger.disabled.active,
2998
+ .btn-danger[disabled].active,
2999
+ fieldset[disabled] .btn-danger.active {
3000
+ background-color: #d9534f;
3001
+ border-color: #d43f3a;
3002
+ }
3003
+ .btn-danger .badge {
3004
+ color: #d9534f;
3005
+ background-color: #ffffff;
3006
+ }
3007
+ .btn-link {
3008
+ color: #428bca;
3009
+ font-weight: normal;
3010
+ cursor: pointer;
3011
+ border-radius: 0;
3012
+ }
3013
+ .btn-link,
3014
+ .btn-link:active,
3015
+ .btn-link[disabled],
3016
+ fieldset[disabled] .btn-link {
3017
+ background-color: transparent;
3018
+ -webkit-box-shadow: none;
3019
+ box-shadow: none;
3020
+ }
3021
+ .btn-link,
3022
+ .btn-link:hover,
3023
+ .btn-link:focus,
3024
+ .btn-link:active {
3025
+ border-color: transparent;
3026
+ }
3027
+ .btn-link:hover,
3028
+ .btn-link:focus {
3029
+ color: #2a6496;
3030
+ text-decoration: underline;
3031
+ background-color: transparent;
3032
+ }
3033
+ .btn-link[disabled]:hover,
3034
+ fieldset[disabled] .btn-link:hover,
3035
+ .btn-link[disabled]:focus,
3036
+ fieldset[disabled] .btn-link:focus {
3037
+ color: #777777;
3038
+ text-decoration: none;
3039
+ }
3040
+ .btn-lg,
3041
+ .btn-group-lg > .btn {
3042
+ padding: 10px 16px;
3043
+ font-size: 18px;
3044
+ line-height: 1.33;
3045
+ border-radius: 6px;
3046
+ }
3047
+ .btn-sm,
3048
+ .btn-group-sm > .btn {
3049
+ padding: 5px 10px;
3050
+ font-size: 12px;
3051
+ line-height: 1.5;
3052
+ border-radius: 3px;
3053
+ }
3054
+ .btn-xs,
3055
+ .btn-group-xs > .btn {
3056
+ padding: 1px 5px;
3057
+ font-size: 12px;
3058
+ line-height: 1.5;
3059
+ border-radius: 3px;
3060
+ }
3061
+ .btn-block {
3062
+ display: block;
3063
+ width: 100%;
3064
+ }
3065
+ .btn-block + .btn-block {
3066
+ margin-top: 5px;
3067
+ }
3068
+ input[type="submit"].btn-block,
3069
+ input[type="reset"].btn-block,
3070
+ input[type="button"].btn-block {
3071
+ width: 100%;
3072
+ }
3073
+ .fade {
3074
+ opacity: 0;
3075
+ -webkit-transition: opacity 0.15s linear;
3076
+ -o-transition: opacity 0.15s linear;
3077
+ transition: opacity 0.15s linear;
3078
+ }
3079
+ .fade.in {
3080
+ opacity: 1;
3081
+ }
3082
+ .collapse {
3083
+ display: none;
3084
+ }
3085
+ .collapse.in {
3086
+ display: block;
3087
+ }
3088
+ tr.collapse.in {
3089
+ display: table-row;
3090
+ }
3091
+ tbody.collapse.in {
3092
+ display: table-row-group;
3093
+ }
3094
+ .collapsing {
3095
+ position: relative;
3096
+ height: 0;
3097
+ overflow: hidden;
3098
+ -webkit-transition: height 0.35s ease;
3099
+ -o-transition: height 0.35s ease;
3100
+ transition: height 0.35s ease;
3101
+ }
3102
+ .caret {
3103
+ display: inline-block;
3104
+ width: 0;
3105
+ height: 0;
3106
+ margin-left: 2px;
3107
+ vertical-align: middle;
3108
+ border-top: 4px solid;
3109
+ border-right: 4px solid transparent;
3110
+ border-left: 4px solid transparent;
3111
+ }
3112
+ .dropdown {
3113
+ position: relative;
3114
+ }
3115
+ .dropdown-toggle:focus {
3116
+ outline: 0;
3117
+ }
3118
+ .dropdown-menu {
3119
+ position: absolute;
3120
+ top: 100%;
3121
+ left: 0;
3122
+ z-index: 1000;
3123
+ display: none;
3124
+ float: left;
3125
+ min-width: 160px;
3126
+ padding: 5px 0;
3127
+ margin: 2px 0 0;
3128
+ list-style: none;
3129
+ font-size: 14px;
3130
+ text-align: left;
3131
+ background-color: #ffffff;
3132
+ border: 1px solid #cccccc;
3133
+ border: 1px solid rgba(0, 0, 0, 0.15);
3134
+ border-radius: 4px;
3135
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
3136
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
3137
+ background-clip: padding-box;
3138
+ }
3139
+ .dropdown-menu.pull-right {
3140
+ right: 0;
3141
+ left: auto;
3142
+ }
3143
+ .dropdown-menu .divider {
3144
+ height: 1px;
3145
+ margin: 9px 0;
3146
+ overflow: hidden;
3147
+ background-color: #e5e5e5;
3148
+ }
3149
+ .dropdown-menu > li > a {
3150
+ display: block;
3151
+ padding: 3px 20px;
3152
+ clear: both;
3153
+ font-weight: normal;
3154
+ line-height: 1.42857143;
3155
+ color: #333333;
3156
+ white-space: nowrap;
3157
+ }
3158
+ .dropdown-menu > li > a:hover,
3159
+ .dropdown-menu > li > a:focus {
3160
+ text-decoration: none;
3161
+ color: #262626;
3162
+ background-color: #f5f5f5;
3163
+ }
3164
+ .dropdown-menu > .active > a,
3165
+ .dropdown-menu > .active > a:hover,
3166
+ .dropdown-menu > .active > a:focus {
3167
+ color: #ffffff;
3168
+ text-decoration: none;
3169
+ outline: 0;
3170
+ background-color: #428bca;
3171
+ }
3172
+ .dropdown-menu > .disabled > a,
3173
+ .dropdown-menu > .disabled > a:hover,
3174
+ .dropdown-menu > .disabled > a:focus {
3175
+ color: #777777;
3176
+ }
3177
+ .dropdown-menu > .disabled > a:hover,
3178
+ .dropdown-menu > .disabled > a:focus {
3179
+ text-decoration: none;
3180
+ background-color: transparent;
3181
+ background-image: none;
3182
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3183
+ cursor: not-allowed;
3184
+ }
3185
+ .open > .dropdown-menu {
3186
+ display: block;
3187
+ }
3188
+ .open > a {
3189
+ outline: 0;
3190
+ }
3191
+ .dropdown-menu-right {
3192
+ left: auto;
3193
+ right: 0;
3194
+ }
3195
+ .dropdown-menu-left {
3196
+ left: 0;
3197
+ right: auto;
3198
+ }
3199
+ .dropdown-header {
3200
+ display: block;
3201
+ padding: 3px 20px;
3202
+ font-size: 12px;
3203
+ line-height: 1.42857143;
3204
+ color: #777777;
3205
+ white-space: nowrap;
3206
+ }
3207
+ .dropdown-backdrop {
3208
+ position: fixed;
3209
+ left: 0;
3210
+ right: 0;
3211
+ bottom: 0;
3212
+ top: 0;
3213
+ z-index: 990;
3214
+ }
3215
+ .pull-right > .dropdown-menu {
3216
+ right: 0;
3217
+ left: auto;
3218
+ }
3219
+ .dropup .caret,
3220
+ .navbar-fixed-bottom .dropdown .caret {
3221
+ border-top: 0;
3222
+ border-bottom: 4px solid;
3223
+ content: "";
3224
+ }
3225
+ .dropup .dropdown-menu,
3226
+ .navbar-fixed-bottom .dropdown .dropdown-menu {
3227
+ top: auto;
3228
+ bottom: 100%;
3229
+ margin-bottom: 1px;
3230
+ }
3231
+ @media (min-width: 768px) {
3232
+ .navbar-right .dropdown-menu {
3233
+ left: auto;
3234
+ right: 0;
3235
+ }
3236
+ .navbar-right .dropdown-menu-left {
3237
+ left: 0;
3238
+ right: auto;
3239
+ }
3240
+ }
3241
+ .btn-group,
3242
+ .btn-group-vertical {
3243
+ position: relative;
3244
+ display: inline-block;
3245
+ vertical-align: middle;
3246
+ }
3247
+ .btn-group > .btn,
3248
+ .btn-group-vertical > .btn {
3249
+ position: relative;
3250
+ float: left;
3251
+ }
3252
+ .btn-group > .btn:hover,
3253
+ .btn-group-vertical > .btn:hover,
3254
+ .btn-group > .btn:focus,
3255
+ .btn-group-vertical > .btn:focus,
3256
+ .btn-group > .btn:active,
3257
+ .btn-group-vertical > .btn:active,
3258
+ .btn-group > .btn.active,
3259
+ .btn-group-vertical > .btn.active {
3260
+ z-index: 2;
3261
+ }
3262
+ .btn-group > .btn:focus,
3263
+ .btn-group-vertical > .btn:focus {
3264
+ outline: 0;
3265
+ }
3266
+ .btn-group .btn + .btn,
3267
+ .btn-group .btn + .btn-group,
3268
+ .btn-group .btn-group + .btn,
3269
+ .btn-group .btn-group + .btn-group {
3270
+ margin-left: -1px;
3271
+ }
3272
+ .btn-toolbar {
3273
+ margin-left: -5px;
3274
+ }
3275
+ .btn-toolbar .btn-group,
3276
+ .btn-toolbar .input-group {
3277
+ float: left;
3278
+ }
3279
+ .btn-toolbar > .btn,
3280
+ .btn-toolbar > .btn-group,
3281
+ .btn-toolbar > .input-group {
3282
+ margin-left: 5px;
3283
+ }
3284
+ .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
3285
+ border-radius: 0;
3286
+ }
3287
+ .btn-group > .btn:first-child {
3288
+ margin-left: 0;
3289
+ }
3290
+ .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
3291
+ border-bottom-right-radius: 0;
3292
+ border-top-right-radius: 0;
3293
+ }
3294
+ .btn-group > .btn:last-child:not(:first-child),
3295
+ .btn-group > .dropdown-toggle:not(:first-child) {
3296
+ border-bottom-left-radius: 0;
3297
+ border-top-left-radius: 0;
3298
+ }
3299
+ .btn-group > .btn-group {
3300
+ float: left;
3301
+ }
3302
+ .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
3303
+ border-radius: 0;
3304
+ }
3305
+ .btn-group > .btn-group:first-child > .btn:last-child,
3306
+ .btn-group > .btn-group:first-child > .dropdown-toggle {
3307
+ border-bottom-right-radius: 0;
3308
+ border-top-right-radius: 0;
3309
+ }
3310
+ .btn-group > .btn-group:last-child > .btn:first-child {
3311
+ border-bottom-left-radius: 0;
3312
+ border-top-left-radius: 0;
3313
+ }
3314
+ .btn-group .dropdown-toggle:active,
3315
+ .btn-group.open .dropdown-toggle {
3316
+ outline: 0;
3317
+ }
3318
+ .btn-group > .btn + .dropdown-toggle {
3319
+ padding-left: 8px;
3320
+ padding-right: 8px;
3321
+ }
3322
+ .btn-group > .btn-lg + .dropdown-toggle {
3323
+ padding-left: 12px;
3324
+ padding-right: 12px;
3325
+ }
3326
+ .btn-group.open .dropdown-toggle {
3327
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
3328
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
3329
+ }
3330
+ .btn-group.open .dropdown-toggle.btn-link {
3331
+ -webkit-box-shadow: none;
3332
+ box-shadow: none;
3333
+ }
3334
+ .btn .caret {
3335
+ margin-left: 0;
3336
+ }
3337
+ .btn-lg .caret {
3338
+ border-width: 5px 5px 0;
3339
+ border-bottom-width: 0;
3340
+ }
3341
+ .dropup .btn-lg .caret {
3342
+ border-width: 0 5px 5px;
3343
+ }
3344
+ .btn-group-vertical > .btn,
3345
+ .btn-group-vertical > .btn-group,
3346
+ .btn-group-vertical > .btn-group > .btn {
3347
+ display: block;
3348
+ float: none;
3349
+ width: 100%;
3350
+ max-width: 100%;
3351
+ }
3352
+ .btn-group-vertical > .btn-group > .btn {
3353
+ float: none;
3354
+ }
3355
+ .btn-group-vertical > .btn + .btn,
3356
+ .btn-group-vertical > .btn + .btn-group,
3357
+ .btn-group-vertical > .btn-group + .btn,
3358
+ .btn-group-vertical > .btn-group + .btn-group {
3359
+ margin-top: -1px;
3360
+ margin-left: 0;
3361
+ }
3362
+ .btn-group-vertical > .btn:not(:first-child):not(:last-child) {
3363
+ border-radius: 0;
3364
+ }
3365
+ .btn-group-vertical > .btn:first-child:not(:last-child) {
3366
+ border-top-right-radius: 4px;
3367
+ border-bottom-right-radius: 0;
3368
+ border-bottom-left-radius: 0;
3369
+ }
3370
+ .btn-group-vertical > .btn:last-child:not(:first-child) {
3371
+ border-bottom-left-radius: 4px;
3372
+ border-top-right-radius: 0;
3373
+ border-top-left-radius: 0;
3374
+ }
3375
+ .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
3376
+ border-radius: 0;
3377
+ }
3378
+ .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
3379
+ .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
3380
+ border-bottom-right-radius: 0;
3381
+ border-bottom-left-radius: 0;
3382
+ }
3383
+ .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
3384
+ border-top-right-radius: 0;
3385
+ border-top-left-radius: 0;
3386
+ }
3387
+ .btn-group-justified {
3388
+ display: table;
3389
+ width: 100%;
3390
+ table-layout: fixed;
3391
+ border-collapse: separate;
3392
+ }
3393
+ .btn-group-justified > .btn,
3394
+ .btn-group-justified > .btn-group {
3395
+ float: none;
3396
+ display: table-cell;
3397
+ width: 1%;
3398
+ }
3399
+ .btn-group-justified > .btn-group .btn {
3400
+ width: 100%;
3401
+ }
3402
+ .btn-group-justified > .btn-group .dropdown-menu {
3403
+ left: auto;
3404
+ }
3405
+ [data-toggle="buttons"] > .btn > input[type="radio"],
3406
+ [data-toggle="buttons"] > .btn > input[type="checkbox"] {
3407
+ position: absolute;
3408
+ z-index: -1;
3409
+ opacity: 0;
3410
+ filter: alpha(opacity=0);
3411
+ }
3412
+ .input-group {
3413
+ position: relative;
3414
+ display: table;
3415
+ border-collapse: separate;
3416
+ }
3417
+ .input-group[class*="col-"] {
3418
+ float: none;
3419
+ padding-left: 0;
3420
+ padding-right: 0;
3421
+ }
3422
+ .input-group .form-control {
3423
+ position: relative;
3424
+ z-index: 2;
3425
+ float: left;
3426
+ width: 100%;
3427
+ margin-bottom: 0;
3428
+ }
3429
+ .input-group-lg > .form-control,
3430
+ .input-group-lg > .input-group-addon,
3431
+ .input-group-lg > .input-group-btn > .btn {
3432
+ height: 46px;
3433
+ padding: 10px 16px;
3434
+ font-size: 18px;
3435
+ line-height: 1.33;
3436
+ border-radius: 6px;
3437
+ }
3438
+ select.input-group-lg > .form-control,
3439
+ select.input-group-lg > .input-group-addon,
3440
+ select.input-group-lg > .input-group-btn > .btn {
3441
+ height: 46px;
3442
+ line-height: 46px;
3443
+ }
3444
+ textarea.input-group-lg > .form-control,
3445
+ textarea.input-group-lg > .input-group-addon,
3446
+ textarea.input-group-lg > .input-group-btn > .btn,
3447
+ select[multiple].input-group-lg > .form-control,
3448
+ select[multiple].input-group-lg > .input-group-addon,
3449
+ select[multiple].input-group-lg > .input-group-btn > .btn {
3450
+ height: auto;
3451
+ }
3452
+ .input-group-sm > .form-control,
3453
+ .input-group-sm > .input-group-addon,
3454
+ .input-group-sm > .input-group-btn > .btn {
3455
+ height: 30px;
3456
+ padding: 5px 10px;
3457
+ font-size: 12px;
3458
+ line-height: 1.5;
3459
+ border-radius: 3px;
3460
+ }
3461
+ select.input-group-sm > .form-control,
3462
+ select.input-group-sm > .input-group-addon,
3463
+ select.input-group-sm > .input-group-btn > .btn {
3464
+ height: 30px;
3465
+ line-height: 30px;
3466
+ }
3467
+ textarea.input-group-sm > .form-control,
3468
+ textarea.input-group-sm > .input-group-addon,
3469
+ textarea.input-group-sm > .input-group-btn > .btn,
3470
+ select[multiple].input-group-sm > .form-control,
3471
+ select[multiple].input-group-sm > .input-group-addon,
3472
+ select[multiple].input-group-sm > .input-group-btn > .btn {
3473
+ height: auto;
3474
+ }
3475
+ .input-group-addon,
3476
+ .input-group-btn,
3477
+ .input-group .form-control {
3478
+ display: table-cell;
3479
+ }
3480
+ .input-group-addon:not(:first-child):not(:last-child),
3481
+ .input-group-btn:not(:first-child):not(:last-child),
3482
+ .input-group .form-control:not(:first-child):not(:last-child) {
3483
+ border-radius: 0;
3484
+ }
3485
+ .input-group-addon,
3486
+ .input-group-btn {
3487
+ width: 1%;
3488
+ white-space: nowrap;
3489
+ vertical-align: middle;
3490
+ }
3491
+ .input-group-addon {
3492
+ padding: 6px 12px;
3493
+ font-size: 14px;
3494
+ font-weight: normal;
3495
+ line-height: 1;
3496
+ color: #555555;
3497
+ text-align: center;
3498
+ background-color: #eeeeee;
3499
+ border: 1px solid #cccccc;
3500
+ border-radius: 4px;
3501
+ }
3502
+ .input-group-addon.input-sm {
3503
+ padding: 5px 10px;
3504
+ font-size: 12px;
3505
+ border-radius: 3px;
3506
+ }
3507
+ .input-group-addon.input-lg {
3508
+ padding: 10px 16px;
3509
+ font-size: 18px;
3510
+ border-radius: 6px;
3511
+ }
3512
+ .input-group-addon input[type="radio"],
3513
+ .input-group-addon input[type="checkbox"] {
3514
+ margin-top: 0;
3515
+ }
3516
+ .input-group .form-control:first-child,
3517
+ .input-group-addon:first-child,
3518
+ .input-group-btn:first-child > .btn,
3519
+ .input-group-btn:first-child > .btn-group > .btn,
3520
+ .input-group-btn:first-child > .dropdown-toggle,
3521
+ .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
3522
+ .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
3523
+ border-bottom-right-radius: 0;
3524
+ border-top-right-radius: 0;
3525
+ }
3526
+ .input-group-addon:first-child {
3527
+ border-right: 0;
3528
+ }
3529
+ .input-group .form-control:last-child,
3530
+ .input-group-addon:last-child,
3531
+ .input-group-btn:last-child > .btn,
3532
+ .input-group-btn:last-child > .btn-group > .btn,
3533
+ .input-group-btn:last-child > .dropdown-toggle,
3534
+ .input-group-btn:first-child > .btn:not(:first-child),
3535
+ .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
3536
+ border-bottom-left-radius: 0;
3537
+ border-top-left-radius: 0;
3538
+ }
3539
+ .input-group-addon:last-child {
3540
+ border-left: 0;
3541
+ }
3542
+ .input-group-btn {
3543
+ position: relative;
3544
+ font-size: 0;
3545
+ white-space: nowrap;
3546
+ }
3547
+ .input-group-btn > .btn {
3548
+ position: relative;
3549
+ }
3550
+ .input-group-btn > .btn + .btn {
3551
+ margin-left: -1px;
3552
+ }
3553
+ .input-group-btn > .btn:hover,
3554
+ .input-group-btn > .btn:focus,
3555
+ .input-group-btn > .btn:active {
3556
+ z-index: 2;
3557
+ }
3558
+ .input-group-btn:first-child > .btn,
3559
+ .input-group-btn:first-child > .btn-group {
3560
+ margin-right: -1px;
3561
+ }
3562
+ .input-group-btn:last-child > .btn,
3563
+ .input-group-btn:last-child > .btn-group {
3564
+ margin-left: -1px;
3565
+ }
3566
+ .nav {
3567
+ margin-bottom: 0;
3568
+ padding-left: 0;
3569
+ list-style: none;
3570
+ }
3571
+ .nav > li {
3572
+ position: relative;
3573
+ display: block;
3574
+ }
3575
+ .nav > li > a {
3576
+ position: relative;
3577
+ display: block;
3578
+ padding: 10px 15px;
3579
+ }
3580
+ .nav > li > a:hover,
3581
+ .nav > li > a:focus {
3582
+ text-decoration: none;
3583
+ background-color: #eeeeee;
3584
+ }
3585
+ .nav > li.disabled > a {
3586
+ color: #777777;
3587
+ }
3588
+ .nav > li.disabled > a:hover,
3589
+ .nav > li.disabled > a:focus {
3590
+ color: #777777;
3591
+ text-decoration: none;
3592
+ background-color: transparent;
3593
+ cursor: not-allowed;
3594
+ }
3595
+ .nav .open > a,
3596
+ .nav .open > a:hover,
3597
+ .nav .open > a:focus {
3598
+ background-color: #eeeeee;
3599
+ border-color: #428bca;
3600
+ }
3601
+ .nav .nav-divider {
3602
+ height: 1px;
3603
+ margin: 9px 0;
3604
+ overflow: hidden;
3605
+ background-color: #e5e5e5;
3606
+ }
3607
+ .nav > li > a > img {
3608
+ max-width: none;
3609
+ }
3610
+ .nav-tabs {
3611
+ border-bottom: 1px solid #dddddd;
3612
+ }
3613
+ .nav-tabs > li {
3614
+ float: left;
3615
+ margin-bottom: -1px;
3616
+ }
3617
+ .nav-tabs > li > a {
3618
+ margin-right: 2px;
3619
+ line-height: 1.42857143;
3620
+ border: 1px solid transparent;
3621
+ border-radius: 4px 4px 0 0;
3622
+ }
3623
+ .nav-tabs > li > a:hover {
3624
+ border-color: #eeeeee #eeeeee #dddddd;
3625
+ }
3626
+ .nav-tabs > li.active > a,
3627
+ .nav-tabs > li.active > a:hover,
3628
+ .nav-tabs > li.active > a:focus {
3629
+ color: #555555;
3630
+ background-color: #ffffff;
3631
+ border: 1px solid #dddddd;
3632
+ border-bottom-color: transparent;
3633
+ cursor: default;
3634
+ }
3635
+ .nav-tabs.nav-justified {
3636
+ width: 100%;
3637
+ border-bottom: 0;
3638
+ }
3639
+ .nav-tabs.nav-justified > li {
3640
+ float: none;
3641
+ }
3642
+ .nav-tabs.nav-justified > li > a {
3643
+ text-align: center;
3644
+ margin-bottom: 5px;
3645
+ }
3646
+ .nav-tabs.nav-justified > .dropdown .dropdown-menu {
3647
+ top: auto;
3648
+ left: auto;
3649
+ }
3650
+ @media (min-width: 768px) {
3651
+ .nav-tabs.nav-justified > li {
3652
+ display: table-cell;
3653
+ width: 1%;
3654
+ }
3655
+ .nav-tabs.nav-justified > li > a {
3656
+ margin-bottom: 0;
3657
+ }
3658
+ }
3659
+ .nav-tabs.nav-justified > li > a {
3660
+ margin-right: 0;
3661
+ border-radius: 4px;
3662
+ }
3663
+ .nav-tabs.nav-justified > .active > a,
3664
+ .nav-tabs.nav-justified > .active > a:hover,
3665
+ .nav-tabs.nav-justified > .active > a:focus {
3666
+ border: 1px solid #dddddd;
3667
+ }
3668
+ @media (min-width: 768px) {
3669
+ .nav-tabs.nav-justified > li > a {
3670
+ border-bottom: 1px solid #dddddd;
3671
+ border-radius: 4px 4px 0 0;
3672
+ }
3673
+ .nav-tabs.nav-justified > .active > a,
3674
+ .nav-tabs.nav-justified > .active > a:hover,
3675
+ .nav-tabs.nav-justified > .active > a:focus {
3676
+ border-bottom-color: #ffffff;
3677
+ }
3678
+ }
3679
+ .nav-pills > li {
3680
+ float: left;
3681
+ }
3682
+ .nav-pills > li > a {
3683
+ border-radius: 4px;
3684
+ }
3685
+ .nav-pills > li + li {
3686
+ margin-left: 2px;
3687
+ }
3688
+ .nav-pills > li.active > a,
3689
+ .nav-pills > li.active > a:hover,
3690
+ .nav-pills > li.active > a:focus {
3691
+ color: #ffffff;
3692
+ background-color: #428bca;
3693
+ }
3694
+ .nav-stacked > li {
3695
+ float: none;
3696
+ }
3697
+ .nav-stacked > li + li {
3698
+ margin-top: 2px;
3699
+ margin-left: 0;
3700
+ }
3701
+ .nav-justified {
3702
+ width: 100%;
3703
+ }
3704
+ .nav-justified > li {
3705
+ float: none;
3706
+ }
3707
+ .nav-justified > li > a {
3708
+ text-align: center;
3709
+ margin-bottom: 5px;
3710
+ }
3711
+ .nav-justified > .dropdown .dropdown-menu {
3712
+ top: auto;
3713
+ left: auto;
3714
+ }
3715
+ @media (min-width: 768px) {
3716
+ .nav-justified > li {
3717
+ display: table-cell;
3718
+ width: 1%;
3719
+ }
3720
+ .nav-justified > li > a {
3721
+ margin-bottom: 0;
3722
+ }
3723
+ }
3724
+ .nav-tabs-justified {
3725
+ border-bottom: 0;
3726
+ }
3727
+ .nav-tabs-justified > li > a {
3728
+ margin-right: 0;
3729
+ border-radius: 4px;
3730
+ }
3731
+ .nav-tabs-justified > .active > a,
3732
+ .nav-tabs-justified > .active > a:hover,
3733
+ .nav-tabs-justified > .active > a:focus {
3734
+ border: 1px solid #dddddd;
3735
+ }
3736
+ @media (min-width: 768px) {
3737
+ .nav-tabs-justified > li > a {
3738
+ border-bottom: 1px solid #dddddd;
3739
+ border-radius: 4px 4px 0 0;
3740
+ }
3741
+ .nav-tabs-justified > .active > a,
3742
+ .nav-tabs-justified > .active > a:hover,
3743
+ .nav-tabs-justified > .active > a:focus {
3744
+ border-bottom-color: #ffffff;
3745
+ }
3746
+ }
3747
+ .tab-content > .tab-pane {
3748
+ display: none;
3749
+ }
3750
+ .tab-content > .active {
3751
+ display: block;
3752
+ }
3753
+ .nav-tabs .dropdown-menu {
3754
+ margin-top: -1px;
3755
+ border-top-right-radius: 0;
3756
+ border-top-left-radius: 0;
3757
+ }
3758
+ .navbar {
3759
+ position: relative;
3760
+ min-height: 50px;
3761
+ margin-bottom: 20px;
3762
+ border: 1px solid transparent;
3763
+ }
3764
+ @media (min-width: 768px) {
3765
+ .navbar {
3766
+ border-radius: 4px;
3767
+ }
3768
+ }
3769
+ @media (min-width: 768px) {
3770
+ .navbar-header {
3771
+ float: left;
3772
+ }
3773
+ }
3774
+ .navbar-collapse {
3775
+ overflow-x: visible;
3776
+ padding-right: 15px;
3777
+ padding-left: 15px;
3778
+ border-top: 1px solid transparent;
3779
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
3780
+ -webkit-overflow-scrolling: touch;
3781
+ }
3782
+ .navbar-collapse.in {
3783
+ overflow-y: auto;
3784
+ }
3785
+ @media (min-width: 768px) {
3786
+ .navbar-collapse {
3787
+ width: auto;
3788
+ border-top: 0;
3789
+ box-shadow: none;
3790
+ }
3791
+ .navbar-collapse.collapse {
3792
+ display: block !important;
3793
+ height: auto !important;
3794
+ padding-bottom: 0;
3795
+ overflow: visible !important;
3796
+ }
3797
+ .navbar-collapse.in {
3798
+ overflow-y: visible;
3799
+ }
3800
+ .navbar-fixed-top .navbar-collapse,
3801
+ .navbar-static-top .navbar-collapse,
3802
+ .navbar-fixed-bottom .navbar-collapse {
3803
+ padding-left: 0;
3804
+ padding-right: 0;
3805
+ }
3806
+ }
3807
+ .navbar-fixed-top .navbar-collapse,
3808
+ .navbar-fixed-bottom .navbar-collapse {
3809
+ max-height: 340px;
3810
+ }
3811
+ @media (max-width: 480px) and (orientation: landscape) {
3812
+ .navbar-fixed-top .navbar-collapse,
3813
+ .navbar-fixed-bottom .navbar-collapse {
3814
+ max-height: 200px;
3815
+ }
3816
+ }
3817
+ .container > .navbar-header,
3818
+ .container-fluid > .navbar-header,
3819
+ .container > .navbar-collapse,
3820
+ .container-fluid > .navbar-collapse {
3821
+ margin-right: -15px;
3822
+ margin-left: -15px;
3823
+ }
3824
+ @media (min-width: 768px) {
3825
+ .container > .navbar-header,
3826
+ .container-fluid > .navbar-header,
3827
+ .container > .navbar-collapse,
3828
+ .container-fluid > .navbar-collapse {
3829
+ margin-right: 0;
3830
+ margin-left: 0;
3831
+ }
3832
+ }
3833
+ .navbar-static-top {
3834
+ z-index: 1000;
3835
+ border-width: 0 0 1px;
3836
+ }
3837
+ @media (min-width: 768px) {
3838
+ .navbar-static-top {
3839
+ border-radius: 0;
3840
+ }
3841
+ }
3842
+ .navbar-fixed-top,
3843
+ .navbar-fixed-bottom {
3844
+ position: fixed;
3845
+ right: 0;
3846
+ left: 0;
3847
+ z-index: 1030;
3848
+ -webkit-transform: translate3d(0, 0, 0);
3849
+ transform: translate3d(0, 0, 0);
3850
+ }
3851
+ @media (min-width: 768px) {
3852
+ .navbar-fixed-top,
3853
+ .navbar-fixed-bottom {
3854
+ border-radius: 0;
3855
+ }
3856
+ }
3857
+ .navbar-fixed-top {
3858
+ top: 0;
3859
+ border-width: 0 0 1px;
3860
+ }
3861
+ .navbar-fixed-bottom {
3862
+ bottom: 0;
3863
+ margin-bottom: 0;
3864
+ border-width: 1px 0 0;
3865
+ }
3866
+ .navbar-brand {
3867
+ float: left;
3868
+ padding: 15px 15px;
3869
+ font-size: 18px;
3870
+ line-height: 20px;
3871
+ height: 50px;
3872
+ }
3873
+ .navbar-brand:hover,
3874
+ .navbar-brand:focus {
3875
+ text-decoration: none;
3876
+ }
3877
+ @media (min-width: 768px) {
3878
+ .navbar > .container .navbar-brand,
3879
+ .navbar > .container-fluid .navbar-brand {
3880
+ margin-left: -15px;
3881
+ }
3882
+ }
3883
+ .navbar-toggle {
3884
+ position: relative;
3885
+ float: right;
3886
+ margin-right: 15px;
3887
+ padding: 9px 10px;
3888
+ margin-top: 8px;
3889
+ margin-bottom: 8px;
3890
+ background-color: transparent;
3891
+ background-image: none;
3892
+ border: 1px solid transparent;
3893
+ border-radius: 4px;
3894
+ }
3895
+ .navbar-toggle:focus {
3896
+ outline: 0;
3897
+ }
3898
+ .navbar-toggle .icon-bar {
3899
+ display: block;
3900
+ width: 22px;
3901
+ height: 2px;
3902
+ border-radius: 1px;
3903
+ }
3904
+ .navbar-toggle .icon-bar + .icon-bar {
3905
+ margin-top: 4px;
3906
+ }
3907
+ @media (min-width: 768px) {
3908
+ .navbar-toggle {
3909
+ display: none;
3910
+ }
3911
+ }
3912
+ .navbar-nav {
3913
+ margin: 7.5px -15px;
3914
+ }
3915
+ .navbar-nav > li > a {
3916
+ padding-top: 10px;
3917
+ padding-bottom: 10px;
3918
+ line-height: 20px;
3919
+ }
3920
+ @media (max-width: 767px) {
3921
+ .navbar-nav .open .dropdown-menu {
3922
+ position: static;
3923
+ float: none;
3924
+ width: auto;
3925
+ margin-top: 0;
3926
+ background-color: transparent;
3927
+ border: 0;
3928
+ box-shadow: none;
3929
+ }
3930
+ .navbar-nav .open .dropdown-menu > li > a,
3931
+ .navbar-nav .open .dropdown-menu .dropdown-header {
3932
+ padding: 5px 15px 5px 25px;
3933
+ }
3934
+ .navbar-nav .open .dropdown-menu > li > a {
3935
+ line-height: 20px;
3936
+ }
3937
+ .navbar-nav .open .dropdown-menu > li > a:hover,
3938
+ .navbar-nav .open .dropdown-menu > li > a:focus {
3939
+ background-image: none;
3940
+ }
3941
+ }
3942
+ @media (min-width: 768px) {
3943
+ .navbar-nav {
3944
+ float: left;
3945
+ margin: 0;
3946
+ }
3947
+ .navbar-nav > li {
3948
+ float: left;
3949
+ }
3950
+ .navbar-nav > li > a {
3951
+ padding-top: 15px;
3952
+ padding-bottom: 15px;
3953
+ }
3954
+ .navbar-nav.navbar-right:last-child {
3955
+ margin-right: -15px;
3956
+ }
3957
+ }
3958
+ @media (min-width: 768px) {
3959
+ .navbar-left {
3960
+ float: left !important;
3961
+ }
3962
+ .navbar-right {
3963
+ float: right !important;
3964
+ }
3965
+ }
3966
+ .navbar-form {
3967
+ margin-left: -15px;
3968
+ margin-right: -15px;
3969
+ padding: 10px 15px;
3970
+ border-top: 1px solid transparent;
3971
+ border-bottom: 1px solid transparent;
3972
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
3973
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
3974
+ margin-top: 8px;
3975
+ margin-bottom: 8px;
3976
+ }
3977
+ @media (min-width: 768px) {
3978
+ .navbar-form .form-group {
3979
+ display: inline-block;
3980
+ margin-bottom: 0;
3981
+ vertical-align: middle;
3982
+ }
3983
+ .navbar-form .form-control {
3984
+ display: inline-block;
3985
+ width: auto;
3986
+ vertical-align: middle;
3987
+ }
3988
+ .navbar-form .input-group {
3989
+ display: inline-table;
3990
+ vertical-align: middle;
3991
+ }
3992
+ .navbar-form .input-group .input-group-addon,
3993
+ .navbar-form .input-group .input-group-btn,
3994
+ .navbar-form .input-group .form-control {
3995
+ width: auto;
3996
+ }
3997
+ .navbar-form .input-group > .form-control {
3998
+ width: 100%;
3999
+ }
4000
+ .navbar-form .control-label {
4001
+ margin-bottom: 0;
4002
+ vertical-align: middle;
4003
+ }
4004
+ .navbar-form .radio,
4005
+ .navbar-form .checkbox {
4006
+ display: inline-block;
4007
+ margin-top: 0;
4008
+ margin-bottom: 0;
4009
+ vertical-align: middle;
4010
+ }
4011
+ .navbar-form .radio label,
4012
+ .navbar-form .checkbox label {
4013
+ padding-left: 0;
4014
+ }
4015
+ .navbar-form .radio input[type="radio"],
4016
+ .navbar-form .checkbox input[type="checkbox"] {
4017
+ position: relative;
4018
+ margin-left: 0;
4019
+ }
4020
+ .navbar-form .has-feedback .form-control-feedback {
4021
+ top: 0;
4022
+ }
4023
+ }
4024
+ @media (max-width: 767px) {
4025
+ .navbar-form .form-group {
4026
+ margin-bottom: 5px;
4027
+ }
4028
+ }
4029
+ @media (min-width: 768px) {
4030
+ .navbar-form {
4031
+ width: auto;
4032
+ border: 0;
4033
+ margin-left: 0;
4034
+ margin-right: 0;
4035
+ padding-top: 0;
4036
+ padding-bottom: 0;
4037
+ -webkit-box-shadow: none;
4038
+ box-shadow: none;
4039
+ }
4040
+ .navbar-form.navbar-right:last-child {
4041
+ margin-right: -15px;
4042
+ }
4043
+ }
4044
+ .navbar-nav > li > .dropdown-menu {
4045
+ margin-top: 0;
4046
+ border-top-right-radius: 0;
4047
+ border-top-left-radius: 0;
4048
+ }
4049
+ .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
4050
+ border-bottom-right-radius: 0;
4051
+ border-bottom-left-radius: 0;
4052
+ }
4053
+ .navbar-btn {
4054
+ margin-top: 8px;
4055
+ margin-bottom: 8px;
4056
+ }
4057
+ .navbar-btn.btn-sm {
4058
+ margin-top: 10px;
4059
+ margin-bottom: 10px;
4060
+ }
4061
+ .navbar-btn.btn-xs {
4062
+ margin-top: 14px;
4063
+ margin-bottom: 14px;
4064
+ }
4065
+ .navbar-text {
4066
+ margin-top: 15px;
4067
+ margin-bottom: 15px;
4068
+ }
4069
+ @media (min-width: 768px) {
4070
+ .navbar-text {
4071
+ float: left;
4072
+ margin-left: 15px;
4073
+ margin-right: 15px;
4074
+ }
4075
+ .navbar-text.navbar-right:last-child {
4076
+ margin-right: 0;
4077
+ }
4078
+ }
4079
+ .navbar-default {
4080
+ background-color: #f8f8f8;
4081
+ border-color: #e7e7e7;
4082
+ }
4083
+ .navbar-default .navbar-brand {
4084
+ color: #777777;
4085
+ }
4086
+ .navbar-default .navbar-brand:hover,
4087
+ .navbar-default .navbar-brand:focus {
4088
+ color: #5e5e5e;
4089
+ background-color: transparent;
4090
+ }
4091
+ .navbar-default .navbar-text {
4092
+ color: #777777;
4093
+ }
4094
+ .navbar-default .navbar-nav > li > a {
4095
+ color: #777777;
4096
+ }
4097
+ .navbar-default .navbar-nav > li > a:hover,
4098
+ .navbar-default .navbar-nav > li > a:focus {
4099
+ color: #333333;
4100
+ background-color: transparent;
4101
+ }
4102
+ .navbar-default .navbar-nav > .active > a,
4103
+ .navbar-default .navbar-nav > .active > a:hover,
4104
+ .navbar-default .navbar-nav > .active > a:focus {
4105
+ color: #555555;
4106
+ background-color: #e7e7e7;
4107
+ }
4108
+ .navbar-default .navbar-nav > .disabled > a,
4109
+ .navbar-default .navbar-nav > .disabled > a:hover,
4110
+ .navbar-default .navbar-nav > .disabled > a:focus {
4111
+ color: #cccccc;
4112
+ background-color: transparent;
4113
+ }
4114
+ .navbar-default .navbar-toggle {
4115
+ border-color: #dddddd;
4116
+ }
4117
+ .navbar-default .navbar-toggle:hover,
4118
+ .navbar-default .navbar-toggle:focus {
4119
+ background-color: #dddddd;
4120
+ }
4121
+ .navbar-default .navbar-toggle .icon-bar {
4122
+ background-color: #888888;
4123
+ }
4124
+ .navbar-default .navbar-collapse,
4125
+ .navbar-default .navbar-form {
4126
+ border-color: #e7e7e7;
4127
+ }
4128
+ .navbar-default .navbar-nav > .open > a,
4129
+ .navbar-default .navbar-nav > .open > a:hover,
4130
+ .navbar-default .navbar-nav > .open > a:focus {
4131
+ background-color: #e7e7e7;
4132
+ color: #555555;
4133
+ }
4134
+ @media (max-width: 767px) {
4135
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
4136
+ color: #777777;
4137
+ }
4138
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
4139
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
4140
+ color: #333333;
4141
+ background-color: transparent;
4142
+ }
4143
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
4144
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
4145
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
4146
+ color: #555555;
4147
+ background-color: #e7e7e7;
4148
+ }
4149
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
4150
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
4151
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
4152
+ color: #cccccc;
4153
+ background-color: transparent;
4154
+ }
4155
+ }
4156
+ .navbar-default .navbar-link {
4157
+ color: #777777;
4158
+ }
4159
+ .navbar-default .navbar-link:hover {
4160
+ color: #333333;
4161
+ }
4162
+ .navbar-default .btn-link {
4163
+ color: #777777;
4164
+ }
4165
+ .navbar-default .btn-link:hover,
4166
+ .navbar-default .btn-link:focus {
4167
+ color: #333333;
4168
+ }
4169
+ .navbar-default .btn-link[disabled]:hover,
4170
+ fieldset[disabled] .navbar-default .btn-link:hover,
4171
+ .navbar-default .btn-link[disabled]:focus,
4172
+ fieldset[disabled] .navbar-default .btn-link:focus {
4173
+ color: #cccccc;
4174
+ }
4175
+ .navbar-inverse {
4176
+ background-color: #222222;
4177
+ border-color: #080808;
4178
+ }
4179
+ .navbar-inverse .navbar-brand {
4180
+ color: #777777;
4181
+ }
4182
+ .navbar-inverse .navbar-brand:hover,
4183
+ .navbar-inverse .navbar-brand:focus {
4184
+ color: #ffffff;
4185
+ background-color: transparent;
4186
+ }
4187
+ .navbar-inverse .navbar-text {
4188
+ color: #777777;
4189
+ }
4190
+ .navbar-inverse .navbar-nav > li > a {
4191
+ color: #777777;
4192
+ }
4193
+ .navbar-inverse .navbar-nav > li > a:hover,
4194
+ .navbar-inverse .navbar-nav > li > a:focus {
4195
+ color: #ffffff;
4196
+ background-color: transparent;
4197
+ }
4198
+ .navbar-inverse .navbar-nav > .active > a,
4199
+ .navbar-inverse .navbar-nav > .active > a:hover,
4200
+ .navbar-inverse .navbar-nav > .active > a:focus {
4201
+ color: #ffffff;
4202
+ background-color: #080808;
4203
+ }
4204
+ .navbar-inverse .navbar-nav > .disabled > a,
4205
+ .navbar-inverse .navbar-nav > .disabled > a:hover,
4206
+ .navbar-inverse .navbar-nav > .disabled > a:focus {
4207
+ color: #444444;
4208
+ background-color: transparent;
4209
+ }
4210
+ .navbar-inverse .navbar-toggle {
4211
+ border-color: #333333;
4212
+ }
4213
+ .navbar-inverse .navbar-toggle:hover,
4214
+ .navbar-inverse .navbar-toggle:focus {
4215
+ background-color: #333333;
4216
+ }
4217
+ .navbar-inverse .navbar-toggle .icon-bar {
4218
+ background-color: #ffffff;
4219
+ }
4220
+ .navbar-inverse .navbar-collapse,
4221
+ .navbar-inverse .navbar-form {
4222
+ border-color: #101010;
4223
+ }
4224
+ .navbar-inverse .navbar-nav > .open > a,
4225
+ .navbar-inverse .navbar-nav > .open > a:hover,
4226
+ .navbar-inverse .navbar-nav > .open > a:focus {
4227
+ background-color: #080808;
4228
+ color: #ffffff;
4229
+ }
4230
+ @media (max-width: 767px) {
4231
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
4232
+ border-color: #080808;
4233
+ }
4234
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
4235
+ background-color: #080808;
4236
+ }
4237
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
4238
+ color: #777777;
4239
+ }
4240
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
4241
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
4242
+ color: #ffffff;
4243
+ background-color: transparent;
4244
+ }
4245
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
4246
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
4247
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
4248
+ color: #ffffff;
4249
+ background-color: #080808;
4250
+ }
4251
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
4252
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
4253
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
4254
+ color: #444444;
4255
+ background-color: transparent;
4256
+ }
4257
+ }
4258
+ .navbar-inverse .navbar-link {
4259
+ color: #777777;
4260
+ }
4261
+ .navbar-inverse .navbar-link:hover {
4262
+ color: #ffffff;
4263
+ }
4264
+ .navbar-inverse .btn-link {
4265
+ color: #777777;
4266
+ }
4267
+ .navbar-inverse .btn-link:hover,
4268
+ .navbar-inverse .btn-link:focus {
4269
+ color: #ffffff;
4270
+ }
4271
+ .navbar-inverse .btn-link[disabled]:hover,
4272
+ fieldset[disabled] .navbar-inverse .btn-link:hover,
4273
+ .navbar-inverse .btn-link[disabled]:focus,
4274
+ fieldset[disabled] .navbar-inverse .btn-link:focus {
4275
+ color: #444444;
4276
+ }
4277
+ .breadcrumb {
4278
+ padding: 8px 15px;
4279
+ margin-bottom: 20px;
4280
+ list-style: none;
4281
+ background-color: #f5f5f5;
4282
+ border-radius: 4px;
4283
+ }
4284
+ .breadcrumb > li {
4285
+ display: inline-block;
4286
+ }
4287
+ .breadcrumb > li + li:before {
4288
+ content: "/\00a0";
4289
+ padding: 0 5px;
4290
+ color: #cccccc;
4291
+ }
4292
+ .breadcrumb > .active {
4293
+ color: #777777;
4294
+ }
4295
+ .pagination {
4296
+ display: inline-block;
4297
+ padding-left: 0;
4298
+ margin: 20px 0;
4299
+ border-radius: 4px;
4300
+ }
4301
+ .pagination > li {
4302
+ display: inline;
4303
+ }
4304
+ .pagination > li > a,
4305
+ .pagination > li > span {
4306
+ position: relative;
4307
+ float: left;
4308
+ padding: 6px 12px;
4309
+ line-height: 1.42857143;
4310
+ text-decoration: none;
4311
+ color: #428bca;
4312
+ background-color: #ffffff;
4313
+ border: 1px solid #dddddd;
4314
+ margin-left: -1px;
4315
+ }
4316
+ .pagination > li:first-child > a,
4317
+ .pagination > li:first-child > span {
4318
+ margin-left: 0;
4319
+ border-bottom-left-radius: 4px;
4320
+ border-top-left-radius: 4px;
4321
+ }
4322
+ .pagination > li:last-child > a,
4323
+ .pagination > li:last-child > span {
4324
+ border-bottom-right-radius: 4px;
4325
+ border-top-right-radius: 4px;
4326
+ }
4327
+ .pagination > li > a:hover,
4328
+ .pagination > li > span:hover,
4329
+ .pagination > li > a:focus,
4330
+ .pagination > li > span:focus {
4331
+ color: #2a6496;
4332
+ background-color: #eeeeee;
4333
+ border-color: #dddddd;
4334
+ }
4335
+ .pagination > .active > a,
4336
+ .pagination > .active > span,
4337
+ .pagination > .active > a:hover,
4338
+ .pagination > .active > span:hover,
4339
+ .pagination > .active > a:focus,
4340
+ .pagination > .active > span:focus {
4341
+ z-index: 2;
4342
+ color: #ffffff;
4343
+ background-color: #428bca;
4344
+ border-color: #428bca;
4345
+ cursor: default;
4346
+ }
4347
+ .pagination > .disabled > span,
4348
+ .pagination > .disabled > span:hover,
4349
+ .pagination > .disabled > span:focus,
4350
+ .pagination > .disabled > a,
4351
+ .pagination > .disabled > a:hover,
4352
+ .pagination > .disabled > a:focus {
4353
+ color: #777777;
4354
+ background-color: #ffffff;
4355
+ border-color: #dddddd;
4356
+ cursor: not-allowed;
4357
+ }
4358
+ .pagination-lg > li > a,
4359
+ .pagination-lg > li > span {
4360
+ padding: 10px 16px;
4361
+ font-size: 18px;
4362
+ }
4363
+ .pagination-lg > li:first-child > a,
4364
+ .pagination-lg > li:first-child > span {
4365
+ border-bottom-left-radius: 6px;
4366
+ border-top-left-radius: 6px;
4367
+ }
4368
+ .pagination-lg > li:last-child > a,
4369
+ .pagination-lg > li:last-child > span {
4370
+ border-bottom-right-radius: 6px;
4371
+ border-top-right-radius: 6px;
4372
+ }
4373
+ .pagination-sm > li > a,
4374
+ .pagination-sm > li > span {
4375
+ padding: 5px 10px;
4376
+ font-size: 12px;
4377
+ }
4378
+ .pagination-sm > li:first-child > a,
4379
+ .pagination-sm > li:first-child > span {
4380
+ border-bottom-left-radius: 3px;
4381
+ border-top-left-radius: 3px;
4382
+ }
4383
+ .pagination-sm > li:last-child > a,
4384
+ .pagination-sm > li:last-child > span {
4385
+ border-bottom-right-radius: 3px;
4386
+ border-top-right-radius: 3px;
4387
+ }
4388
+ .pager {
4389
+ padding-left: 0;
4390
+ margin: 20px 0;
4391
+ list-style: none;
4392
+ text-align: center;
4393
+ }
4394
+ .pager li {
4395
+ display: inline;
4396
+ }
4397
+ .pager li > a,
4398
+ .pager li > span {
4399
+ display: inline-block;
4400
+ padding: 5px 14px;
4401
+ background-color: #ffffff;
4402
+ border: 1px solid #dddddd;
4403
+ border-radius: 15px;
4404
+ }
4405
+ .pager li > a:hover,
4406
+ .pager li > a:focus {
4407
+ text-decoration: none;
4408
+ background-color: #eeeeee;
4409
+ }
4410
+ .pager .next > a,
4411
+ .pager .next > span {
4412
+ float: right;
4413
+ }
4414
+ .pager .previous > a,
4415
+ .pager .previous > span {
4416
+ float: left;
4417
+ }
4418
+ .pager .disabled > a,
4419
+ .pager .disabled > a:hover,
4420
+ .pager .disabled > a:focus,
4421
+ .pager .disabled > span {
4422
+ color: #777777;
4423
+ background-color: #ffffff;
4424
+ cursor: not-allowed;
4425
+ }
4426
+ .label {
4427
+ display: inline;
4428
+ padding: .2em .6em .3em;
4429
+ font-size: 75%;
4430
+ font-weight: bold;
4431
+ line-height: 1;
4432
+ color: #ffffff;
4433
+ text-align: center;
4434
+ white-space: nowrap;
4435
+ vertical-align: baseline;
4436
+ border-radius: .25em;
4437
+ }
4438
+ a.label:hover,
4439
+ a.label:focus {
4440
+ color: #ffffff;
4441
+ text-decoration: none;
4442
+ cursor: pointer;
4443
+ }
4444
+ .label:empty {
4445
+ display: none;
4446
+ }
4447
+ .btn .label {
4448
+ position: relative;
4449
+ top: -1px;
4450
+ }
4451
+ .label-default {
4452
+ background-color: #777777;
4453
+ }
4454
+ .label-default[href]:hover,
4455
+ .label-default[href]:focus {
4456
+ background-color: #5e5e5e;
4457
+ }
4458
+ .label-primary {
4459
+ background-color: #428bca;
4460
+ }
4461
+ .label-primary[href]:hover,
4462
+ .label-primary[href]:focus {
4463
+ background-color: #3071a9;
4464
+ }
4465
+ .label-success {
4466
+ background-color: #5cb85c;
4467
+ }
4468
+ .label-success[href]:hover,
4469
+ .label-success[href]:focus {
4470
+ background-color: #449d44;
4471
+ }
4472
+ .label-info {
4473
+ background-color: #5bc0de;
4474
+ }
4475
+ .label-info[href]:hover,
4476
+ .label-info[href]:focus {
4477
+ background-color: #31b0d5;
4478
+ }
4479
+ .label-warning {
4480
+ background-color: #f0ad4e;
4481
+ }
4482
+ .label-warning[href]:hover,
4483
+ .label-warning[href]:focus {
4484
+ background-color: #ec971f;
4485
+ }
4486
+ .label-danger {
4487
+ background-color: #d9534f;
4488
+ }
4489
+ .label-danger[href]:hover,
4490
+ .label-danger[href]:focus {
4491
+ background-color: #c9302c;
4492
+ }
4493
+ .badge {
4494
+ display: inline-block;
4495
+ min-width: 10px;
4496
+ padding: 3px 7px;
4497
+ font-size: 12px;
4498
+ font-weight: bold;
4499
+ color: #ffffff;
4500
+ line-height: 1;
4501
+ vertical-align: baseline;
4502
+ white-space: nowrap;
4503
+ text-align: center;
4504
+ background-color: #777777;
4505
+ border-radius: 10px;
4506
+ }
4507
+ .badge:empty {
4508
+ display: none;
4509
+ }
4510
+ .btn .badge {
4511
+ position: relative;
4512
+ top: -1px;
4513
+ }
4514
+ .btn-xs .badge {
4515
+ top: 0;
4516
+ padding: 1px 5px;
4517
+ }
4518
+ a.badge:hover,
4519
+ a.badge:focus {
4520
+ color: #ffffff;
4521
+ text-decoration: none;
4522
+ cursor: pointer;
4523
+ }
4524
+ a.list-group-item.active > .badge,
4525
+ .nav-pills > .active > a > .badge {
4526
+ color: #428bca;
4527
+ background-color: #ffffff;
4528
+ }
4529
+ .nav-pills > li > a > .badge {
4530
+ margin-left: 3px;
4531
+ }
4532
+ .jumbotron {
4533
+ padding: 30px;
4534
+ margin-bottom: 30px;
4535
+ color: inherit;
4536
+ background-color: #eeeeee;
4537
+ }
4538
+ .jumbotron h1,
4539
+ .jumbotron .h1 {
4540
+ color: inherit;
4541
+ }
4542
+ .jumbotron p {
4543
+ margin-bottom: 15px;
4544
+ font-size: 21px;
4545
+ font-weight: 200;
4546
+ }
4547
+ .jumbotron > hr {
4548
+ border-top-color: #d5d5d5;
4549
+ }
4550
+ .container .jumbotron {
4551
+ border-radius: 6px;
4552
+ }
4553
+ .jumbotron .container {
4554
+ max-width: 100%;
4555
+ }
4556
+ @media screen and (min-width: 768px) {
4557
+ .jumbotron {
4558
+ padding-top: 48px;
4559
+ padding-bottom: 48px;
4560
+ }
4561
+ .container .jumbotron {
4562
+ padding-left: 60px;
4563
+ padding-right: 60px;
4564
+ }
4565
+ .jumbotron h1,
4566
+ .jumbotron .h1 {
4567
+ font-size: 63px;
4568
+ }
4569
+ }
4570
+ .thumbnail {
4571
+ display: block;
4572
+ padding: 4px;
4573
+ margin-bottom: 20px;
4574
+ line-height: 1.42857143;
4575
+ background-color: #ffffff;
4576
+ border: 1px solid #dddddd;
4577
+ border-radius: 4px;
4578
+ -webkit-transition: all 0.2s ease-in-out;
4579
+ -o-transition: all 0.2s ease-in-out;
4580
+ transition: all 0.2s ease-in-out;
4581
+ }
4582
+ .thumbnail > img,
4583
+ .thumbnail a > img {
4584
+ margin-left: auto;
4585
+ margin-right: auto;
4586
+ }
4587
+ a.thumbnail:hover,
4588
+ a.thumbnail:focus,
4589
+ a.thumbnail.active {
4590
+ border-color: #428bca;
4591
+ }
4592
+ .thumbnail .caption {
4593
+ padding: 9px;
4594
+ color: #333333;
4595
+ }
4596
+ .alert {
4597
+ padding: 15px;
4598
+ margin-bottom: 20px;
4599
+ border: 1px solid transparent;
4600
+ border-radius: 4px;
4601
+ }
4602
+ .alert h4 {
4603
+ margin-top: 0;
4604
+ color: inherit;
4605
+ }
4606
+ .alert .alert-link {
4607
+ font-weight: bold;
4608
+ }
4609
+ .alert > p,
4610
+ .alert > ul {
4611
+ margin-bottom: 0;
4612
+ }
4613
+ .alert > p + p {
4614
+ margin-top: 5px;
4615
+ }
4616
+ .alert-dismissable,
4617
+ .alert-dismissible {
4618
+ padding-right: 35px;
4619
+ }
4620
+ .alert-dismissable .close,
4621
+ .alert-dismissible .close {
4622
+ position: relative;
4623
+ top: -2px;
4624
+ right: -21px;
4625
+ color: inherit;
4626
+ }
4627
+ .alert-success {
4628
+ background-color: #dff0d8;
4629
+ border-color: #d6e9c6;
4630
+ color: #3c763d;
4631
+ }
4632
+ .alert-success hr {
4633
+ border-top-color: #c9e2b3;
4634
+ }
4635
+ .alert-success .alert-link {
4636
+ color: #2b542c;
4637
+ }
4638
+ .alert-info {
4639
+ background-color: #d9edf7;
4640
+ border-color: #bce8f1;
4641
+ color: #31708f;
4642
+ }
4643
+ .alert-info hr {
4644
+ border-top-color: #a6e1ec;
4645
+ }
4646
+ .alert-info .alert-link {
4647
+ color: #245269;
4648
+ }
4649
+ .alert-warning {
4650
+ background-color: #fcf8e3;
4651
+ border-color: #faebcc;
4652
+ color: #8a6d3b;
4653
+ }
4654
+ .alert-warning hr {
4655
+ border-top-color: #f7e1b5;
4656
+ }
4657
+ .alert-warning .alert-link {
4658
+ color: #66512c;
4659
+ }
4660
+ .alert-danger {
4661
+ background-color: #f2dede;
4662
+ border-color: #ebccd1;
4663
+ color: #a94442;
4664
+ }
4665
+ .alert-danger hr {
4666
+ border-top-color: #e4b9c0;
4667
+ }
4668
+ .alert-danger .alert-link {
4669
+ color: #843534;
4670
+ }
4671
+ @-webkit-keyframes progress-bar-stripes {
4672
+ from {
4673
+ background-position: 40px 0;
4674
+ }
4675
+ to {
4676
+ background-position: 0 0;
4677
+ }
4678
+ }
4679
+ @keyframes progress-bar-stripes {
4680
+ from {
4681
+ background-position: 40px 0;
4682
+ }
4683
+ to {
4684
+ background-position: 0 0;
4685
+ }
4686
+ }
4687
+ .progress {
4688
+ overflow: hidden;
4689
+ height: 20px;
4690
+ margin-bottom: 20px;
4691
+ background-color: #f5f5f5;
4692
+ border-radius: 4px;
4693
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4694
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4695
+ }
4696
+ .progress-bar {
4697
+ float: left;
4698
+ width: 0%;
4699
+ height: 100%;
4700
+ font-size: 12px;
4701
+ line-height: 20px;
4702
+ color: #ffffff;
4703
+ text-align: center;
4704
+ background-color: #428bca;
4705
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4706
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4707
+ -webkit-transition: width 0.6s ease;
4708
+ -o-transition: width 0.6s ease;
4709
+ transition: width 0.6s ease;
4710
+ }
4711
+ .progress-striped .progress-bar,
4712
+ .progress-bar-striped {
4713
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4714
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4715
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4716
+ background-size: 40px 40px;
4717
+ }
4718
+ .progress.active .progress-bar,
4719
+ .progress-bar.active {
4720
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
4721
+ -o-animation: progress-bar-stripes 2s linear infinite;
4722
+ animation: progress-bar-stripes 2s linear infinite;
4723
+ }
4724
+ .progress-bar[aria-valuenow="1"],
4725
+ .progress-bar[aria-valuenow="2"] {
4726
+ min-width: 30px;
4727
+ }
4728
+ .progress-bar[aria-valuenow="0"] {
4729
+ color: #777777;
4730
+ min-width: 30px;
4731
+ background-color: transparent;
4732
+ background-image: none;
4733
+ box-shadow: none;
4734
+ }
4735
+ .progress-bar-success {
4736
+ background-color: #5cb85c;
4737
+ }
4738
+ .progress-striped .progress-bar-success {
4739
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4740
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4741
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4742
+ }
4743
+ .progress-bar-info {
4744
+ background-color: #5bc0de;
4745
+ }
4746
+ .progress-striped .progress-bar-info {
4747
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4748
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4749
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4750
+ }
4751
+ .progress-bar-warning {
4752
+ background-color: #f0ad4e;
4753
+ }
4754
+ .progress-striped .progress-bar-warning {
4755
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4756
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4757
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4758
+ }
4759
+ .progress-bar-danger {
4760
+ background-color: #d9534f;
4761
+ }
4762
+ .progress-striped .progress-bar-danger {
4763
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4764
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4765
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4766
+ }
4767
+ .media,
4768
+ .media-body {
4769
+ overflow: hidden;
4770
+ zoom: 1;
4771
+ }
4772
+ .media,
4773
+ .media .media {
4774
+ margin-top: 15px;
4775
+ }
4776
+ .media:first-child {
4777
+ margin-top: 0;
4778
+ }
4779
+ .media-object {
4780
+ display: block;
4781
+ }
4782
+ .media-heading {
4783
+ margin: 0 0 5px;
4784
+ }
4785
+ .media > .pull-left {
4786
+ margin-right: 10px;
4787
+ }
4788
+ .media > .pull-right {
4789
+ margin-left: 10px;
4790
+ }
4791
+ .media-list {
4792
+ padding-left: 0;
4793
+ list-style: none;
4794
+ }
4795
+ .list-group {
4796
+ margin-bottom: 20px;
4797
+ padding-left: 0;
4798
+ }
4799
+ .list-group-item {
4800
+ position: relative;
4801
+ display: block;
4802
+ padding: 10px 15px;
4803
+ margin-bottom: -1px;
4804
+ background-color: #ffffff;
4805
+ border: 1px solid #dddddd;
4806
+ }
4807
+ .list-group-item:first-child {
4808
+ border-top-right-radius: 4px;
4809
+ border-top-left-radius: 4px;
4810
+ }
4811
+ .list-group-item:last-child {
4812
+ margin-bottom: 0;
4813
+ border-bottom-right-radius: 4px;
4814
+ border-bottom-left-radius: 4px;
4815
+ }
4816
+ .list-group-item > .badge {
4817
+ float: right;
4818
+ }
4819
+ .list-group-item > .badge + .badge {
4820
+ margin-right: 5px;
4821
+ }
4822
+ a.list-group-item {
4823
+ color: #555555;
4824
+ }
4825
+ a.list-group-item .list-group-item-heading {
4826
+ color: #333333;
4827
+ }
4828
+ a.list-group-item:hover,
4829
+ a.list-group-item:focus {
4830
+ text-decoration: none;
4831
+ color: #555555;
4832
+ background-color: #f5f5f5;
4833
+ }
4834
+ .list-group-item.disabled,
4835
+ .list-group-item.disabled:hover,
4836
+ .list-group-item.disabled:focus {
4837
+ background-color: #eeeeee;
4838
+ color: #777777;
4839
+ }
4840
+ .list-group-item.disabled .list-group-item-heading,
4841
+ .list-group-item.disabled:hover .list-group-item-heading,
4842
+ .list-group-item.disabled:focus .list-group-item-heading {
4843
+ color: inherit;
4844
+ }
4845
+ .list-group-item.disabled .list-group-item-text,
4846
+ .list-group-item.disabled:hover .list-group-item-text,
4847
+ .list-group-item.disabled:focus .list-group-item-text {
4848
+ color: #777777;
4849
+ }
4850
+ .list-group-item.active,
4851
+ .list-group-item.active:hover,
4852
+ .list-group-item.active:focus {
4853
+ z-index: 2;
4854
+ color: #ffffff;
4855
+ background-color: #428bca;
4856
+ border-color: #428bca;
4857
+ }
4858
+ .list-group-item.active .list-group-item-heading,
4859
+ .list-group-item.active:hover .list-group-item-heading,
4860
+ .list-group-item.active:focus .list-group-item-heading,
4861
+ .list-group-item.active .list-group-item-heading > small,
4862
+ .list-group-item.active:hover .list-group-item-heading > small,
4863
+ .list-group-item.active:focus .list-group-item-heading > small,
4864
+ .list-group-item.active .list-group-item-heading > .small,
4865
+ .list-group-item.active:hover .list-group-item-heading > .small,
4866
+ .list-group-item.active:focus .list-group-item-heading > .small {
4867
+ color: inherit;
4868
+ }
4869
+ .list-group-item.active .list-group-item-text,
4870
+ .list-group-item.active:hover .list-group-item-text,
4871
+ .list-group-item.active:focus .list-group-item-text {
4872
+ color: #e1edf7;
4873
+ }
4874
+ .list-group-item-success {
4875
+ color: #3c763d;
4876
+ background-color: #dff0d8;
4877
+ }
4878
+ a.list-group-item-success {
4879
+ color: #3c763d;
4880
+ }
4881
+ a.list-group-item-success .list-group-item-heading {
4882
+ color: inherit;
4883
+ }
4884
+ a.list-group-item-success:hover,
4885
+ a.list-group-item-success:focus {
4886
+ color: #3c763d;
4887
+ background-color: #d0e9c6;
4888
+ }
4889
+ a.list-group-item-success.active,
4890
+ a.list-group-item-success.active:hover,
4891
+ a.list-group-item-success.active:focus {
4892
+ color: #fff;
4893
+ background-color: #3c763d;
4894
+ border-color: #3c763d;
4895
+ }
4896
+ .list-group-item-info {
4897
+ color: #31708f;
4898
+ background-color: #d9edf7;
4899
+ }
4900
+ a.list-group-item-info {
4901
+ color: #31708f;
4902
+ }
4903
+ a.list-group-item-info .list-group-item-heading {
4904
+ color: inherit;
4905
+ }
4906
+ a.list-group-item-info:hover,
4907
+ a.list-group-item-info:focus {
4908
+ color: #31708f;
4909
+ background-color: #c4e3f3;
4910
+ }
4911
+ a.list-group-item-info.active,
4912
+ a.list-group-item-info.active:hover,
4913
+ a.list-group-item-info.active:focus {
4914
+ color: #fff;
4915
+ background-color: #31708f;
4916
+ border-color: #31708f;
4917
+ }
4918
+ .list-group-item-warning {
4919
+ color: #8a6d3b;
4920
+ background-color: #fcf8e3;
4921
+ }
4922
+ a.list-group-item-warning {
4923
+ color: #8a6d3b;
4924
+ }
4925
+ a.list-group-item-warning .list-group-item-heading {
4926
+ color: inherit;
4927
+ }
4928
+ a.list-group-item-warning:hover,
4929
+ a.list-group-item-warning:focus {
4930
+ color: #8a6d3b;
4931
+ background-color: #faf2cc;
4932
+ }
4933
+ a.list-group-item-warning.active,
4934
+ a.list-group-item-warning.active:hover,
4935
+ a.list-group-item-warning.active:focus {
4936
+ color: #fff;
4937
+ background-color: #8a6d3b;
4938
+ border-color: #8a6d3b;
4939
+ }
4940
+ .list-group-item-danger {
4941
+ color: #a94442;
4942
+ background-color: #f2dede;
4943
+ }
4944
+ a.list-group-item-danger {
4945
+ color: #a94442;
4946
+ }
4947
+ a.list-group-item-danger .list-group-item-heading {
4948
+ color: inherit;
4949
+ }
4950
+ a.list-group-item-danger:hover,
4951
+ a.list-group-item-danger:focus {
4952
+ color: #a94442;
4953
+ background-color: #ebcccc;
4954
+ }
4955
+ a.list-group-item-danger.active,
4956
+ a.list-group-item-danger.active:hover,
4957
+ a.list-group-item-danger.active:focus {
4958
+ color: #fff;
4959
+ background-color: #a94442;
4960
+ border-color: #a94442;
4961
+ }
4962
+ .list-group-item-heading {
4963
+ margin-top: 0;
4964
+ margin-bottom: 5px;
4965
+ }
4966
+ .list-group-item-text {
4967
+ margin-bottom: 0;
4968
+ line-height: 1.3;
4969
+ }
4970
+ .panel {
4971
+ margin-bottom: 20px;
4972
+ background-color: #ffffff;
4973
+ border: 1px solid transparent;
4974
+ border-radius: 4px;
4975
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
4976
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
4977
+ }
4978
+ .panel-body {
4979
+ padding: 15px;
4980
+ }
4981
+ .panel-heading {
4982
+ padding: 10px 15px;
4983
+ border-bottom: 1px solid transparent;
4984
+ border-top-right-radius: 3px;
4985
+ border-top-left-radius: 3px;
4986
+ }
4987
+ .panel-heading > .dropdown .dropdown-toggle {
4988
+ color: inherit;
4989
+ }
4990
+ .panel-title {
4991
+ margin-top: 0;
4992
+ margin-bottom: 0;
4993
+ font-size: 16px;
4994
+ color: inherit;
4995
+ }
4996
+ .panel-title > a {
4997
+ color: inherit;
4998
+ }
4999
+ .panel-footer {
5000
+ padding: 10px 15px;
5001
+ background-color: #f5f5f5;
5002
+ border-top: 1px solid #dddddd;
5003
+ border-bottom-right-radius: 3px;
5004
+ border-bottom-left-radius: 3px;
5005
+ }
5006
+ .panel > .list-group {
5007
+ margin-bottom: 0;
5008
+ }
5009
+ .panel > .list-group .list-group-item {
5010
+ border-width: 1px 0;
5011
+ border-radius: 0;
5012
+ }
5013
+ .panel > .list-group:first-child .list-group-item:first-child {
5014
+ border-top: 0;
5015
+ border-top-right-radius: 3px;
5016
+ border-top-left-radius: 3px;
5017
+ }
5018
+ .panel > .list-group:last-child .list-group-item:last-child {
5019
+ border-bottom: 0;
5020
+ border-bottom-right-radius: 3px;
5021
+ border-bottom-left-radius: 3px;
5022
+ }
5023
+ .panel-heading + .list-group .list-group-item:first-child {
5024
+ border-top-width: 0;
5025
+ }
5026
+ .list-group + .panel-footer {
5027
+ border-top-width: 0;
5028
+ }
5029
+ .panel > .table,
5030
+ .panel > .table-responsive > .table,
5031
+ .panel > .panel-collapse > .table {
5032
+ margin-bottom: 0;
5033
+ }
5034
+ .panel > .table:first-child,
5035
+ .panel > .table-responsive:first-child > .table:first-child {
5036
+ border-top-right-radius: 3px;
5037
+ border-top-left-radius: 3px;
5038
+ }
5039
+ .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
5040
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
5041
+ .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
5042
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
5043
+ .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
5044
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
5045
+ .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
5046
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
5047
+ border-top-left-radius: 3px;
5048
+ }
5049
+ .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
5050
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
5051
+ .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
5052
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
5053
+ .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
5054
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
5055
+ .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
5056
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
5057
+ border-top-right-radius: 3px;
5058
+ }
5059
+ .panel > .table:last-child,
5060
+ .panel > .table-responsive:last-child > .table:last-child {
5061
+ border-bottom-right-radius: 3px;
5062
+ border-bottom-left-radius: 3px;
5063
+ }
5064
+ .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
5065
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
5066
+ .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
5067
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
5068
+ .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
5069
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
5070
+ .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
5071
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
5072
+ border-bottom-left-radius: 3px;
5073
+ }
5074
+ .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
5075
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
5076
+ .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
5077
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
5078
+ .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
5079
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
5080
+ .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
5081
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
5082
+ border-bottom-right-radius: 3px;
5083
+ }
5084
+ .panel > .panel-body + .table,
5085
+ .panel > .panel-body + .table-responsive {
5086
+ border-top: 1px solid #dddddd;
5087
+ }
5088
+ .panel > .table > tbody:first-child > tr:first-child th,
5089
+ .panel > .table > tbody:first-child > tr:first-child td {
5090
+ border-top: 0;
5091
+ }
5092
+ .panel > .table-bordered,
5093
+ .panel > .table-responsive > .table-bordered {
5094
+ border: 0;
5095
+ }
5096
+ .panel > .table-bordered > thead > tr > th:first-child,
5097
+ .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
5098
+ .panel > .table-bordered > tbody > tr > th:first-child,
5099
+ .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
5100
+ .panel > .table-bordered > tfoot > tr > th:first-child,
5101
+ .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
5102
+ .panel > .table-bordered > thead > tr > td:first-child,
5103
+ .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
5104
+ .panel > .table-bordered > tbody > tr > td:first-child,
5105
+ .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
5106
+ .panel > .table-bordered > tfoot > tr > td:first-child,
5107
+ .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
5108
+ border-left: 0;
5109
+ }
5110
+ .panel > .table-bordered > thead > tr > th:last-child,
5111
+ .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
5112
+ .panel > .table-bordered > tbody > tr > th:last-child,
5113
+ .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
5114
+ .panel > .table-bordered > tfoot > tr > th:last-child,
5115
+ .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
5116
+ .panel > .table-bordered > thead > tr > td:last-child,
5117
+ .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
5118
+ .panel > .table-bordered > tbody > tr > td:last-child,
5119
+ .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
5120
+ .panel > .table-bordered > tfoot > tr > td:last-child,
5121
+ .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
5122
+ border-right: 0;
5123
+ }
5124
+ .panel > .table-bordered > thead > tr:first-child > td,
5125
+ .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
5126
+ .panel > .table-bordered > tbody > tr:first-child > td,
5127
+ .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
5128
+ .panel > .table-bordered > thead > tr:first-child > th,
5129
+ .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
5130
+ .panel > .table-bordered > tbody > tr:first-child > th,
5131
+ .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
5132
+ border-bottom: 0;
5133
+ }
5134
+ .panel > .table-bordered > tbody > tr:last-child > td,
5135
+ .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
5136
+ .panel > .table-bordered > tfoot > tr:last-child > td,
5137
+ .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
5138
+ .panel > .table-bordered > tbody > tr:last-child > th,
5139
+ .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
5140
+ .panel > .table-bordered > tfoot > tr:last-child > th,
5141
+ .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
5142
+ border-bottom: 0;
5143
+ }
5144
+ .panel > .table-responsive {
5145
+ border: 0;
5146
+ margin-bottom: 0;
5147
+ }
5148
+ .panel-group {
5149
+ margin-bottom: 20px;
5150
+ }
5151
+ .panel-group .panel {
5152
+ margin-bottom: 0;
5153
+ border-radius: 4px;
5154
+ }
5155
+ .panel-group .panel + .panel {
5156
+ margin-top: 5px;
5157
+ }
5158
+ .panel-group .panel-heading {
5159
+ border-bottom: 0;
5160
+ }
5161
+ .panel-group .panel-heading + .panel-collapse > .panel-body {
5162
+ border-top: 1px solid #dddddd;
5163
+ }
5164
+ .panel-group .panel-footer {
5165
+ border-top: 0;
5166
+ }
5167
+ .panel-group .panel-footer + .panel-collapse .panel-body {
5168
+ border-bottom: 1px solid #dddddd;
5169
+ }
5170
+ .panel-default {
5171
+ border-color: #dddddd;
5172
+ }
5173
+ .panel-default > .panel-heading {
5174
+ color: #333333;
5175
+ background-color: #f5f5f5;
5176
+ border-color: #dddddd;
5177
+ }
5178
+ .panel-default > .panel-heading + .panel-collapse > .panel-body {
5179
+ border-top-color: #dddddd;
5180
+ }
5181
+ .panel-default > .panel-heading .badge {
5182
+ color: #f5f5f5;
5183
+ background-color: #333333;
5184
+ }
5185
+ .panel-default > .panel-footer + .panel-collapse > .panel-body {
5186
+ border-bottom-color: #dddddd;
5187
+ }
5188
+ .panel-primary {
5189
+ border-color: #428bca;
5190
+ }
5191
+ .panel-primary > .panel-heading {
5192
+ color: #ffffff;
5193
+ background-color: #428bca;
5194
+ border-color: #428bca;
5195
+ }
5196
+ .panel-primary > .panel-heading + .panel-collapse > .panel-body {
5197
+ border-top-color: #428bca;
5198
+ }
5199
+ .panel-primary > .panel-heading .badge {
5200
+ color: #428bca;
5201
+ background-color: #ffffff;
5202
+ }
5203
+ .panel-primary > .panel-footer + .panel-collapse > .panel-body {
5204
+ border-bottom-color: #428bca;
5205
+ }
5206
+ .panel-success {
5207
+ border-color: #d6e9c6;
5208
+ }
5209
+ .panel-success > .panel-heading {
5210
+ color: #3c763d;
5211
+ background-color: #dff0d8;
5212
+ border-color: #d6e9c6;
5213
+ }
5214
+ .panel-success > .panel-heading + .panel-collapse > .panel-body {
5215
+ border-top-color: #d6e9c6;
5216
+ }
5217
+ .panel-success > .panel-heading .badge {
5218
+ color: #dff0d8;
5219
+ background-color: #3c763d;
5220
+ }
5221
+ .panel-success > .panel-footer + .panel-collapse > .panel-body {
5222
+ border-bottom-color: #d6e9c6;
5223
+ }
5224
+ .panel-info {
5225
+ border-color: #bce8f1;
5226
+ }
5227
+ .panel-info > .panel-heading {
5228
+ color: #31708f;
5229
+ background-color: #d9edf7;
5230
+ border-color: #bce8f1;
5231
+ }
5232
+ .panel-info > .panel-heading + .panel-collapse > .panel-body {
5233
+ border-top-color: #bce8f1;
5234
+ }
5235
+ .panel-info > .panel-heading .badge {
5236
+ color: #d9edf7;
5237
+ background-color: #31708f;
5238
+ }
5239
+ .panel-info > .panel-footer + .panel-collapse > .panel-body {
5240
+ border-bottom-color: #bce8f1;
5241
+ }
5242
+ .panel-warning {
5243
+ border-color: #faebcc;
5244
+ }
5245
+ .panel-warning > .panel-heading {
5246
+ color: #8a6d3b;
5247
+ background-color: #fcf8e3;
5248
+ border-color: #faebcc;
5249
+ }
5250
+ .panel-warning > .panel-heading + .panel-collapse > .panel-body {
5251
+ border-top-color: #faebcc;
5252
+ }
5253
+ .panel-warning > .panel-heading .badge {
5254
+ color: #fcf8e3;
5255
+ background-color: #8a6d3b;
5256
+ }
5257
+ .panel-warning > .panel-footer + .panel-collapse > .panel-body {
5258
+ border-bottom-color: #faebcc;
5259
+ }
5260
+ .panel-danger {
5261
+ border-color: #ebccd1;
5262
+ }
5263
+ .panel-danger > .panel-heading {
5264
+ color: #a94442;
5265
+ background-color: #f2dede;
5266
+ border-color: #ebccd1;
5267
+ }
5268
+ .panel-danger > .panel-heading + .panel-collapse > .panel-body {
5269
+ border-top-color: #ebccd1;
5270
+ }
5271
+ .panel-danger > .panel-heading .badge {
5272
+ color: #f2dede;
5273
+ background-color: #a94442;
5274
+ }
5275
+ .panel-danger > .panel-footer + .panel-collapse > .panel-body {
5276
+ border-bottom-color: #ebccd1;
5277
+ }
5278
+ .embed-responsive {
5279
+ position: relative;
5280
+ display: block;
5281
+ height: 0;
5282
+ padding: 0;
5283
+ overflow: hidden;
5284
+ }
5285
+ .embed-responsive .embed-responsive-item,
5286
+ .embed-responsive iframe,
5287
+ .embed-responsive embed,
5288
+ .embed-responsive object {
5289
+ position: absolute;
5290
+ top: 0;
5291
+ left: 0;
5292
+ bottom: 0;
5293
+ height: 100%;
5294
+ width: 100%;
5295
+ border: 0;
5296
+ }
5297
+ .embed-responsive.embed-responsive-16by9 {
5298
+ padding-bottom: 56.25%;
5299
+ }
5300
+ .embed-responsive.embed-responsive-4by3 {
5301
+ padding-bottom: 75%;
5302
+ }
5303
+ .well {
5304
+ min-height: 20px;
5305
+ padding: 19px;
5306
+ margin-bottom: 20px;
5307
+ background-color: #f5f5f5;
5308
+ border: 1px solid #e3e3e3;
5309
+ border-radius: 4px;
5310
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
5311
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
5312
+ }
5313
+ .well blockquote {
5314
+ border-color: #ddd;
5315
+ border-color: rgba(0, 0, 0, 0.15);
5316
+ }
5317
+ .well-lg {
5318
+ padding: 24px;
5319
+ border-radius: 6px;
5320
+ }
5321
+ .well-sm {
5322
+ padding: 9px;
5323
+ border-radius: 3px;
5324
+ }
5325
+ .close {
5326
+ float: right;
5327
+ font-size: 21px;
5328
+ font-weight: bold;
5329
+ line-height: 1;
5330
+ color: #000000;
5331
+ text-shadow: 0 1px 0 #ffffff;
5332
+ opacity: 0.2;
5333
+ filter: alpha(opacity=20);
5334
+ }
5335
+ .close:hover,
5336
+ .close:focus {
5337
+ color: #000000;
5338
+ text-decoration: none;
5339
+ cursor: pointer;
5340
+ opacity: 0.5;
5341
+ filter: alpha(opacity=50);
5342
+ }
5343
+ button.close {
5344
+ padding: 0;
5345
+ cursor: pointer;
5346
+ background: transparent;
5347
+ border: 0;
5348
+ -webkit-appearance: none;
5349
+ }
5350
+ .modal-open {
5351
+ overflow: hidden;
5352
+ }
5353
+ .modal {
5354
+ display: none;
5355
+ overflow: hidden;
5356
+ position: fixed;
5357
+ top: 0;
5358
+ right: 0;
5359
+ bottom: 0;
5360
+ left: 0;
5361
+ z-index: 1050;
5362
+ -webkit-overflow-scrolling: touch;
5363
+ outline: 0;
5364
+ }
5365
+ .modal.fade .modal-dialog {
5366
+ -webkit-transform: translate3d(0, -25%, 0);
5367
+ transform: translate3d(0, -25%, 0);
5368
+ -webkit-transition: -webkit-transform 0.3s ease-out;
5369
+ -moz-transition: -moz-transform 0.3s ease-out;
5370
+ -o-transition: -o-transform 0.3s ease-out;
5371
+ transition: transform 0.3s ease-out;
5372
+ }
5373
+ .modal.in .modal-dialog {
5374
+ -webkit-transform: translate3d(0, 0, 0);
5375
+ transform: translate3d(0, 0, 0);
5376
+ }
5377
+ .modal-open .modal {
5378
+ overflow-x: hidden;
5379
+ overflow-y: auto;
5380
+ }
5381
+ .modal-dialog {
5382
+ position: relative;
5383
+ width: auto;
5384
+ margin: 10px;
5385
+ }
5386
+ .modal-content {
5387
+ position: relative;
5388
+ background-color: #ffffff;
5389
+ border: 1px solid #999999;
5390
+ border: 1px solid rgba(0, 0, 0, 0.2);
5391
+ border-radius: 6px;
5392
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
5393
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
5394
+ background-clip: padding-box;
5395
+ outline: 0;
5396
+ }
5397
+ .modal-backdrop {
5398
+ position: fixed;
5399
+ top: 0;
5400
+ right: 0;
5401
+ bottom: 0;
5402
+ left: 0;
5403
+ z-index: 1040;
5404
+ background-color: #000000;
5405
+ }
5406
+ .modal-backdrop.fade {
5407
+ opacity: 0;
5408
+ filter: alpha(opacity=0);
5409
+ }
5410
+ .modal-backdrop.in {
5411
+ opacity: 0.5;
5412
+ filter: alpha(opacity=50);
5413
+ }
5414
+ .modal-header {
5415
+ padding: 15px;
5416
+ border-bottom: 1px solid #e5e5e5;
5417
+ min-height: 16.42857143px;
5418
+ }
5419
+ .modal-header .close {
5420
+ margin-top: -2px;
5421
+ }
5422
+ .modal-title {
5423
+ margin: 0;
5424
+ line-height: 1.42857143;
5425
+ }
5426
+ .modal-body {
5427
+ position: relative;
5428
+ padding: 15px;
5429
+ }
5430
+ .modal-footer {
5431
+ padding: 15px;
5432
+ text-align: right;
5433
+ border-top: 1px solid #e5e5e5;
5434
+ }
5435
+ .modal-footer .btn + .btn {
5436
+ margin-left: 5px;
5437
+ margin-bottom: 0;
5438
+ }
5439
+ .modal-footer .btn-group .btn + .btn {
5440
+ margin-left: -1px;
5441
+ }
5442
+ .modal-footer .btn-block + .btn-block {
5443
+ margin-left: 0;
5444
+ }
5445
+ .modal-scrollbar-measure {
5446
+ position: absolute;
5447
+ top: -9999px;
5448
+ width: 50px;
5449
+ height: 50px;
5450
+ overflow: scroll;
5451
+ }
5452
+ @media (min-width: 768px) {
5453
+ .modal-dialog {
5454
+ width: 600px;
5455
+ margin: 30px auto;
5456
+ }
5457
+ .modal-content {
5458
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
5459
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
5460
+ }
5461
+ .modal-sm {
5462
+ width: 300px;
5463
+ }
5464
+ }
5465
+ @media (min-width: 992px) {
5466
+ .modal-lg {
5467
+ width: 900px;
5468
+ }
5469
+ }
5470
+ .tooltip {
5471
+ position: absolute;
5472
+ z-index: 1070;
5473
+ display: block;
5474
+ visibility: visible;
5475
+ font-size: 12px;
5476
+ line-height: 1.4;
5477
+ opacity: 0;
5478
+ filter: alpha(opacity=0);
5479
+ }
5480
+ .tooltip.in {
5481
+ opacity: 0.9;
5482
+ filter: alpha(opacity=90);
5483
+ }
5484
+ .tooltip.top {
5485
+ margin-top: -3px;
5486
+ padding: 5px 0;
5487
+ }
5488
+ .tooltip.right {
5489
+ margin-left: 3px;
5490
+ padding: 0 5px;
5491
+ }
5492
+ .tooltip.bottom {
5493
+ margin-top: 3px;
5494
+ padding: 5px 0;
5495
+ }
5496
+ .tooltip.left {
5497
+ margin-left: -3px;
5498
+ padding: 0 5px;
5499
+ }
5500
+ .tooltip-inner {
5501
+ max-width: 200px;
5502
+ padding: 3px 8px;
5503
+ color: #ffffff;
5504
+ text-align: center;
5505
+ text-decoration: none;
5506
+ background-color: #000000;
5507
+ border-radius: 4px;
5508
+ }
5509
+ .tooltip-arrow {
5510
+ position: absolute;
5511
+ width: 0;
5512
+ height: 0;
5513
+ border-color: transparent;
5514
+ border-style: solid;
5515
+ }
5516
+ .tooltip.top .tooltip-arrow {
5517
+ bottom: 0;
5518
+ left: 50%;
5519
+ margin-left: -5px;
5520
+ border-width: 5px 5px 0;
5521
+ border-top-color: #000000;
5522
+ }
5523
+ .tooltip.top-left .tooltip-arrow {
5524
+ bottom: 0;
5525
+ left: 5px;
5526
+ border-width: 5px 5px 0;
5527
+ border-top-color: #000000;
5528
+ }
5529
+ .tooltip.top-right .tooltip-arrow {
5530
+ bottom: 0;
5531
+ right: 5px;
5532
+ border-width: 5px 5px 0;
5533
+ border-top-color: #000000;
5534
+ }
5535
+ .tooltip.right .tooltip-arrow {
5536
+ top: 50%;
5537
+ left: 0;
5538
+ margin-top: -5px;
5539
+ border-width: 5px 5px 5px 0;
5540
+ border-right-color: #000000;
5541
+ }
5542
+ .tooltip.left .tooltip-arrow {
5543
+ top: 50%;
5544
+ right: 0;
5545
+ margin-top: -5px;
5546
+ border-width: 5px 0 5px 5px;
5547
+ border-left-color: #000000;
5548
+ }
5549
+ .tooltip.bottom .tooltip-arrow {
5550
+ top: 0;
5551
+ left: 50%;
5552
+ margin-left: -5px;
5553
+ border-width: 0 5px 5px;
5554
+ border-bottom-color: #000000;
5555
+ }
5556
+ .tooltip.bottom-left .tooltip-arrow {
5557
+ top: 0;
5558
+ left: 5px;
5559
+ border-width: 0 5px 5px;
5560
+ border-bottom-color: #000000;
5561
+ }
5562
+ .tooltip.bottom-right .tooltip-arrow {
5563
+ top: 0;
5564
+ right: 5px;
5565
+ border-width: 0 5px 5px;
5566
+ border-bottom-color: #000000;
5567
+ }
5568
+ .popover {
5569
+ position: absolute;
5570
+ top: 0;
5571
+ left: 0;
5572
+ z-index: 1060;
5573
+ display: none;
5574
+ max-width: 276px;
5575
+ padding: 1px;
5576
+ text-align: left;
5577
+ background-color: #ffffff;
5578
+ background-clip: padding-box;
5579
+ border: 1px solid #cccccc;
5580
+ border: 1px solid rgba(0, 0, 0, 0.2);
5581
+ border-radius: 6px;
5582
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
5583
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
5584
+ white-space: normal;
5585
+ }
5586
+ .popover.top {
5587
+ margin-top: -10px;
5588
+ }
5589
+ .popover.right {
5590
+ margin-left: 10px;
5591
+ }
5592
+ .popover.bottom {
5593
+ margin-top: 10px;
5594
+ }
5595
+ .popover.left {
5596
+ margin-left: -10px;
5597
+ }
5598
+ .popover-title {
5599
+ margin: 0;
5600
+ padding: 8px 14px;
5601
+ font-size: 14px;
5602
+ font-weight: normal;
5603
+ line-height: 18px;
5604
+ background-color: #f7f7f7;
5605
+ border-bottom: 1px solid #ebebeb;
5606
+ border-radius: 5px 5px 0 0;
5607
+ }
5608
+ .popover-content {
5609
+ padding: 9px 14px;
5610
+ }
5611
+ .popover > .arrow,
5612
+ .popover > .arrow:after {
5613
+ position: absolute;
5614
+ display: block;
5615
+ width: 0;
5616
+ height: 0;
5617
+ border-color: transparent;
5618
+ border-style: solid;
5619
+ }
5620
+ .popover > .arrow {
5621
+ border-width: 11px;
5622
+ }
5623
+ .popover > .arrow:after {
5624
+ border-width: 10px;
5625
+ content: "";
5626
+ }
5627
+ .popover.top > .arrow {
5628
+ left: 50%;
5629
+ margin-left: -11px;
5630
+ border-bottom-width: 0;
5631
+ border-top-color: #999999;
5632
+ border-top-color: rgba(0, 0, 0, 0.25);
5633
+ bottom: -11px;
5634
+ }
5635
+ .popover.top > .arrow:after {
5636
+ content: " ";
5637
+ bottom: 1px;
5638
+ margin-left: -10px;
5639
+ border-bottom-width: 0;
5640
+ border-top-color: #ffffff;
5641
+ }
5642
+ .popover.right > .arrow {
5643
+ top: 50%;
5644
+ left: -11px;
5645
+ margin-top: -11px;
5646
+ border-left-width: 0;
5647
+ border-right-color: #999999;
5648
+ border-right-color: rgba(0, 0, 0, 0.25);
5649
+ }
5650
+ .popover.right > .arrow:after {
5651
+ content: " ";
5652
+ left: 1px;
5653
+ bottom: -10px;
5654
+ border-left-width: 0;
5655
+ border-right-color: #ffffff;
5656
+ }
5657
+ .popover.bottom > .arrow {
5658
+ left: 50%;
5659
+ margin-left: -11px;
5660
+ border-top-width: 0;
5661
+ border-bottom-color: #999999;
5662
+ border-bottom-color: rgba(0, 0, 0, 0.25);
5663
+ top: -11px;
5664
+ }
5665
+ .popover.bottom > .arrow:after {
5666
+ content: " ";
5667
+ top: 1px;
5668
+ margin-left: -10px;
5669
+ border-top-width: 0;
5670
+ border-bottom-color: #ffffff;
5671
+ }
5672
+ .popover.left > .arrow {
5673
+ top: 50%;
5674
+ right: -11px;
5675
+ margin-top: -11px;
5676
+ border-right-width: 0;
5677
+ border-left-color: #999999;
5678
+ border-left-color: rgba(0, 0, 0, 0.25);
5679
+ }
5680
+ .popover.left > .arrow:after {
5681
+ content: " ";
5682
+ right: 1px;
5683
+ border-right-width: 0;
5684
+ border-left-color: #ffffff;
5685
+ bottom: -10px;
5686
+ }
5687
+ .carousel {
5688
+ position: relative;
5689
+ }
5690
+ .carousel-inner {
5691
+ position: relative;
5692
+ overflow: hidden;
5693
+ width: 100%;
5694
+ }
5695
+ .carousel-inner > .item {
5696
+ display: none;
5697
+ position: relative;
5698
+ -webkit-transition: 0.6s ease-in-out left;
5699
+ -o-transition: 0.6s ease-in-out left;
5700
+ transition: 0.6s ease-in-out left;
5701
+ }
5702
+ .carousel-inner > .item > img,
5703
+ .carousel-inner > .item > a > img {
5704
+ line-height: 1;
5705
+ }
5706
+ .carousel-inner > .active,
5707
+ .carousel-inner > .next,
5708
+ .carousel-inner > .prev {
5709
+ display: block;
5710
+ }
5711
+ .carousel-inner > .active {
5712
+ left: 0;
5713
+ }
5714
+ .carousel-inner > .next,
5715
+ .carousel-inner > .prev {
5716
+ position: absolute;
5717
+ top: 0;
5718
+ width: 100%;
5719
+ }
5720
+ .carousel-inner > .next {
5721
+ left: 100%;
5722
+ }
5723
+ .carousel-inner > .prev {
5724
+ left: -100%;
5725
+ }
5726
+ .carousel-inner > .next.left,
5727
+ .carousel-inner > .prev.right {
5728
+ left: 0;
5729
+ }
5730
+ .carousel-inner > .active.left {
5731
+ left: -100%;
5732
+ }
5733
+ .carousel-inner > .active.right {
5734
+ left: 100%;
5735
+ }
5736
+ .carousel-control {
5737
+ position: absolute;
5738
+ top: 0;
5739
+ left: 0;
5740
+ bottom: 0;
5741
+ width: 15%;
5742
+ opacity: 0.5;
5743
+ filter: alpha(opacity=50);
5744
+ font-size: 20px;
5745
+ color: #ffffff;
5746
+ text-align: center;
5747
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
5748
+ }
5749
+ .carousel-control.left {
5750
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
5751
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
5752
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
5753
+ background-repeat: repeat-x;
5754
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
5755
+ }
5756
+ .carousel-control.right {
5757
+ left: auto;
5758
+ right: 0;
5759
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
5760
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
5761
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
5762
+ background-repeat: repeat-x;
5763
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
5764
+ }
5765
+ .carousel-control:hover,
5766
+ .carousel-control:focus {
5767
+ outline: 0;
5768
+ color: #ffffff;
5769
+ text-decoration: none;
5770
+ opacity: 0.9;
5771
+ filter: alpha(opacity=90);
5772
+ }
5773
+ .carousel-control .icon-prev,
5774
+ .carousel-control .icon-next,
5775
+ .carousel-control .glyphicon-chevron-left,
5776
+ .carousel-control .glyphicon-chevron-right {
5777
+ position: absolute;
5778
+ top: 50%;
5779
+ z-index: 5;
5780
+ display: inline-block;
5781
+ }
5782
+ .carousel-control .icon-prev,
5783
+ .carousel-control .glyphicon-chevron-left {
5784
+ left: 50%;
5785
+ margin-left: -10px;
5786
+ }
5787
+ .carousel-control .icon-next,
5788
+ .carousel-control .glyphicon-chevron-right {
5789
+ right: 50%;
5790
+ margin-right: -10px;
5791
+ }
5792
+ .carousel-control .icon-prev,
5793
+ .carousel-control .icon-next {
5794
+ width: 20px;
5795
+ height: 20px;
5796
+ margin-top: -10px;
5797
+ font-family: serif;
5798
+ }
5799
+ .carousel-control .icon-prev:before {
5800
+ content: '\2039';
5801
+ }
5802
+ .carousel-control .icon-next:before {
5803
+ content: '\203a';
5804
+ }
5805
+ .carousel-indicators {
5806
+ position: absolute;
5807
+ bottom: 10px;
5808
+ left: 50%;
5809
+ z-index: 15;
5810
+ width: 60%;
5811
+ margin-left: -30%;
5812
+ padding-left: 0;
5813
+ list-style: none;
5814
+ text-align: center;
5815
+ }
5816
+ .carousel-indicators li {
5817
+ display: inline-block;
5818
+ width: 10px;
5819
+ height: 10px;
5820
+ margin: 1px;
5821
+ text-indent: -999px;
5822
+ border: 1px solid #ffffff;
5823
+ border-radius: 10px;
5824
+ cursor: pointer;
5825
+ background-color: #000 \9;
5826
+ background-color: rgba(0, 0, 0, 0);
5827
+ }
5828
+ .carousel-indicators .active {
5829
+ margin: 0;
5830
+ width: 12px;
5831
+ height: 12px;
5832
+ background-color: #ffffff;
5833
+ }
5834
+ .carousel-caption {
5835
+ position: absolute;
5836
+ left: 15%;
5837
+ right: 15%;
5838
+ bottom: 20px;
5839
+ z-index: 10;
5840
+ padding-top: 20px;
5841
+ padding-bottom: 20px;
5842
+ color: #ffffff;
5843
+ text-align: center;
5844
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
5845
+ }
5846
+ .carousel-caption .btn {
5847
+ text-shadow: none;
5848
+ }
5849
+ @media screen and (min-width: 768px) {
5850
+ .carousel-control .glyphicon-chevron-left,
5851
+ .carousel-control .glyphicon-chevron-right,
5852
+ .carousel-control .icon-prev,
5853
+ .carousel-control .icon-next {
5854
+ width: 30px;
5855
+ height: 30px;
5856
+ margin-top: -15px;
5857
+ font-size: 30px;
5858
+ }
5859
+ .carousel-control .glyphicon-chevron-left,
5860
+ .carousel-control .icon-prev {
5861
+ margin-left: -15px;
5862
+ }
5863
+ .carousel-control .glyphicon-chevron-right,
5864
+ .carousel-control .icon-next {
5865
+ margin-right: -15px;
5866
+ }
5867
+ .carousel-caption {
5868
+ left: 20%;
5869
+ right: 20%;
5870
+ padding-bottom: 30px;
5871
+ }
5872
+ .carousel-indicators {
5873
+ bottom: 20px;
5874
+ }
5875
+ }
5876
+ .clearfix:before,
5877
+ .clearfix:after,
5878
+ .dl-horizontal dd:before,
5879
+ .dl-horizontal dd:after,
5880
+ .container:before,
5881
+ .container:after,
5882
+ .container-fluid:before,
5883
+ .container-fluid:after,
5884
+ .row:before,
5885
+ .row:after,
5886
+ .form-horizontal .form-group:before,
5887
+ .form-horizontal .form-group:after,
5888
+ .btn-toolbar:before,
5889
+ .btn-toolbar:after,
5890
+ .btn-group-vertical > .btn-group:before,
5891
+ .btn-group-vertical > .btn-group:after,
5892
+ .nav:before,
5893
+ .nav:after,
5894
+ .navbar:before,
5895
+ .navbar:after,
5896
+ .navbar-header:before,
5897
+ .navbar-header:after,
5898
+ .navbar-collapse:before,
5899
+ .navbar-collapse:after,
5900
+ .pager:before,
5901
+ .pager:after,
5902
+ .panel-body:before,
5903
+ .panel-body:after,
5904
+ .modal-footer:before,
5905
+ .modal-footer:after {
5906
+ content: " ";
5907
+ display: table;
5908
+ }
5909
+ .clearfix:after,
5910
+ .dl-horizontal dd:after,
5911
+ .container:after,
5912
+ .container-fluid:after,
5913
+ .row:after,
5914
+ .form-horizontal .form-group:after,
5915
+ .btn-toolbar:after,
5916
+ .btn-group-vertical > .btn-group:after,
5917
+ .nav:after,
5918
+ .navbar:after,
5919
+ .navbar-header:after,
5920
+ .navbar-collapse:after,
5921
+ .pager:after,
5922
+ .panel-body:after,
5923
+ .modal-footer:after {
5924
+ clear: both;
5925
+ }
5926
+ .center-block {
5927
+ display: block;
5928
+ margin-left: auto;
5929
+ margin-right: auto;
5930
+ }
5931
+ .pull-right {
5932
+ float: right !important;
5933
+ }
5934
+ .pull-left {
5935
+ float: left !important;
5936
+ }
5937
+ .hide {
5938
+ display: none !important;
5939
+ }
5940
+ .show {
5941
+ display: block !important;
5942
+ }
5943
+ .invisible {
5944
+ visibility: hidden;
5945
+ }
5946
+ .text-hide {
5947
+ font: 0/0 a;
5948
+ color: transparent;
5949
+ text-shadow: none;
5950
+ background-color: transparent;
5951
+ border: 0;
5952
+ }
5953
+ .hidden {
5954
+ display: none !important;
5955
+ visibility: hidden !important;
5956
+ }
5957
+ .affix {
5958
+ position: fixed;
5959
+ -webkit-transform: translate3d(0, 0, 0);
5960
+ transform: translate3d(0, 0, 0);
5961
+ }
5962
+ @-ms-viewport {
5963
+ width: device-width;
5964
+ }
5965
+ .visible-xs,
5966
+ .visible-sm,
5967
+ .visible-md,
5968
+ .visible-lg {
5969
+ display: none !important;
5970
+ }
5971
+ .visible-xs-block,
5972
+ .visible-xs-inline,
5973
+ .visible-xs-inline-block,
5974
+ .visible-sm-block,
5975
+ .visible-sm-inline,
5976
+ .visible-sm-inline-block,
5977
+ .visible-md-block,
5978
+ .visible-md-inline,
5979
+ .visible-md-inline-block,
5980
+ .visible-lg-block,
5981
+ .visible-lg-inline,
5982
+ .visible-lg-inline-block {
5983
+ display: none !important;
5984
+ }
5985
+ @media (max-width: 767px) {
5986
+ .visible-xs {
5987
+ display: block !important;
5988
+ }
5989
+ table.visible-xs {
5990
+ display: table;
5991
+ }
5992
+ tr.visible-xs {
5993
+ display: table-row !important;
5994
+ }
5995
+ th.visible-xs,
5996
+ td.visible-xs {
5997
+ display: table-cell !important;
5998
+ }
5999
+ }
6000
+ @media (max-width: 767px) {
6001
+ .visible-xs-block {
6002
+ display: block !important;
6003
+ }
6004
+ }
6005
+ @media (max-width: 767px) {
6006
+ .visible-xs-inline {
6007
+ display: inline !important;
6008
+ }
6009
+ }
6010
+ @media (max-width: 767px) {
6011
+ .visible-xs-inline-block {
6012
+ display: inline-block !important;
6013
+ }
6014
+ }
6015
+ @media (min-width: 768px) and (max-width: 991px) {
6016
+ .visible-sm {
6017
+ display: block !important;
6018
+ }
6019
+ table.visible-sm {
6020
+ display: table;
6021
+ }
6022
+ tr.visible-sm {
6023
+ display: table-row !important;
6024
+ }
6025
+ th.visible-sm,
6026
+ td.visible-sm {
6027
+ display: table-cell !important;
6028
+ }
6029
+ }
6030
+ @media (min-width: 768px) and (max-width: 991px) {
6031
+ .visible-sm-block {
6032
+ display: block !important;
6033
+ }
6034
+ }
6035
+ @media (min-width: 768px) and (max-width: 991px) {
6036
+ .visible-sm-inline {
6037
+ display: inline !important;
6038
+ }
6039
+ }
6040
+ @media (min-width: 768px) and (max-width: 991px) {
6041
+ .visible-sm-inline-block {
6042
+ display: inline-block !important;
6043
+ }
6044
+ }
6045
+ @media (min-width: 992px) and (max-width: 1199px) {
6046
+ .visible-md {
6047
+ display: block !important;
6048
+ }
6049
+ table.visible-md {
6050
+ display: table;
6051
+ }
6052
+ tr.visible-md {
6053
+ display: table-row !important;
6054
+ }
6055
+ th.visible-md,
6056
+ td.visible-md {
6057
+ display: table-cell !important;
6058
+ }
6059
+ }
6060
+ @media (min-width: 992px) and (max-width: 1199px) {
6061
+ .visible-md-block {
6062
+ display: block !important;
6063
+ }
6064
+ }
6065
+ @media (min-width: 992px) and (max-width: 1199px) {
6066
+ .visible-md-inline {
6067
+ display: inline !important;
6068
+ }
6069
+ }
6070
+ @media (min-width: 992px) and (max-width: 1199px) {
6071
+ .visible-md-inline-block {
6072
+ display: inline-block !important;
6073
+ }
6074
+ }
6075
+ @media (min-width: 1200px) {
6076
+ .visible-lg {
6077
+ display: block !important;
6078
+ }
6079
+ table.visible-lg {
6080
+ display: table;
6081
+ }
6082
+ tr.visible-lg {
6083
+ display: table-row !important;
6084
+ }
6085
+ th.visible-lg,
6086
+ td.visible-lg {
6087
+ display: table-cell !important;
6088
+ }
6089
+ }
6090
+ @media (min-width: 1200px) {
6091
+ .visible-lg-block {
6092
+ display: block !important;
6093
+ }
6094
+ }
6095
+ @media (min-width: 1200px) {
6096
+ .visible-lg-inline {
6097
+ display: inline !important;
6098
+ }
6099
+ }
6100
+ @media (min-width: 1200px) {
6101
+ .visible-lg-inline-block {
6102
+ display: inline-block !important;
6103
+ }
6104
+ }
6105
+ @media (max-width: 767px) {
6106
+ .hidden-xs {
6107
+ display: none !important;
6108
+ }
6109
+ }
6110
+ @media (min-width: 768px) and (max-width: 991px) {
6111
+ .hidden-sm {
6112
+ display: none !important;
6113
+ }
6114
+ }
6115
+ @media (min-width: 992px) and (max-width: 1199px) {
6116
+ .hidden-md {
6117
+ display: none !important;
6118
+ }
6119
+ }
6120
+ @media (min-width: 1200px) {
6121
+ .hidden-lg {
6122
+ display: none !important;
6123
+ }
6124
+ }
6125
+ .visible-print {
6126
+ display: none !important;
6127
+ }
6128
+ @media print {
6129
+ .visible-print {
6130
+ display: block !important;
6131
+ }
6132
+ table.visible-print {
6133
+ display: table;
6134
+ }
6135
+ tr.visible-print {
6136
+ display: table-row !important;
6137
+ }
6138
+ th.visible-print,
6139
+ td.visible-print {
6140
+ display: table-cell !important;
6141
+ }
6142
+ }
6143
+ .visible-print-block {
6144
+ display: none !important;
6145
+ }
6146
+ @media print {
6147
+ .visible-print-block {
6148
+ display: block !important;
6149
+ }
6150
+ }
6151
+ .visible-print-inline {
6152
+ display: none !important;
6153
+ }
6154
+ @media print {
6155
+ .visible-print-inline {
6156
+ display: inline !important;
6157
+ }
6158
+ }
6159
+ .visible-print-inline-block {
6160
+ display: none !important;
6161
+ }
6162
+ @media print {
6163
+ .visible-print-inline-block {
6164
+ display: inline-block !important;
6165
+ }
6166
+ }
6167
+ @media print {
6168
+ .hidden-print {
6169
+ display: none !important;
6170
+ }
6171
+ }
6172
+ .wp-caption{
6173
+ max-width:98%
6174
+ }
assets/admin/styles/fonts/glyphicons-halflings-regular.eot ADDED
Binary file
assets/admin/styles/fonts/glyphicons-halflings-regular.svg ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata></metadata>
5
+ <defs>
6
+ <font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
7
+ <font-face units-per-em="1200" ascent="960" descent="-240" />
8
+ <missing-glyph horiz-adv-x="500" />
9
+ <glyph />
10
+ <glyph />
11
+ <glyph unicode="&#xd;" />
12
+ <glyph unicode=" " />
13
+ <glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
14
+ <glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
15
+ <glyph unicode="&#xa0;" />
16
+ <glyph unicode="&#x2000;" horiz-adv-x="652" />
17
+ <glyph unicode="&#x2001;" horiz-adv-x="1304" />
18
+ <glyph unicode="&#x2002;" horiz-adv-x="652" />
19
+ <glyph unicode="&#x2003;" horiz-adv-x="1304" />
20
+ <glyph unicode="&#x2004;" horiz-adv-x="434" />
21
+ <glyph unicode="&#x2005;" horiz-adv-x="326" />
22
+ <glyph unicode="&#x2006;" horiz-adv-x="217" />
23
+ <glyph unicode="&#x2007;" horiz-adv-x="217" />
24
+ <glyph unicode="&#x2008;" horiz-adv-x="163" />
25
+ <glyph unicode="&#x2009;" horiz-adv-x="260" />
26
+ <glyph unicode="&#x200a;" horiz-adv-x="72" />
27
+ <glyph unicode="&#x202f;" horiz-adv-x="260" />
28
+ <glyph unicode="&#x205f;" horiz-adv-x="326" />
29
+ <glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
30
+ <glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
31
+ <glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
32
+ <glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
33
+ <glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
34
+ <glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
35
+ <glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
36
+ <glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
37
+ <glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
38
+ <glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
39
+ <glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
40
+ <glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
41
+ <glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
42
+ <glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
43
+ <glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
44
+ <glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
45
+ <glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
46
+ <glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
47
+ <glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
48
+ <glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
49
+ <glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
50
+ <glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
51
+ <glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
52
+ <glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
53
+ <glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
54
+ <glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
55
+ <glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
56
+ <glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
57
+ <glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
58
+ <glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
59
+ <glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
60
+ <glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
61
+ <glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
62
+ <glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
63
+ <glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
64
+ <glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
65
+ <glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
66
+ <glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
67
+ <glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
68
+ <glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
69
+ <glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
70
+ <glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
71
+ <glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
72
+ <glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
73
+ <glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
74
+ <glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
75
+ <glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
76
+ <glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
77
+ <glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
78
+ <glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
79
+ <glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
80
+ <glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
81
+ <glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
82
+ <glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
83
+ <glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
84
+ <glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
85
+ <glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
86
+ <glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
87
+ <glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
88
+ <glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
89
+ <glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
90
+ <glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
91
+ <glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
92
+ <glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
93
+ <glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
94
+ <glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
95
+ <glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
96
+ <glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
97
+ <glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
98
+ <glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
99
+ <glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
100
+ <glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
101
+ <glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
102
+ <glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
103
+ <glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
104
+ <glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
105
+ <glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
106
+ <glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
107
+ <glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
108
+ <glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
109
+ <glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
110
+ <glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
111
+ <glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
112
+ <glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
113
+ <glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
114
+ <glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
115
+ <glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
116
+ <glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
117
+ <glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
118
+ <glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
119
+ <glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
120
+ <glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
121
+ <glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
122
+ <glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
123
+ <glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
124
+ <glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
125
+ <glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
126
+ <glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
127
+ <glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
128
+ <glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
129
+ <glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
130
+ <glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
131
+ <glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
132
+ <glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
133
+ <glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
134
+ <glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
135
+ <glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
136
+ <glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
137
+ <glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
138
+ <glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
139
+ <glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
140
+ <glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
141
+ <glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
142
+ <glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
143
+ <glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
144
+ <glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
145
+ <glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
146
+ <glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
147
+ <glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
148
+ <glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
149
+ <glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
150
+ <glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
151
+ <glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
152
+ <glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
153
+ <glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
154
+ <glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
155
+ <glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
156
+ <glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
157
+ <glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
158
+ <glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
159
+ <glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
160
+ <glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
161
+ <glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
162
+ <glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
163
+ <glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
164
+ <glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
165
+ <glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
166
+ <glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
167
+ <glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
168
+ <glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
169
+ <glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
170
+ <glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
171
+ <glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
172
+ <glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
173
+ <glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
174
+ <glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
175
+ <glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
176
+ <glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
177
+ <glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
178
+ <glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
179
+ <glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
180
+ <glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
181
+ <glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
182
+ <glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
183
+ <glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
184
+ <glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
185
+ <glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
186
+ <glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
187
+ <glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
188
+ <glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
189
+ <glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
190
+ <glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
191
+ <glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
192
+ <glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
193
+ <glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
194
+ <glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
195
+ <glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
196
+ <glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
197
+ <glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
198
+ <glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
199
+ <glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
200
+ <glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
201
+ <glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
202
+ <glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
203
+ <glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
204
+ <glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
205
+ <glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
206
+ <glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
207
+ <glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
208
+ <glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
209
+ <glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
210
+ <glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
211
+ <glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
212
+ <glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
213
+ <glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
214
+ <glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
215
+ <glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
216
+ <glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
217
+ <glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
218
+ <glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
219
+ <glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
220
+ <glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
221
+ <glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
222
+ <glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
223
+ <glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
224
+ <glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
225
+ <glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
226
+ <glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
227
+ <glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
228
+ </font>
229
+ </defs></svg>
assets/admin/styles/fonts/glyphicons-halflings-regular.ttf ADDED
Binary file
assets/admin/styles/fonts/glyphicons-halflings-regular.woff ADDED
Binary file
assets/admin/styles/gdbc-admin.css ADDED
@@ -0,0 +1,832 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ body
2
+ {
3
+ color: #444;
4
+ font-family: "Open Sans",sans-serif;
5
+ font-size: 13px;
6
+ line-height: 1.4em;
7
+ color:#444;
8
+ background-color: #F1F1F1;
9
+ }
10
+
11
+ div.wrap.container-fluid
12
+ {
13
+ margin: 10px 20px 0px 2px;
14
+ padding:0;
15
+ }
16
+
17
+
18
+
19
+ div.gdbc-settings .clearfix:after
20
+ {
21
+ content: ".";
22
+ display: block;
23
+ height: 0;
24
+ clear: both;
25
+ visibility: hidden;
26
+ zoom: 1
27
+ }
28
+
29
+ #gdbc-reports-holder
30
+ {
31
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
32
+ }
33
+ #gdbc-reports-holder h3
34
+ {
35
+ font-size: 1.5em;
36
+ }
37
+
38
+ #adminmenuwrap{
39
+ height: 100%
40
+ }
41
+
42
+ #chart-container{ height: 235px; width: 100% }
43
+
44
+ .gdbcwidget {
45
+ border-radius: 0;
46
+ margin: 0 0 30px;
47
+ padding: 0;
48
+ }
49
+
50
+ .gdbcwidget .widget-body {
51
+ min-height: 100px;
52
+ /*padding-bottom: 13px;*/
53
+ position: relative;
54
+ }
55
+
56
+ .gdbcwidget header {
57
+ border-radius: 0;
58
+ box-shadow: 0 -2px 0 rgba(0, 0, 0, 0.05) inset;
59
+ background: none repeat scroll 0 0 #fafafa;
60
+ border: 1px solid #c2c2c2;
61
+ color: #333;
62
+ height: 34px;
63
+ line-height: 40px;
64
+ padding: 0;
65
+ font-size: 13px;
66
+ }
67
+
68
+ .gdbcwidget > header {
69
+ background: none repeat scroll 0 0 #fafafa;
70
+ border: 1px solid #c2c2c2;
71
+ color: #333;
72
+ }
73
+
74
+ .gdbcwidget header h2 {
75
+ float: left;
76
+ display: inline-block;
77
+ font-size: 14px;
78
+ font-weight: 400;
79
+ height: 100%;
80
+ letter-spacing: 0;
81
+ line-height: 34px;
82
+ margin: 0;
83
+ position: relative;
84
+ width: auto;
85
+ padding: 0 !important;
86
+ }
87
+
88
+ .gdbcwidget > div {
89
+ border-bottom-color: #ccc !important;
90
+ border-left-color: #ccc !important;
91
+ border-radius: 0;
92
+ border-right-color: #ccc !important;
93
+ border-style: none solid solid;
94
+ border-top: medium none;
95
+ border-width: medium 1px 2px;
96
+ float: left;
97
+ font-size: 13px;
98
+ margin: 0;
99
+ overflow: visible;
100
+ padding: 13px 13px 0;
101
+ position: relative;
102
+ width: 100%;
103
+ background-color: #fff !important
104
+ }
105
+
106
+ .no-padding {
107
+ padding: 0 !important;
108
+ }
109
+
110
+ .row.no-space {
111
+ margin:0;
112
+ padding:0;
113
+ border:none;
114
+ }
115
+
116
+ .no-space {
117
+ margin: 0;
118
+ }
119
+
120
+ .widget-icon {
121
+ display:block;
122
+ float: left;
123
+ font-size: 111%;
124
+ height: 32px;
125
+ line-height: 32px;
126
+ position: relative;
127
+ text-align: center;
128
+ width: 30px
129
+ }
130
+ #dashboard-navigation{
131
+ float: left
132
+ }
133
+
134
+ .gdbcwidget-loader {
135
+ background-position: center center;
136
+ background-repeat: no-repeat;
137
+ display: none;
138
+ float: right;
139
+ font-size: 111%;
140
+ height: 32px;
141
+ line-height: 32px;
142
+ margin: 0;
143
+ text-align: center;
144
+ width: 32px
145
+ }
146
+
147
+ .no-space > [class*="col-"] {
148
+ margin: 0 !important;
149
+ padding-left: 0;
150
+ padding-right: 0;
151
+ }
152
+
153
+ .nav > li {
154
+ display: block;
155
+ position: relative;
156
+ }
157
+
158
+ .nav-tabs > li {
159
+ float: left;
160
+ margin-bottom: -2px;
161
+ margin-right: -3px;
162
+ }
163
+
164
+ .gdbcwidget header:first-child .nav-tabs li {
165
+ padding-left: 0;
166
+ }
167
+
168
+ .gdbcwidget header .nav-tabs > li.active > a, .gdbcwidget header .nav-tabs > li.active > a:focus, .gdbcwidget header .nav-tabs > li.active > a:hover {
169
+ -moz-border-bottom-colors: none;
170
+ -moz-border-left-colors: none;
171
+ -moz-border-right-colors: none;
172
+ -moz-border-top-colors: none;
173
+ background-color: #fff;
174
+ border-color: -moz-use-text-color #c2c2c2 transparent;
175
+ border-image: none;
176
+ border-left: 1px solid #c2c2c2;
177
+ border-right: 1px solid #c2c2c2;
178
+ border-style: none solid solid;
179
+ border-width: medium 1px 1px;
180
+ color: #555;
181
+ cursor: default;
182
+ }
183
+
184
+ .gdbcwidget header .nav-tabs > li > a {
185
+ border: medium none;
186
+ border-radius: 0;
187
+ padding: 7px 15px 6px;
188
+ }
189
+
190
+ .module-pagingation
191
+ {
192
+ margin-top: 0 !important;
193
+ margin-bottom: 0 !important
194
+ }
195
+
196
+ .nav-tabs > li.active > a {
197
+ border-top-width: 0 !important;
198
+ box-shadow: 0 -2px 0 #57889c;
199
+ font-weight: 700;
200
+ margin-top: 1px !important;
201
+ }
202
+
203
+ .nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover {
204
+ -moz-border-bottom-colors: none;
205
+ -moz-border-left-colors: none;
206
+ -moz-border-right-colors: none;
207
+ -moz-border-top-colors: none;
208
+ background-color: #fff;
209
+ border-color: #ddd #ddd transparent;
210
+ border-image: none;
211
+ border-style: solid;
212
+ border-width: 1px;
213
+ color: #555;
214
+ cursor: default;
215
+ }
216
+
217
+ .nav-tabs > li > a {
218
+ border-radius: 0;
219
+ color: #333;
220
+ }
221
+ .nav-tabs > li > a {
222
+ border: 1px solid transparent;
223
+ border-radius: 2px 2px 0 0;
224
+ line-height: 1.42857;
225
+ margin-right: 2px;
226
+ }
227
+ .nav > li > a {
228
+ display: block;
229
+ padding: 9px 10px 10px;
230
+ position: relative;
231
+ }
232
+
233
+ .vector-map, #gdbc-stats{
234
+ height: 300px;
235
+ width: 100%;
236
+ }
237
+
238
+ .vector-map{
239
+ padding: 10px;
240
+ }
241
+
242
+ .progress {
243
+ border-radius: 0;
244
+ height: 7px;
245
+ margin-bottom: 15px;
246
+ margin-top: 3px;
247
+ }
248
+
249
+ .easyPieChart{
250
+ display: inline-block;
251
+ text-align: center;
252
+ position: relative;
253
+ width: 60px;
254
+ height: 60px;
255
+ line-height: 60px
256
+ }
257
+
258
+ .easyPieChart canvas{
259
+ position: absolute;
260
+ top:0;
261
+ left:0
262
+ }
263
+
264
+ .pie-chart-widgets > div {
265
+ border-right: 1px solid #dadada !important;
266
+ border-top: 1px solid #dadada !important;
267
+ margin-top: 10px !important;
268
+ overflow: hidden;
269
+ padding: 7px 9px;
270
+ }
271
+
272
+ .padding-10
273
+ {
274
+ padding: 10px !important;
275
+ }
276
+
277
+ .table img
278
+ {
279
+ margin-right: 5px
280
+ }
281
+
282
+ .countriesTable tbody tr, #gdbc-pie-chart table tbody tr{
283
+ height: 40px;
284
+ }
285
+
286
+ .bg-color-dark-blue{
287
+ background-color: #4c4f53 !important;
288
+ }
289
+
290
+ .bg-color-blue{
291
+ background-color: #57889c !important;
292
+ }
293
+
294
+ .bg-color-green{
295
+ background-color: #71843f !important;
296
+ }
297
+
298
+ .bg-color-dark-orange{
299
+ background-color: #a57225
300
+ }
301
+
302
+ .view-buttons{
303
+ width:100%;
304
+ }
305
+
306
+ .view-buttons span
307
+ {
308
+ display: inline-block;
309
+ width: 200px;
310
+ float:right;
311
+ }
312
+
313
+ /* Map with location of all the attempts */
314
+ .jvectormap-zoomin,.jvectormap-zoomout
315
+ {
316
+ position:absolute;
317
+ padding:4px;
318
+ width:22px;
319
+ height:22px;
320
+ cursor:pointer;
321
+ line-height:10px;
322
+ text-align:center;
323
+ font-size:14px;
324
+ border-radius:2px;
325
+ -webkit-border-radius:2px;
326
+ -moz-border-radius:2px;
327
+ box-shadow:inset 0 -2px 0 rgba(0,0,0,.05);
328
+ -moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,.05);
329
+ -webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,.05);
330
+ background-color:#fff;
331
+ border:1px solid #bfbfbf
332
+ }
333
+
334
+ .jvectormap-zoomin:hover,.jvectormap-zoomout:hover
335
+ {
336
+ background:#eee;border-color:#d9d9d9
337
+ }
338
+
339
+ .jvectormap-zoomin
340
+ {
341
+ top:0
342
+ }
343
+
344
+ .jvectormap-zoomout
345
+ {
346
+ top:24px
347
+ }
348
+
349
+ .jvectormap-label
350
+ {
351
+ position:absolute;
352
+ display:none;
353
+ border:solid 1px #CDCDCD;
354
+ -webkit-border-radius:3px;
355
+ -moz-border-radius:3px;
356
+ border-radius:3px;
357
+ background:#292929;
358
+ color:#fff;
359
+ font-family:sans-serif,Verdana;
360
+ font-size:smaller;
361
+ padding:3px
362
+ }
363
+
364
+ .bg-color-greenLight {
365
+ background-color: #71843f !important;
366
+ }
367
+
368
+ .bg-color-blueLight {
369
+ background-color: #92a2a8 !important;
370
+ }
371
+
372
+ .bg-color-red{
373
+ background-color: #a90329 !important;
374
+ }
375
+
376
+ .icon-success{
377
+ color: #5cb85c
378
+ }
379
+
380
+ .icon-danger{
381
+ color: #d9534f
382
+ }
383
+
384
+ .icon-primary{
385
+ color: #428bca
386
+ }
387
+
388
+ a.badge:hover{
389
+ background-color: #92a2a8 !important;
390
+ }
391
+
392
+ a.easy-tool-tip:hover span:hover {
393
+ background-color: #92a2a8 !important;
394
+ cursor: hand;
395
+ }
396
+
397
+ .pie-chart-widgets span.label {
398
+ min-width: 30px;
399
+ display: block;
400
+ text-align: center;
401
+ }
402
+
403
+ .dropdown-menu-xs {
404
+ min-width: 37px;
405
+ }
406
+
407
+ /*modules page*/
408
+ .toolbar {
409
+ display: block;
410
+ margin-bottom: 0;
411
+ margin-left: 0;
412
+ margin-right: 0;
413
+ margin-top: 0;
414
+ background-attachment: scroll;
415
+ background-clip: border-box;
416
+ background-image: none;
417
+ background-origin: padding-box;
418
+ background-position: 0 0;
419
+ background-repeat: repeat;
420
+ background-size: auto auto;
421
+ border-bottom-color: #ccc;
422
+ border-bottom-style: solid;
423
+ border-bottom-width: 1px;
424
+ min-height: 42px;
425
+ padding-bottom: 8px;
426
+ padding-left: 10px;
427
+ padding-right: 10px;
428
+ padding-top: 8px;
429
+ background-color: #fff;
430
+ color: #666;
431
+ outline-color: -moz-use-text-color;
432
+ outline-style: none;
433
+ outline-width: 0;
434
+ position: relative;
435
+ }
436
+
437
+ #modules-chart .inline-group:after {
438
+ clear: both;
439
+ content: "";
440
+ display: table;
441
+ }
442
+
443
+
444
+ #modules-chart *, #modules-chart *:after, #modules-chart *:before {
445
+ box-sizing: content-box;
446
+ margin-bottom: 0;
447
+ margin-left: 0;
448
+ margin-right: 0;
449
+ margin-top: 0;
450
+ padding-bottom: 0;
451
+ padding-left: 0;
452
+ padding-right: 0;
453
+ padding-top: 0;
454
+ }
455
+
456
+ #modules-chart .inline-group .checkbox, #modules-chart .inline-group .radio {
457
+ float: left;
458
+ margin-right: 30px;
459
+ width: 130px
460
+ }
461
+
462
+ #modules-chart .checkbox, #modules-chart .radio {
463
+ color: #404040;
464
+ cursor: pointer;
465
+ font-size: 13px;
466
+ line-height: 25px;
467
+ margin-bottom: 4px;
468
+ padding-left: 25px;
469
+ }
470
+
471
+ #modules-chart .checkbox input, #modules-chart .radio input {
472
+ left: -9999px;
473
+ position: absolute;
474
+ }
475
+
476
+ #modules-chart input[type="checkbox"], .checkbox-inline input[type="checkbox"], .radio input[type="radio"], .radio-inline input[type="radio"] {
477
+ margin-left: -20px;
478
+ }
479
+
480
+ input[type="checkbox"], input[type="radio"] {
481
+ line-height: normal;
482
+ margin-bottom: 0;
483
+ margin-right: 0;
484
+ margin-top: 4px;
485
+ box-sizing: border-box;
486
+ padding-bottom: 0;
487
+ padding-left: 0;
488
+ padding-right: 0;
489
+ padding-top: 0;
490
+ }
491
+
492
+ #modules-chart .checkbox input:checked + i:after, #modules-chart .radio input:checked + i:after {
493
+ opacity: 1;
494
+ }
495
+
496
+ #modules-chart .checkbox input:checked + i:after {
497
+ -moz-font-feature-settings: normal;
498
+ -moz-font-language-override: normal;
499
+ -x-system-font: none;
500
+ content: "";
501
+ font-family: "Glyphicons Halflings";
502
+ font-size: 16px;
503
+ font-size-adjust: none;
504
+ font-stretch: normal;
505
+ font-style: normal;
506
+ font-variant: normal;
507
+ font-weight: 400;
508
+ height: 15px;
509
+ left: 1px;
510
+ line-height: 19px;
511
+ text-align: center;
512
+ top: -1px;
513
+ width: 15px;
514
+ color: #3276b1;
515
+ margin-right: 10px;
516
+ }
517
+
518
+ #modules-chart .checkbox input + i:after {
519
+ -moz-font-feature-settings: normal;
520
+ -moz-font-language-override: normal;
521
+ -x-system-font: none;
522
+ content: "";
523
+ font-family: "Glyphicons Halflings";
524
+ font-size: 16px;
525
+ font-size-adjust: none;
526
+ font-stretch: normal;
527
+ font-style: normal;
528
+ font-variant: normal;
529
+ font-weight: 400;
530
+ height: 15px;
531
+ left: 1px;
532
+ line-height: 19px;
533
+ text-align: center;
534
+ top: -1px;
535
+ width: 15px;
536
+ color: #3276b1;
537
+ margin-right: 10px;
538
+ }
539
+
540
+ #modules-chart .checkbox input:checked:hover + i:after{
541
+ content: "";
542
+ }
543
+
544
+ #modules-chart .checkbox input:checked + i, #modules-chart .radio input:checked + i, #modules-chart .toggle input:checked + i {
545
+ border-bottom-color: #3276b1;
546
+ border-left-color-ltr-source: physical;
547
+ border-left-color-rtl-source: physical;
548
+ border-left-color-value: #3276b1;
549
+ border-right-color-ltr-source: physical;
550
+ border-right-color-rtl-source: physical;
551
+ border-right-color-value: #3276b1;
552
+ border-top-color: #3276b1
553
+ }
554
+
555
+ #flot-container {
556
+ height: 235px;
557
+ width: 100%;
558
+ }
559
+
560
+ #flotTip{
561
+ padding:3px 5px;
562
+ background-color:#fff;
563
+ z-index:9999;
564
+ color:#333;
565
+ -webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);
566
+ -moz-box-shadow:0 1px 8px rgba(0,0,0,.1);
567
+ box-shadow:0 1px 8px rgba(0,0,0,.1);
568
+ font-size:14px;
569
+ border:1px solid #C1C1C1;
570
+ -moz-border-radius:4px;
571
+ -khtml-border-radius:4px;
572
+ -webkit-border-radius:4px;
573
+ border-radius:4px
574
+ }
575
+
576
+ #flotTip p
577
+ {
578
+ text-align: center;
579
+ margin:0;
580
+ padding: 0;
581
+ }
582
+
583
+ #flotTip span{
584
+ color:#38812D;
585
+ font-weight:700
586
+ }
587
+
588
+ .module-pagination ul{
589
+ margin-top: 0;
590
+ margin-bottom: 0
591
+ }
592
+
593
+ .gdbc-settings h3.hndle
594
+ {
595
+ padding: 10px 12px 8px !important;
596
+ }
597
+
598
+ .gdbc-settings form table.form-table
599
+ {
600
+ width:auto !important;
601
+ position: relative !important;
602
+ }
603
+
604
+ .gdbc-settings form table.form-table tr
605
+ {
606
+ position:relative !important;
607
+
608
+ }
609
+
610
+ .gdbc-settings form table.form-table th
611
+ {
612
+ width: 265px !important;
613
+ padding: 18px 10px 12px 0 !important;
614
+ }
615
+
616
+ .gdbc-settings form table.form-table td
617
+ {
618
+ padding:10px 0;
619
+ }
620
+
621
+ .gdbc-settings form table.form-table td p
622
+ {
623
+ left: 0;
624
+ position: absolute;
625
+ width: 850px;
626
+ margin:0 !important;
627
+ }
628
+
629
+ .gdbc-settings form > h3
630
+ {
631
+ margin-bottom: 0 !important;
632
+ padding-bottom: 0 !important;
633
+ background: #EFEFEF;
634
+ margin: 0 -12px !important;
635
+ padding: 8px 12px;
636
+ border-bottom: 1px solid #cccccc;
637
+ border-top: 1px solid #cccccc;
638
+
639
+ }
640
+ .gdbc-settings p.submit
641
+ {
642
+ padding-top:0 !important;
643
+ }
644
+ .gdbc-settings form hr
645
+ {
646
+ margin:0 -12px !important;
647
+ }
648
+
649
+ .gdbc-settings div.error, .gdbc-settings div.updated {
650
+ margin: 15px 0 5px !important;
651
+ }
652
+
653
+ /*.toplevel_page_goodbye-captcha-settings form table.form-table th,*/
654
+ /*.toplevel_page_goodbye-captcha-settings form table.form-table td,*/
655
+ /*.goodbye-captcha-new_page_goodbye-captcha-security form table.form-table th,*/
656
+ /*.goodbye-captcha-new_page_goodbye-captcha-security form table.form-table td*/
657
+ /*{*/
658
+ /*padding-bottom: 30px !important;*/
659
+ /*}*/
660
+
661
+ .gdbc-settings form table.form-table td, .gdbc-settings form table.form-table th
662
+ {
663
+ padding-bottom: 30px !important;
664
+ }
665
+ .gdbc-settings #normal-sortables:empty, .gdbc-settings #advanced-sortables:empty, .gdbc-settings #bottom-sortables:empty
666
+ {
667
+ display:none;
668
+ }
669
+
670
+ .text-center
671
+ {
672
+ margin-top: 10px;
673
+ text-align: center !important;
674
+ }
675
+
676
+ .btn-label
677
+ {
678
+ background: none repeat scroll 0 0 rgba(0, 0, 0, 0.15);
679
+ border-radius: 3px 0 0 3px;
680
+ display: inline-block;
681
+ left: -12px;
682
+ padding: 6px 12px;
683
+ position: relative;
684
+ }
685
+
686
+ .btn {
687
+ border-radius: 2px;
688
+ box-shadow: 0 -2px 0 rgba(0, 0, 0, 0.05) inset;
689
+ }
690
+
691
+ a.btn-rate-gdbc
692
+ {
693
+ display:none;
694
+ }
695
+
696
+ a.btn-rate-gdbc:hover i.glyphicon
697
+ {
698
+ color: #ffff00;
699
+ }
700
+
701
+ .btn-labeled {
702
+ padding-bottom: 0;
703
+ padding-top: 0;
704
+ }
705
+
706
+ div.gdbcwidget ul.pagination a:hover
707
+ {
708
+ cursor: pointer;
709
+ }
710
+
711
+ #gdbc-barchart-holder div.morris-hover.morris-default-style p
712
+ {
713
+ font-weight: bold;
714
+ margin:0 !important;
715
+ }
716
+ #gdbc-barchart-holder div.morris-hover.morris-default-style p span
717
+ {
718
+ color: #972d2c;
719
+ }
720
+
721
+ .gdbc-settings .mch-right-side-holder h3.hndle
722
+ {
723
+ padding: 0 0 0 10px !important;
724
+ }
725
+
726
+
727
+ .gdbc-settings .mch-right-side-holder h3.hndle span, .gdbc-settings .mch-right-side-holder h2.hndle span
728
+ {
729
+ display:inline-block;
730
+ padding: 10px 0px 8px 22px !important;
731
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyJJREFUOI1tkltMVHcQxr///5y9wYrsYvDAohSoGNDEqtDa1htirKttUAMxqfX2VJNWWy9JH9qGpDGpaRse7FtNNAaMrbZ2o42IUiwUUOMt1W5NINTCuixZ2MpyWXb37DlfH1oMUCeZZCaZ7zfJNyMwI2prKW/2dHqHR5Ibw0Px1RMJatludcWDaxsez5wFAHVqs+fDu+vOtFz9LBSOv54yCKsiYJWIpuwW43liABCTxY4Dd/b5moJfGwZV1yw1WJzvPPlSedb3EzZrf//C4tjGNXAsEhBwYqxCiPg0ysdf+GvSin20FflY7m1uOFjrdwPAe91cu8rPE/PvsDu3k1FPB0fW/8ad08QXrgzm5L18OWQp/JHed9rrAaAuQMdrfp7NaCftrWRWO6ndYEy7wfH1j7hrmgdXf3nydiic0OZp9uDe3aXvNzYATVGcvT2EqgwVoyvd+NzjwEVLAhElCWOBipHmqYRl3uY2teACq/Z21gHAwcesSmsltQ6OH+ph5fOto5xMNTgQX2y3KcjOtP0KAL+PY3MKQL4dTXVF4udJye4Dt4/W+/q2OtMtlPInCkETEFHVJAUAqBbTAIAUoYh/z5OculOxily7VSmxWiQJSlKA5ITM09K64gkTkWHjFQAoSUeLABBI4I1Pe7l8EjDPk3Vo5SpPfsUKrWBTZc4WKQVIJGS+x+EDgft/RLefuk57TQG+K3ehLZxE5oknuFT9iLv2dzMPG16IvXqyLHj+m7K+wvkZvaZJAIAsK81umDvH9vdf/bGiy9/eOlYhRMrrQHWJCy2jBnIaB3H6XBhd9WPoOXMPf27v4ptJh0hK/gf45PCLgX07C4+oisDF5oEP1my7/lWiAU8fLBGVNTnYsWA2rgk7JmIKsscATwywKZD6/155856Oj9puRY7puom5buvDRcXO40uXaY2h2e6RgJmaU+oSszIzhNSHGIr4gwt/uBRsTRkcfgYAgOp3b1bdfTh8NDQYX0wTcDokJBmxSsSEKk0CME2oVERaUqeL5Og0AAAc+XIgPdQb2NrTO/pWXyi+JKkbubrOGXOklFIH8PQfWXdiApL00zIAAAAASUVORK5CYII=') 0 center no-repeat;
732
+ }
733
+ .gdbc-settings .mch-right-side-holder h2.hndle span
734
+ {
735
+ padding:0 0 0 22px !important;
736
+ }
737
+
738
+ .gdbc-settings .metabox-holder h3 {
739
+ font-size: 14px;
740
+ line-height: 1.4;
741
+ margin: 0;
742
+ padding: 8px 12px;
743
+ }
744
+
745
+ /*#gdbc-help-metabox h3.hndle span*/
746
+ /*{*/
747
+ /*border-left: 4px solid #428bca;*/
748
+ /*}*/
749
+
750
+
751
+ #gdbc-help-metabox .logo-help {
752
+ width: 70%;
753
+ display:block;
754
+ margin: 0 auto;
755
+ padding:10px;
756
+ }
757
+
758
+ #gdbc-help-metabox .inside
759
+ {
760
+ margin:0;
761
+ background-color: #f9f9f9 !important;
762
+ }
763
+
764
+ #gdbc-help-metabox .contact-help {
765
+ display:block;
766
+ text-align: center;
767
+ border-top: 1px solid #ccc;
768
+ padding-top:10px;
769
+ }
770
+
771
+
772
+ div.mch-meta-notice
773
+ {}
774
+
775
+ div.mch-meta-notice-info
776
+ {
777
+ border-left:4px solid #428bca; padding:3px 8px; text-align: justify;
778
+ }
779
+
780
+ div.mch-meta-notice-warning
781
+ {
782
+ border-left:4px solid #ffba00; background:#fcf8e3; padding:3px 8px; text-align: center
783
+ }
784
+
785
+
786
+ /*div.mch-plugin-notice*/
787
+ /*{*/
788
+
789
+ /*}*/
790
+
791
+ /*div.mch-plugin-notice p*/
792
+ /*{*/
793
+
794
+ /*}*/
795
+
796
+ .report-spinner {
797
+ position: absolute;
798
+ left: 50%;
799
+ top: 50%;
800
+ height:40px;
801
+ width:40px;
802
+ margin:0px auto;
803
+ -webkit-animation: rotation .6s infinite linear;
804
+ -moz-animation: rotation .6s infinite linear;
805
+ -o-animation: rotation .6s infinite linear;
806
+ animation: rotation .6s infinite linear;
807
+ border-left:6px solid rgba(0,174,239,.15);
808
+ border-right:6px solid rgba(0,174,239,.15);
809
+ border-bottom:6px solid rgba(0,174,239,.15);
810
+ border-top:6px solid rgba(0,174,239,.8);
811
+ border-radius:100%;
812
+ }
813
+
814
+ @-webkit-keyframes rotation {
815
+ from {-webkit-transform: rotate(0deg);}
816
+ to {-webkit-transform: rotate(359deg);}
817
+ }
818
+ @-moz-keyframes rotation {
819
+ from {-moz-transform: rotate(0deg);}
820
+ to {-moz-transform: rotate(359deg);}
821
+ }
822
+ @-o-keyframes rotation {
823
+ from {-o-transform: rotate(0deg);}
824
+ to {-o-transform: rotate(359deg);}
825
+ }
826
+ @keyframes rotation {
827
+ from {transform: rotate(0deg);}
828
+ to {transform: rotate(359deg);}
829
+ }
830
+
831
+
832
+
assets/admin/styles/morris.css ADDED
@@ -0,0 +1,2 @@
 
 
1
+ .morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}
2
+ .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}
assets/public/scripts/gdbc-client.js.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ defined( 'ABSPATH' ) || exit;
21
+
22
+ function gdbcRewriteNoCacheHeaders($arrHeaders)
23
+ {
24
+ $arrHeaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
25
+ $arrHeaders['Content-Type'] = 'application/javascript; charset=utf-8';
26
+
27
+ return $arrHeaders;
28
+ }
29
+
30
+ add_filter('nocache_headers', 'gdbcRewriteNoCacheHeaders', 1);
31
+
32
+ nocache_headers();
33
+
34
+
35
+ ?>
36
+
37
+ (function($) {
38
+ $.GdbcClient = function(el, options) {
39
+ var gdbcClient = this, defaults = {};
40
+ gdbcClient.settings = {};
41
+ var init = function() {
42
+ gdbcClient.settings = $.extend({}, defaults, options);
43
+ };
44
+
45
+ gdbcClient.requestTokens = function() {
46
+ $('form input[name=' + Gdbc.formFieldName + ']').each(function(){
47
+ requestTokenValue($(this));
48
+ });
49
+ };
50
+
51
+ var requestTokenValue = function(elm) {
52
+ var ajaxData = {};
53
+
54
+ ajaxData[Gdbc.formFieldName] = '<?php echo GdbcAjaxController::getAjaxNonce(); ?>';
55
+ ajaxData['action'] = '<?php echo GdbcAjaxController::ACTION_RETRIEVE_TOKEN ?>';
56
+ ajaxData['requestTime'] = (new Date()).getTime();
57
+ ajaxData['browserInfo'] = JSON.stringify(Gdbc.browserInfo);
58
+ $.ajax({
59
+ type : "post",
60
+ cache: false,
61
+ dataType : "json",
62
+ url : Gdbc.ajaxUrl + '?t=' + ajaxData['requestTime'],
63
+ data : ajaxData,
64
+ success: function(response){
65
+ $.each(response.data, function(prop, val){
66
+ if(prop === 'token'){
67
+ elm.val(val);return;
68
+ }
69
+
70
+ var value = '', arrValues = val.split('|');
71
+ for(var i=0; i<arrValues.length; ++i) {
72
+ if (Gdbc.browserInfo.hasOwnProperty(arrValues[i]))
73
+ value += Gdbc.browserInfo[arrValues[i]];
74
+ }
75
+ $('<input>').prop({type:'hidden',name:prop,value:value}).appendTo(elm.closest('form'));
76
+ });
77
+ }
78
+ });
79
+ };
80
+ init();
81
+ }
82
+ })(jQuery);
83
+
84
+ jQuery(document).ready(function($){(new $.GdbcClient()).requestTokens();});
assets/public/scripts/gdbc-public.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(g,d,b,c){b = g.createElement('script');c=g.scripts[0];b.async=1;b.src=Gdbc.clientUrl+'-'+(new Date()).getTime();c.parentNode.insertBefore(b,c);})(document);
2
+
3
+ jQuery(document).ready(function($) {"use strict";
4
+ var w=window,d=document,e=0,f=0;e|=w.ActiveXObject?1:0;e|=w.opera?2:0;e|=w.chrome?4:0;
5
+ e|='getBoxObjectFor' in d || 'mozInnerScreenX' in w?8:0;e|=('WebKitCSSMatrix' in w||'WebKitPoint' in w||'webkitStorageInfo' in w||'webkitURL' in w)?16:0;
6
+ e|=(e&16&&({}.toString).toString().indexOf("\n")===-1)?32:0;f|='sandbox' in d.createElement('iframe')?1:0;f|='WebSocket' in w?2:0;
7
+ f|=w.Worker?4:0;f|=w.applicationCache?8:0;f|=w.history && history.pushState?16:0;f|=d.documentElement.webkitRequestFullScreen?32:0;f|='FileReader' in w?64:0;
8
+
9
+ var ua = navigator.userAgent.toLowerCase();
10
+ var regex = /compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g;
11
+ var match = regex.exec(ua);
12
+ Gdbc.browserInfo = {screenWidth:screen.width,screenHeight:screen.height,engine:e,features:f};
13
+ while (match !== null) {
14
+ var prop = {};
15
+ if (match[1]) {
16
+ prop.type = match[1];
17
+ prop.version = match[2];
18
+ } else if (match[3]) {
19
+ prop.type = match[3];
20
+ prop.version = match[4];
21
+ } else {
22
+ prop.type = match[5];
23
+ }
24
+ prop.type = $.trim(prop.type).replace(".","").replace(" ","_");
25
+ var value = prop.version ? prop.version : true;
26
+ if (Gdbc.browserInfo[prop.type]) {
27
+ !$.isArray(Gdbc.browserInfo[prop.type])?Gdbc.browserInfo[prop.type]=new Array(Gdbc.browserInfo[prop.type]):'';
28
+ Gdbc.browserInfo[prop.type].push(value);
29
+ }
30
+ else Gdbc.browserInfo[prop.type] = value;
31
+ match = regex.exec(ua);
32
+ }
33
+ });
assets/public/scripts/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden
engine/GdbcAjaxController.php ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GdbcAjaxController
21
+ {
22
+ CONST ACTION_RETRIEVE_TOKEN = 'gdbcRetrieveToken';
23
+ CONST AJAX_NONCE_VALUE = __CLASS__;
24
+
25
+ public static function processRequest()
26
+ {
27
+ if( ! GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS) )
28
+ return;
29
+
30
+ if(self::isPublicGdbcAjaxRequest() ) {
31
+
32
+ self::sendAjaxHeaders();
33
+
34
+ if ( ! self::clientCanRetrieveToken() ) {
35
+ wp_send_json_error();
36
+ }
37
+
38
+ $arrTokenData = GdbcRequestController::getEncryptedToken();
39
+
40
+ wp_send_json_success( $arrTokenData );
41
+
42
+ exit;
43
+ }
44
+
45
+ if( ! did_action ('plugins_loaded') )
46
+ return;
47
+
48
+ foreach(array(
49
+
50
+ GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP,
51
+ GdbcModulesController::MODULE_ZM_ALR,
52
+ GdbcModulesController::MODULE_NINJA_FORMS,
53
+ GdbcModulesController::MODULE_USER_PRO,
54
+
55
+ ) as $moduleName){
56
+
57
+ if(null === ($publicModuleInstance = GdbcModulesController::getPublicModuleInstance($moduleName)))
58
+ continue;
59
+
60
+ $publicModuleInstance->registerAttachedHooks();
61
+ }
62
+
63
+
64
+
65
+
66
+ if(self::isAdminAjaxRequestValid())
67
+ {
68
+ $arrAjaxAdminReportsActions = array(
69
+ 'retrieveInitialDashboardData',
70
+ 'retrieveLatestAttemptsTable',
71
+ 'retrieveTotalAttemptsPerModule',
72
+ 'retrieveDetailedAttemptsForChart',
73
+ 'retrieveDetailedAttemptsPerModule',
74
+ 'retrieveFormattedBlockedContent',
75
+ 'retrieveAttemptsPerModuleAndSection',
76
+ 'retrieveAttemptsPerClientIp',
77
+ 'manageClientIpAddress',
78
+ );
79
+
80
+ foreach ($arrAjaxAdminReportsActions as $adminAjaxActionRequest) {
81
+ add_action('wp_ajax_' . $adminAjaxActionRequest, array(GdbcReportsAdminModule::getInstance(), $adminAjaxActionRequest));
82
+ }
83
+
84
+ foreach(GoodByeCaptchaAdmin::getAdminRegisteredNotices() as $adminNotice){
85
+ if( !($adminNotice instanceof GdbcAdminNotice) || !$adminNotice->isDismissible())
86
+ continue;
87
+
88
+ add_action('wp_ajax_gdbc-dismiss-' . $adminNotice->getFormattedNoticeKey(), array($adminNotice, 'dismiss'));
89
+ }
90
+
91
+ }
92
+
93
+
94
+ }
95
+
96
+ private static function clientCanRetrieveToken()
97
+ {
98
+ $settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
99
+ if(null === $settingsModuleInstance)
100
+ return false;
101
+
102
+ if(null === ($hiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME)))
103
+ return false;
104
+
105
+ if(empty($_POST[$hiddenInputName]))
106
+ return false;
107
+
108
+ if(!isset($_SERVER['HTTP_ACCEPT']) || false === stripos($_SERVER['HTTP_ACCEPT'], 'json'))
109
+ return false;
110
+
111
+ if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || (0 !== strcasecmp($_SERVER['HTTP_X_REQUESTED_WITH'], 'XMLHttpRequest')))
112
+ return false;
113
+
114
+ require_once( ABSPATH . WPINC . '/pluggable.php' );
115
+
116
+ ( !defined('LOGGED_IN_COOKIE') && function_exists('wp_cookie_constants') ) ? wp_cookie_constants() : null;
117
+
118
+ if(!GoodByeCaptchaUtils::isValidReferer())
119
+ return false;
120
+
121
+ if(false === wp_verify_nonce($_POST[$hiddenInputName], __CLASS__))
122
+ return false;
123
+
124
+
125
+ if(GdbcIPUtils::isIpAddressBlocked(GdbcIPUtils::getClientIpAddress()))
126
+ return false;
127
+
128
+ return true;
129
+
130
+ }
131
+
132
+
133
+ private static function sendAjaxHeaders()
134
+ {
135
+ wp_magic_quotes();
136
+ send_origin_headers();
137
+
138
+ @header('X-Robots-Tag: noindex' );
139
+
140
+ send_nosniff_header();
141
+ nocache_headers();
142
+
143
+ @header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
144
+ @header('Content-Type: application/json; charset=' . get_option( 'blog_charset' ));
145
+ }
146
+
147
+ private static function isPublicGdbcAjaxRequest()
148
+ {
149
+ if(empty($_POST['browserInfo']) || empty($_POST['action']) || (self::ACTION_RETRIEVE_TOKEN !== $_POST['action']))
150
+ return false;
151
+
152
+ return true;
153
+ }
154
+
155
+ public static function getAjaxNonce()
156
+ {
157
+ require_once( ABSPATH . WPINC . '/pluggable.php' );
158
+
159
+ return wp_create_nonce(__CLASS__);
160
+ }
161
+
162
+ public static function isAdminAjaxRequestValid()
163
+ {
164
+ return check_ajax_referer(self::AJAX_NONCE_VALUE, 'ajaxRequestNonce', false);
165
+ }
166
+ }
engine/GdbcBruteGuardian.php ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GdbcBruteGuardian
21
+ {
22
+
23
+ private static $arrSecurityDirectoryFiles = array(
24
+ '.htaccess' => 'deny from all',
25
+ 'index.php' => '<?php',
26
+ 'index.html' => '',
27
+ );
28
+
29
+ private static $SITE_UNDER_ATTACK_FLAG = 'gdbc-under-attack-detected';
30
+ private static $SITE_ATTACK_WARNING_FLAG = 'gdbc-suspicious-ips-detected';
31
+
32
+ public static function startGuarding()
33
+ {
34
+ if( !GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS) )
35
+ return;
36
+
37
+ if( empty($_POST) )
38
+ return;
39
+
40
+ $loginAttemptsHits = 0;
41
+ $arrLatestLoginAttempts = GdbcDbAccessController::getLatestLoginAttempts(60, false);
42
+ foreach($arrLatestLoginAttempts as $index => $loginAttempt){
43
+ $loginAttemptsHits += $loginAttempt->Hits;
44
+ $arrLatestLoginAttempts[$loginAttempt->ClientIp] = $loginAttempt->Hits;
45
+ unset($arrLatestLoginAttempts[$index]);
46
+ }
47
+
48
+ switch(true)
49
+ {
50
+ case ($loginAttemptsHits > 35 && !self::isSiteUnderAttack()) :
51
+
52
+ self::triggerSiteUnderAttack();
53
+
54
+ GdbcNotificationsController::sendBruteForceAttackDetectedEmailNotification($arrLatestLoginAttempts);
55
+
56
+ break;
57
+
58
+ case ($loginAttemptsHits > 25 && !self::isSiteUnderAttack()) :
59
+
60
+ break;
61
+
62
+
63
+ case ($loginAttemptsHits < 15) :
64
+
65
+ if(self::isSiteUnderAttack()){
66
+ self::unTriggerSiteUnderAttack();
67
+ }
68
+
69
+ break;
70
+ }
71
+
72
+
73
+ if(self::isSiteUnderAttack() && GdbcBruteForcePublicModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_AUTO_BLOCK_IP)) {
74
+ if( isset($arrLatestLoginAttempts[GdbcIPUtils::getClientIpAddress()]) && $arrLatestLoginAttempts[GdbcIPUtils::getClientIpAddress()] > 4 && (!GdbcIPUtils::isClientIpBlackListed()) ){
75
+ GdbcBlackListedIpsAdminModule::getInstance()->registerBlackListedIp(GdbcIPUtils::getClientIpAddress());
76
+ }
77
+ }
78
+
79
+ }
80
+
81
+
82
+ private static function isSiteUnderAttack()
83
+ {
84
+ static $siteUnderAttack = null;
85
+ if(null !== $siteUnderAttack)
86
+ return $siteUnderAttack;
87
+
88
+ return $siteUnderAttack = self::flagExists(self::$SITE_UNDER_ATTACK_FLAG);
89
+ }
90
+
91
+ private static function triggerSiteUnderAttack()
92
+ {
93
+ self::setSiteFlag(self::$SITE_UNDER_ATTACK_FLAG, true);
94
+
95
+ GdbcSettingsAdminModule::getInstance()->saveSecuredOptions(true);
96
+
97
+ }
98
+
99
+ private static function unTriggerSiteUnderAttack()
100
+ {
101
+ self::setSiteFlag(self::$SITE_UNDER_ATTACK_FLAG, false);
102
+ }
103
+
104
+ private static function flagExists($flagName)
105
+ {
106
+ $cacheHolder = GoodByeCaptchaUtils::getAvailableCacheStorage(self::getBaseCacheDirectoryPath());
107
+ if(null === $cacheHolder)
108
+ return 0;
109
+
110
+ return $cacheHolder->has($flagName);
111
+ }
112
+
113
+ private static function setSiteFlag($flagName, $flagBooleanValue)
114
+ {
115
+ $cacheHolder = GoodByeCaptchaUtils::getAvailableCacheStorage(self::getBaseCacheDirectoryPath());
116
+ if(null === $cacheHolder)
117
+ return ;
118
+
119
+ if(false === $flagBooleanValue){
120
+ return $cacheHolder->delete($flagName);
121
+ }
122
+
123
+ if($cacheHolder->getCacheStorage() instanceof MchGdbcCacheFileStorage)
124
+ {
125
+ foreach(self::$arrSecurityDirectoryFiles as $fileName => $fileContent)
126
+ {
127
+ $filePath = self::getBaseCacheDirectoryPath() . DIRECTORY_SEPARATOR . $fileName;
128
+ if(MchGdbcWpUtils::fileExists($filePath))
129
+ break;
130
+
131
+ MchGdbcWpUtils::writeContentToFile($fileContent, $filePath, false);
132
+ }
133
+ }
134
+
135
+ $cacheHolder->write($flagName, MchGdbcHttpRequest::getServerRequestTime(false));
136
+ }
137
+
138
+ private static function getBaseCacheDirectoryPath()
139
+ {
140
+ static $cacheDirectoryPath = false;
141
+ if(false !== $cacheDirectoryPath)
142
+ return $cacheDirectoryPath;
143
+
144
+ $cacheDirectoryPath = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_CACHE_DIR_PATH);
145
+ if(!empty($cacheDirectoryPath)){
146
+ $cacheDirectoryPath .= DIRECTORY_SEPARATOR . GoodByeCaptcha::PLUGIN_SLUG . DIRECTORY_SEPARATOR . get_current_blog_id();
147
+ if(MchGdbcWpUtils::isDirectoryUsable($cacheDirectoryPath, true)){
148
+ return $cacheDirectoryPath;
149
+ }
150
+ }
151
+
152
+ $cacheDirectoryPath = MchGdbcWpUtils::getDirectoryPathForCache();
153
+ if(null === $cacheDirectoryPath)
154
+ return null;
155
+
156
+ $cacheDirectoryPath .= DIRECTORY_SEPARATOR . GoodByeCaptcha::PLUGIN_SLUG . DIRECTORY_SEPARATOR . get_current_blog_id();
157
+ if(! MchGdbcWpUtils::isDirectoryUsable($cacheDirectoryPath, true) ) {
158
+ return $cacheDirectoryPath = null;
159
+ }
160
+
161
+ GdbcSettingsAdminModule::getInstance()->saveOption(GdbcSettingsAdminModule::OPTION_CACHE_DIR_PATH, MchGdbcWpUtils::getDirectoryPathForCache());
162
+
163
+ return $cacheDirectoryPath;
164
+ }
165
+
166
+ public static function logRejectedAttempt(GdbcAttemptEntity $attemptEntity)
167
+ {
168
+ if( ((int)GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_MAX_LOGS_DAYS)) < 1 ) //logs are NOT enabled
169
+ return;
170
+
171
+ $attemptEntity->SiteId = get_current_blog_id();
172
+ $attemptEntity->CreatedDate = MchGdbcHttpRequest::getServerRequestTime();
173
+ $attemptEntity->ClientIp = GdbcIPUtils::getClientIpAddress();
174
+
175
+
176
+ if( ((int)GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_BLOCKED_CONTENT_LOG_DAYS)) < 1 ) //blocked content logs are NOT enabled
177
+ $attemptEntity->Notes = null;
178
+
179
+
180
+ GdbcDbAccessController::registerAttempt( $attemptEntity );
181
+
182
+ // if(self::isSiteUnderAttack() && GoodByeCaptchaUtils::isLoginAttemptEntity($attemptEntity) && ( !GdbcIPUtils::isClientIpWhiteListed() )){
183
+ // self::registerClientIpBruteForceRequest();
184
+ // }
185
+
186
+ }
187
+
188
+ private static function getIpAddressDirPath($flagName, $ipAddress)
189
+ {
190
+ if (null === self::getBaseCacheDirectoryPath())
191
+ return null;
192
+
193
+ $subDirectoryName = null;
194
+ switch ($flagName)
195
+ {
196
+ case self::$SITE_UNDER_ATTACK_FLAG : $subDirectoryName = 'brute-ips'; break;
197
+ case self::$SITE_ATTACK_WARNING_FLAG : $subDirectoryName = 'suspicious-ips'; break;
198
+ }
199
+
200
+ return self::getBaseCacheDirectoryPath() . DIRECTORY_SEPARATOR . $subDirectoryName . DIRECTORY_SEPARATOR . $ipAddress;
201
+ }
202
+
203
+ private static function isClientIpBruteForcing()
204
+ {
205
+ return @is_dir(self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()));
206
+ }
207
+
208
+ private static function registerClientIpBruteForceRequest()
209
+ {
210
+ if(self::isClientIpBruteForcing())
211
+ {
212
+ MchGdbcWpUtils::writeContentToFile(null, self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()) . DIRECTORY_SEPARATOR . MchGdbcHttpRequest::getServerRequestTime(true) . '.gdbc', false);
213
+ return;
214
+ }
215
+
216
+ if( ! MchGdbcWpUtils::isDirectoryUsable(self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()), true) )
217
+ return;
218
+
219
+ foreach(self::$arrSecurityDirectoryFiles as $fileName => $fileContent){
220
+ $filePath = self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()) . DIRECTORY_SEPARATOR . $fileName;
221
+ MchGdbcWpUtils::writeContentToFile($fileContent, $filePath, false);
222
+ }
223
+
224
+ MchGdbcWpUtils::writeContentToFile(null, self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()) . DIRECTORY_SEPARATOR . MchGdbcHttpRequest::getServerRequestTime(true) . '.gdbc', false);
225
+ }
226
+
227
+ private function __construct()
228
+ {}
229
+
230
+ }
engine/GdbcIPUtils.php ADDED
@@ -0,0 +1,404 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Copyright (C) 2015 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ final class GdbcIPUtils
22
+ {
23
+
24
+ public static function getClientIpAddress()
25
+ {
26
+ return MchGdbcHttpRequest::getClientIp(array());
27
+ }
28
+
29
+ public static function isClientIpBlackListed()
30
+ {
31
+ return self::isIpBlackListed(self::getClientIpAddress());
32
+ }
33
+
34
+ public static function isClientIpWhiteListed()
35
+ {
36
+ return self::isIpWhiteListed(self::getClientIpAddress());
37
+ }
38
+
39
+ public static function isIpWhiteListed($ipAddress)
40
+ {
41
+ static $arrWhiteVerifiedIPs = array();
42
+ if(isset($arrWhiteVerifiedIPs[$ipAddress]))
43
+ return $arrWhiteVerifiedIPs[$ipAddress];
44
+
45
+ if( self::isIpInFormattedRanges($ipAddress, GdbcWhiteListedIpsPublicModule::getInstance()->getOption(GdbcWhiteListedIpsAdminModule::OPTION_WHITE_LISTED_IPS)) )
46
+ $arrWhiteVerifiedIPs[$ipAddress] = true;
47
+
48
+ return isset($arrWhiteVerifiedIPs[$ipAddress]);
49
+
50
+ }
51
+
52
+ public static function isIpBlackListed($ipAddress)
53
+ {
54
+ static $arrBlackVerifiedIPs = array();
55
+ if(isset($arrBlackVerifiedIPs[$ipAddress]))
56
+ return $arrBlackVerifiedIPs[$ipAddress];
57
+
58
+ if(self::isIpInFormattedRanges($ipAddress, GdbcBlackListedIpsPublicModule::getInstance()->getOption(GdbcBlackListedIpsAdminModule::OPTION_BLACK_LISTED_IPS)))
59
+ $arrBlackVerifiedIPs[$ipAddress] = true;
60
+
61
+ return isset($arrBlackVerifiedIPs[$ipAddress]);
62
+ }
63
+
64
+
65
+ public static function isIpAddressBlocked($ipAddress)
66
+ {
67
+ if(self::isIpBlackListed($ipAddress))
68
+ return true;
69
+
70
+ if(null === ($bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE)))
71
+ return false;
72
+
73
+ if($bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS) && MchGdbcUnTrustedIPRanges::isAttachingHostIP($ipAddress))
74
+ return true;
75
+
76
+ if($bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY) && MchGdbcUnTrustedIPRanges::isAnonymizerProxyIP($ipAddress))
77
+ return true;
78
+
79
+ return false;
80
+
81
+ }
82
+
83
+ public static function isClientIpProxyAnonymizer($checkBruteForceModuleSettings = true)
84
+ {
85
+ static $isAnonymizer = null;
86
+ if(null !== $isAnonymizer)
87
+ return $isAnonymizer;
88
+
89
+ $bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE);
90
+ if(null === $bruteForceModuleInstance)
91
+ return $isAnonymizer = false;
92
+
93
+ if( $checkBruteForceModuleSettings && (! $bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY)) )
94
+ return $isAnonymizer = false;
95
+
96
+ return $isAnonymizer = MchGdbcUnTrustedIPRanges::isAnonymizerProxyIP(GdbcIPUtils::getClientIpAddress());
97
+ }
98
+
99
+ public static function isClientIpWebAttacker($checkBruteForceModuleSettings = true)
100
+ {
101
+ static $isAttacker = null;
102
+ if(null !== $isAttacker)
103
+ return $isAttacker;
104
+
105
+ $bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE);
106
+ if(null === $bruteForceModuleInstance)
107
+ return $isAttacker = false;
108
+
109
+ if( $checkBruteForceModuleSettings && (! $bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS)) )
110
+ return $isAttacker = false;
111
+
112
+ return $isAttacker = MchGdbcUnTrustedIPRanges::isAttachingHostIP(GdbcIPUtils::getClientIpAddress());
113
+
114
+ }
115
+
116
+ public static function isIpProxyAnonymizer($ipAddress)
117
+ {
118
+ return MchGdbcUnTrustedIPRanges::isAnonymizerProxyIP($ipAddress);
119
+ }
120
+
121
+ public static function isIpWebAttacker($ipAddress)
122
+ {
123
+ return MchGdbcUnTrustedIPRanges::isAttachingHostIP($ipAddress);
124
+ }
125
+
126
+
127
+
128
+
129
+
130
+ public static function isIpInFormattedRanges($ipAddress, $arrFormattedRanges)
131
+ {
132
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
133
+
134
+ if( -1 === $ipVersion )
135
+ return false;
136
+
137
+ if(empty($arrFormattedRanges[$ipVersion]))
138
+ return false;
139
+
140
+
141
+ if($ipVersion === MchGdbcIPUtils::IP_VERSION_6)
142
+ {
143
+ $ipAddress = MchGdbcIPUtils::compressIPV6($ipAddress);
144
+ if(isset($arrFormattedRanges[$ipVersion][$ipAddress]))
145
+ return true;
146
+
147
+ foreach($arrFormattedRanges[$ipVersion] as $blockedIPRange => $value)
148
+ {
149
+ if(false === strpos($blockedIPRange, '/'))
150
+ continue;
151
+
152
+ if( ! MchGdbcIPUtils::isIpInCIDRRange($ipAddress, $blockedIPRange, MchGdbcIPUtils::IP_VERSION_6, true) )
153
+ continue;
154
+
155
+ return true;
156
+ }
157
+
158
+ return false;
159
+ }
160
+
161
+ $ipNumber = MchGdbcIPUtils::ipAddressToNumber($ipAddress, MchGdbcIPUtils::IP_VERSION_4);
162
+ if(isset($arrFormattedRanges[$ipVersion][$ipNumber])) // single IP
163
+ return true;
164
+
165
+ foreach($arrFormattedRanges[$ipVersion] as $minIpNumber => $maxIpNumber)
166
+ {
167
+ if( (1 !== $maxIpNumber) && ($minIpNumber <= $ipNumber) && ($ipNumber <= $maxIpNumber) )
168
+ return true;
169
+ }
170
+
171
+ return false;
172
+
173
+ }
174
+
175
+
176
+ public static function removeIpFromFormattedRange($ipAddress, $arrFormattedRange)
177
+ {
178
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
179
+ if(-1 === $ipVersion)
180
+ return $arrFormattedRange;
181
+
182
+ if($ipVersion === MchGdbcIPUtils::IP_VERSION_6)
183
+ {
184
+ unset($arrFormattedRange[MchGdbcIPUtils::compressIPV6($ipAddress)]);
185
+ return $arrFormattedRange;
186
+ }
187
+
188
+ $ipNumber = MchGdbcIPUtils::ipAddressToNumber($ipAddress, $ipVersion);
189
+ if(isset($arrFormattedRange[$ipNumber]) && 1 == $arrFormattedRange[$ipNumber])
190
+ {
191
+ unset($arrFormattedRange[$ipNumber]);
192
+ return $arrFormattedRange;
193
+ }
194
+
195
+ $arrSingleIPs = array();
196
+ $arrNewRanges = array();
197
+ foreach($arrFormattedRange as $minValue => $maxValue)
198
+ {
199
+ if(1 == $maxValue)
200
+ {
201
+ $arrSingleIPs[$minValue] = $maxValue;
202
+ continue;
203
+ }
204
+
205
+ if( ($minValue > $ipNumber) || ($ipNumber > $maxValue) )
206
+ {
207
+ $arrNewRanges[] = array($minValue, $maxValue);
208
+ continue;
209
+ }
210
+
211
+ if($minValue == $ipNumber)
212
+ {
213
+ if($minValue + 1 <= $maxValue) {
214
+ $arrNewRanges[] = array( $minValue + 1, $maxValue );
215
+ }
216
+ unset($arrFormattedRange[$minValue]);
217
+ continue;
218
+ }
219
+
220
+ if($maxValue == $ipNumber)
221
+ {
222
+ if($minValue <= $maxValue - 1) {
223
+ $arrNewRanges[] = array( $minValue, $maxValue - 1 );
224
+ }
225
+ unset($arrFormattedRange[$minValue]);
226
+ continue;
227
+ }
228
+
229
+ if($minValue == $ipNumber - 1)
230
+ {
231
+ $arrSingleIPs[$minValue] = 1;
232
+ $arrNewRanges[] = array( $ipNumber + 1, $maxValue );
233
+ continue;
234
+ }
235
+
236
+ if($maxValue == $ipNumber + 1)
237
+ {
238
+ $arrSingleIPs[$maxValue] = 1;
239
+ $arrNewRanges[] = array( $minValue, $ipNumber -1 );
240
+ continue;
241
+ }
242
+
243
+ $arrNewRanges[] = array( $minValue, $ipNumber -1 );
244
+ $arrNewRanges[] = array( $ipNumber + 1, $maxValue);
245
+
246
+ }
247
+
248
+ $arrFormattedRange = $arrSingleIPs; unset($arrSingleIPs);
249
+
250
+ for($i = 0, $rangeLength = count($arrNewRanges); $i < $rangeLength; ++$i)
251
+ {
252
+ if($arrNewRanges[$i][0] < $arrNewRanges[$i][1])
253
+ continue;
254
+
255
+ $arrFormattedRange[$arrNewRanges[$i][0]] = 1;
256
+ unset($arrNewRanges[$i]);
257
+ }
258
+
259
+ $arrNewRanges = MchGdbcUtils::overlapIntervals($arrNewRanges);
260
+
261
+ foreach($arrNewRanges as $arrRange){
262
+ $arrFormattedRange[ $arrRange[0] ] = $arrRange[1];
263
+ }
264
+
265
+ return $arrFormattedRange;
266
+
267
+ }
268
+
269
+ public static function getFormattedIpRangeForDb($receivedIpAddress)
270
+ {
271
+ if(empty($receivedIpAddress))
272
+ return array();
273
+
274
+ $receivedIpAddress = trim($receivedIpAddress);
275
+
276
+ $arrPreparedData = array();
277
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion($receivedIpAddress);
278
+ if(-1 !== $ipVersion) // single IP
279
+ {
280
+ if($ipVersion === MchGdbcIPUtils::IP_VERSION_4)
281
+ {
282
+ $arrPreparedData[MchGdbcIPUtils::IP_VERSION_4] = array(MchGdbcIPUtils::ipAddressToNumber($receivedIpAddress), 1);
283
+ }
284
+ else
285
+ {
286
+ $arrPreparedData[MchGdbcIPUtils::IP_VERSION_6] = array(MchGdbcIPUtils::compressIPV6($receivedIpAddress), 1);
287
+ }
288
+
289
+ return $arrPreparedData;
290
+ }
291
+
292
+ $sanitizedRange = MchGdbcIPUtils::sanitizeCIDRRange($receivedIpAddress);
293
+ if(null !== $sanitizedRange) // CIDR Block
294
+ {
295
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion(MchGdbcIPUtils::sanitizeIpAddress($sanitizedRange));
296
+ if($ipVersion === MchGdbcIPUtils::IP_VERSION_4)
297
+ {
298
+ $sanitizedRange = MchGdbcIPUtils::getCIDRRangeBounds($sanitizedRange);
299
+ if(empty($sanitizedRange[0]) || empty($sanitizedRange[1]))
300
+ return array();
301
+
302
+ $sanitizedRange[0] = MchGdbcIPUtils::ipAddressToNumber($sanitizedRange[0]);
303
+ $sanitizedRange[1] = MchGdbcIPUtils::ipAddressToNumber($sanitizedRange[1]);
304
+
305
+ $arrPreparedData[$ipVersion] = $sanitizedRange;
306
+
307
+ }
308
+ else // IPV6
309
+ {
310
+ list($ipv6, $bits) = explode('/', $sanitizedRange, 2);
311
+
312
+ $ipv6 = MchGdbcIPUtils::compressIPV6($ipv6);
313
+
314
+ $arrPreparedData[ $ipVersion ] = $bits == MchGdbcIPUtils::IP_V6_MAX_BITS ? array($ipv6, 1) : array("$ipv6/$bits", 1);
315
+ }
316
+
317
+ return $arrPreparedData;
318
+ }
319
+ $arrSanitizedRange = explode('-', $receivedIpAddress, 2);
320
+ if(2 !== count($arrSanitizedRange))
321
+ return array();
322
+
323
+ $sanitizedLowIp = MchGdbcIPUtils::sanitizeIpAddress(MchGdbcIPUtils::sanitizeCIDRRange($arrSanitizedRange[0]));
324
+ $sanitizedHighIp = MchGdbcIPUtils::sanitizeIpAddress(MchGdbcIPUtils::sanitizeCIDRRange($arrSanitizedRange[1]));
325
+
326
+ if(!MchGdbcIPUtils::isValidIpAddress($sanitizedLowIp) || !MchGdbcIPUtils::isValidIpAddress($sanitizedHighIp)) {
327
+ return array();
328
+ }
329
+
330
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion($sanitizedLowIp);
331
+ if($ipVersion !== MchGdbcIPUtils::getIpAddressVersion($sanitizedHighIp))
332
+ return array();
333
+
334
+ if( $ipVersion !== MchGdbcIPUtils::IP_VERSION_4 ) // non standard range allowed just for IPv4
335
+ return array();
336
+
337
+ $minIpNumber = MchGdbcIPUtils::ipAddressToNumber($sanitizedLowIp, MchGdbcIPUtils::IP_VERSION_4);
338
+ $maxIpNumber = MchGdbcIPUtils::ipAddressToNumber($sanitizedHighIp, MchGdbcIPUtils::IP_VERSION_4);
339
+
340
+ if($minIpNumber >= $maxIpNumber) // single IP
341
+ {
342
+ $arrPreparedData[$ipVersion] = array($minIpNumber, 1);
343
+ }
344
+ else
345
+ {
346
+ $arrPreparedData[$ipVersion] = array($minIpNumber, $maxIpNumber);
347
+ }
348
+
349
+ return $arrPreparedData;
350
+
351
+ }
352
+
353
+
354
+ public static function getFormattedIpRangesForDisplay($arrSavedIpRanges)
355
+ {
356
+
357
+ $arrIps = array();
358
+ foreach((array)$arrSavedIpRanges as $ipVersion => $arrSavedIps)
359
+ {
360
+
361
+ foreach($arrSavedIps as $savedIp => $value)
362
+ {
363
+ if($ipVersion == MchGdbcIPUtils::IP_VERSION_6)
364
+ {
365
+ $arrIps[] = $savedIp . '|' . MchGdbcIPUtils::getCIDRNumberOfHosts($savedIp);
366
+ continue;
367
+ }
368
+
369
+ if($value === 1)
370
+ {
371
+ $arrIps[] = MchGdbcIPUtils::ipAddressFromNumber( $savedIp, MchGdbcIPUtils::IP_VERSION_4 ) . '|' . 1;
372
+
373
+ continue;
374
+ }
375
+
376
+ // $arrRange = explode('/', $savedIp);
377
+ // if(isset($arrRange[1]) && !isset($arrRange[2]))
378
+ // {
379
+ // $arrIps[] = $savedIp . '|' . MchGdbcIPUtils::getCIDRNumberOfHosts($savedIp);
380
+ //
381
+ // continue;
382
+ // }
383
+
384
+ $arrRange = array($savedIp , $value);
385
+ if(is_numeric($arrRange[0]) && is_numeric($arrRange[1]))
386
+ {
387
+ $displayIp = MchGdbcIPUtils::ipAddressFromNumber($arrRange[0], MchGdbcIPUtils::IP_VERSION_4) . ' - ' . MchGdbcIPUtils::ipAddressFromNumber($arrRange[1], MchGdbcIPUtils::IP_VERSION_4);
388
+ $displayIp .= '|' . ($arrRange[1] - $arrRange[0] + 1);
389
+ $arrIps[] = $displayIp;
390
+
391
+ continue;
392
+ }
393
+
394
+ }
395
+ }
396
+
397
+ return array_reverse($arrIps);
398
+ }
399
+
400
+
401
+
402
+
403
+ private function __construct(){}
404
+ }
engine/GdbcModulesController.php ADDED
@@ -0,0 +1,566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Copyright (C) 2014 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ spl_autoload_register(array('GdbcModulesController','autoLoadModulesClasses'));
22
+
23
+ final class GdbcModulesController
24
+ {
25
+ CONST MODULE_SETTINGS = 'Settings';
26
+ CONST MODULE_WORDPRESS = 'WordPress';
27
+ CONST MODULE_BRUTE_FORCE = 'BruteForce';
28
+
29
+ //CONST MODULE_POPULAR_FORMS = 'PopularForms';
30
+
31
+ CONST MODULE_REPORTS = 'Reports';
32
+
33
+ CONST MODULE_WOOCOMMERCE = 'WooCommerce';
34
+
35
+ CONST MODULE_MAIL_CHIMP_FOR_WP = 'MailChimpForWp';
36
+ CONST MODULE_MAIL_POET = 'MailPoet';
37
+
38
+ CONST MODULE_NINJA_FORMS = 'NinjaForms';
39
+ CONST MODULE_CONTACT_FORM_7 = 'ContactForm7';
40
+ CONST MODULE_GRAVITY_FORMS = 'GravityForms';
41
+ CONST MODULE_FAST_SECURE_FORM = 'FastSecureForm';
42
+ CONST MODULE_FORMIDABLE_FORMS = 'FormidableForms';
43
+ CONST MODULE_JETPACK_CONTACT_FORM = 'JetPackContactForm';
44
+
45
+
46
+ CONST MODULE_ULTIMATE_MEMBER = 'UltimateMember';
47
+ CONST MODULE_USER_PRO = 'UserPro';
48
+ CONST MODULE_UPME = 'UPME';
49
+ CONST MODULE_BUDDY_PRESS = 'BuddyPress';
50
+ CONST MODULE_BB_PRESS = 'BBPress';
51
+
52
+ CONST MODULE_BLACK_LISTED_IPS = 'BlackListedIps';
53
+ CONST MODULE_WHITE_LISTED_IPS = 'WhiteListedIps';
54
+
55
+ CONST MODULE_ZM_ALR = 'ZM-ALR';
56
+
57
+ CONST MODULE_SEAMLESS_DONATIONS = 'SeamlessDonations';
58
+ CONST MODULE_WORDPRESS_TWEAKS = 'WordPressTweaks';
59
+
60
+ CONST MODULE_PLANSO_FORMS = 'PlanSoForms';
61
+ CONST MODULE_EMAIL_NOTIFICATIONS = 'EmailNotifications';
62
+
63
+ private static $arrRegisteredModules = null;
64
+ private static $arrAllModules = array(
65
+
66
+
67
+ # --------- Default Modules -------------------------
68
+ self::MODULE_SETTINGS => array(
69
+ 'info' => array(
70
+ 'ModuleId' => 1,
71
+ 'IsPublic' => true,
72
+ ),
73
+
74
+ 'classes' => array(
75
+ 'GdbcSettingsAdminModule' => '/modules/settings/GdbcSettingsAdminModule.php',
76
+ 'GdbcSettingsPublicModule' => '/modules/settings/GdbcSettingsPublicModule.php',
77
+ ),
78
+
79
+ ),
80
+
81
+ self::MODULE_WORDPRESS => array(
82
+ 'info' => array(
83
+ 'ModuleId' => 2,
84
+ 'IsPublic' => true,
85
+ ),
86
+ 'classes' => array(
87
+ 'GdbcWordPressAdminModule' => '/modules/wordpress/GdbcWordPressAdminModule.php',
88
+ 'GdbcWordPressPublicModule' => '/modules/wordpress/GdbcWordPressPublicModule.php',
89
+ )
90
+ ),
91
+
92
+ # --------- Contact Forms Modules -------------------------
93
+ self::MODULE_JETPACK_CONTACT_FORM => array(
94
+ 'info' => array(
95
+ 'ModuleId' => 3,
96
+ 'IsPublic' => true,
97
+ ),
98
+ 'classes' => array(
99
+ 'GdbcJetPackContactFormAdminModule' => '/modules/jetpack-contact-form/GdbcJetPackContactFormAdminModule.php',
100
+ 'GdbcJetPackContactFormPublicModule' => '/modules/jetpack-contact-form/GdbcJetPackContactFormPublicModule.php',
101
+ )
102
+ ),
103
+
104
+
105
+ self::MODULE_NINJA_FORMS => array(
106
+ 'info' => array(
107
+ 'ModuleId' => 4,
108
+ 'IsPublic' => false,
109
+ ),
110
+ 'classes' => array(
111
+ 'GdbcNinjaFormsAdminModule' => '/modules/ninja-forms/GdbcNinjaFormsAdminModule.php',
112
+ 'GdbcNinjaFormsPublicModule' => '/modules/ninja-forms/GdbcNinjaFormsPublicModule.php',
113
+ )
114
+ ),
115
+
116
+ self::MODULE_CONTACT_FORM_7 => array(
117
+ 'info' => array(
118
+ 'ModuleId' => 5,
119
+ 'IsPublic' => false,
120
+ ),
121
+ 'classes' => array(
122
+ 'GdbcContactForm7AdminModule' => '/modules/contact-form-7/GdbcContactForm7AdminModule.php',
123
+ 'GdbcContactForm7PublicModule' => '/modules/contact-form-7/GdbcContactForm7PublicModule.php',
124
+ )
125
+ ),
126
+
127
+ self::MODULE_GRAVITY_FORMS => array(
128
+ 'info' => array(
129
+ 'ModuleId' => 6,
130
+ 'IsPublic' => false,
131
+ ),
132
+ 'classes' => array(
133
+ 'GdbcGravityFormsAdminModule' => '/modules/gravity-forms/GdbcGravityFormsAdminModule.php',
134
+ 'GdbcGravityFormsPublicModule' => '/modules/gravity-forms/GdbcGravityFormsPublicModule.php',
135
+ )
136
+ ),
137
+
138
+ self::MODULE_FAST_SECURE_FORM => array(
139
+ 'info' => array(
140
+ 'ModuleId' => 7,
141
+ 'IsPublic' => false,
142
+ ),
143
+ 'classes' => array(
144
+ 'GdbcFastSecureFormAdminModule' => '/modules/fast-secure-form/GdbcFastSecureFormAdminModule.php',
145
+ 'GdbcFastSecureFormPublicModule' => '/modules/fast-secure-form/GdbcFastSecureFormPublicModule.php',
146
+ )
147
+ ),
148
+
149
+ self::MODULE_FORMIDABLE_FORMS => array(
150
+ 'info' => array(
151
+ 'ModuleId' => 8,
152
+ 'IsPublic' => false,
153
+ ),
154
+ 'classes' => array(
155
+ 'GdbcFormidableFormsAdminModule' => '/modules/formidable-forms/GdbcFormidableFormsAdminModule.php',
156
+ 'GdbcFormidableFormsPublicModule' => '/modules/formidable-forms/GdbcFormidableFormsPublicModule.php',
157
+ )
158
+ ),
159
+
160
+
161
+ # --------- Community Modules -------------------------
162
+
163
+ self::MODULE_ULTIMATE_MEMBER => array(
164
+ 'info' => array(
165
+ 'ModuleId' => 9,
166
+ 'IsPublic' => true,
167
+ ),
168
+ 'classes' => array(
169
+ 'GdbcUltimateMemberAdminModule' => '/modules/ultimate-member/GdbcUltimateMemberAdminModule.php',
170
+ 'GdbcUltimateMemberPublicModule' => '/modules/ultimate-member/GdbcUltimateMemberPublicModule.php',
171
+ )
172
+ ),
173
+
174
+ self::MODULE_BUDDY_PRESS => array(
175
+ 'info' => array(
176
+ 'ModuleId' => 10,
177
+ 'IsPublic' => false,
178
+ ),
179
+ 'classes' => array(
180
+ 'GdbcBuddyPressAdminModule' => '/modules/buddy-press/GdbcBuddyPressAdminModule.php',
181
+ 'GdbcBuddyPressPublicModule' => '/modules/buddy-press/GdbcBuddyPressPublicModule.php',
182
+ )
183
+ ),
184
+
185
+ self::MODULE_BB_PRESS => array(
186
+ 'info' => array(
187
+ 'ModuleId' => 11,
188
+ 'IsPublic' => false,
189
+ ),
190
+ 'classes' => array(
191
+ 'GdbcBbPressAdminModule' => '/modules/bb-press/GdbcBbPressAdminModule.php',
192
+ 'GdbcBbPressPublicModule' => '/modules/bb-press/GdbcBbPressPublicModule.php',
193
+ )
194
+ ),
195
+
196
+ self::MODULE_USER_PRO => array(
197
+ 'info' => array(
198
+ 'ModuleId' => 12,
199
+ 'IsPublic' => false,
200
+ ),
201
+ 'classes' => array(
202
+ 'GdbcUserProAdminModule' => '/modules/user-pro/GdbcUserProAdminModule.php',
203
+ 'GdbcUserProPublicModule' => '/modules/user-pro/GdbcUserProPublicModule.php',
204
+ )
205
+ ),
206
+
207
+ self::MODULE_UPME => array(
208
+ 'info' => array(
209
+ 'ModuleId' => 13,
210
+ 'IsPublic' => false,
211
+ ),
212
+ 'classes' => array(
213
+ 'GdbcUPMEAdminModule' => '/modules/upme/GdbcUPMEAdminModule.php',
214
+ 'GdbcUPMEPublicModule' => '/modules/upme/GdbcUPMEPublicModule.php',
215
+ )
216
+ ),
217
+
218
+
219
+ # --------- Subscriptions Modules -------------------------
220
+
221
+
222
+ self::MODULE_MAIL_CHIMP_FOR_WP => array(
223
+ 'info' => array(
224
+ 'ModuleId' => 14,
225
+ 'IsPublic' => true,
226
+ ),
227
+ 'classes' => array(
228
+ 'GdbcMailChimpForWpAdminModule' => '/modules/mc-for-wp/GdbcMailChimpForWpAdminModule.php',
229
+ 'GdbcMailChimpForWpPublicModule' => '/modules/mc-for-wp/GdbcMailChimpForWpPublicModule.php',
230
+ )
231
+ ),
232
+
233
+ self::MODULE_MAIL_POET => array(
234
+ 'info' => array(
235
+ 'ModuleId' => 15,
236
+ 'IsPublic' => false,
237
+ ),
238
+ 'classes' => array(
239
+ 'GdbcMailPoetAdminModule' => '/modules/mail-poet/GdbcMailPoetAdminModule.php',
240
+ 'GdbcMailPoetPublicModule' => '/modules/mail-poet/GdbcMailPoetPublicModule.php',
241
+ )
242
+ ),
243
+
244
+ self::MODULE_WOOCOMMERCE => array(
245
+ 'info' => array(
246
+ 'ModuleId' => 16,
247
+ 'IsPublic' => false,
248
+ ),
249
+ 'classes' => array(
250
+ 'GdbcWooCommerceAdminModule' => '/modules/woocommerce/GdbcWooCommerceAdminModule.php',
251
+ 'GdbcWooCommercePublicModule' => '/modules/woocommerce/GdbcWooCommercePublicModule.php',
252
+ )
253
+ ),
254
+
255
+
256
+ self::MODULE_REPORTS => array(
257
+ 'info' => array(
258
+ 'ModuleId' => 17,
259
+ 'IsPublic' => true,
260
+ ),
261
+ 'classes' => array(
262
+ 'GdbcReportsAdminModule' => '/modules/reports/GdbcReportsAdminModule.php',
263
+ 'GdbcReportsPublicModule' => '/modules/reports/GdbcReportsPublicModule.php',
264
+ )
265
+ ),
266
+
267
+ self::MODULE_BRUTE_FORCE => array(
268
+ 'info' => array(
269
+ 'ModuleId' => 18,
270
+ 'IsPublic' => true,
271
+ ),
272
+ 'classes' => array(
273
+ 'GdbcBruteForceAdminModule' => '/modules/brute-force/GdbcBruteForceAdminModule.php',
274
+ 'GdbcBruteForcePublicModule' => '/modules/brute-force/GdbcBruteForcePublicModule.php',
275
+ )
276
+ ),
277
+
278
+
279
+ self::MODULE_BLACK_LISTED_IPS => array(
280
+ 'info' => array(
281
+ 'ModuleId' => 19,
282
+ 'IsPublic' => true,
283
+ ),
284
+ 'classes' => array(
285
+ 'GdbcBlackListedIpsAdminModule' => '/modules/black-listed-ips/GdbcBlackListedIpsAdminModule.php',
286
+ 'GdbcBlackListedIpsPublicModule' => '/modules/black-listed-ips/GdbcBlackListedIpsPublicModule.php',
287
+ )
288
+ ),
289
+
290
+ self::MODULE_WHITE_LISTED_IPS => array(
291
+ 'info' => array(
292
+ 'ModuleId' => 20,
293
+ 'IsPublic' => true,
294
+ ),
295
+ 'classes' => array(
296
+ 'GdbcWhiteListedIpsAdminModule' => '/modules/white-listed-ips/GdbcWhiteListedIpsAdminModule.php',
297
+ 'GdbcWhiteListedIpsPublicModule' => '/modules/white-listed-ips/GdbcWhiteListedIpsPublicModule.php',
298
+ )
299
+ ),
300
+
301
+ self::MODULE_ZM_ALR => array(
302
+ 'info' => array(
303
+ 'ModuleId' => 21,
304
+ 'IsPublic' => true,
305
+ ),
306
+ 'classes' => array(
307
+ 'GdbcZmAlrAdminModule' => '/modules/zm-ajax-login-register/GdbcZmAlrAdminModule.php',
308
+ 'GdbcZmAlrPublicModule' => '/modules/zm-ajax-login-register/GdbcZmAlrPublicModule.php',
309
+ )
310
+ ),
311
+
312
+ self::MODULE_SEAMLESS_DONATIONS => array(
313
+ 'info' => array(
314
+ 'ModuleId' => 22,
315
+ 'IsPublic' => true,
316
+ ),
317
+ 'classes' => array(
318
+ 'GdbcSeamlessDonationsAdminModule' => '/modules/seamless-donations/GdbcSeamlessDonationsAdminModule.php',
319
+ 'GdbcSeamlessDonationsPublicModule' => '/modules/seamless-donations/GdbcSeamlessDonationsPublicModule.php',
320
+ )
321
+ ),
322
+
323
+ self::MODULE_WORDPRESS_TWEAKS => array(
324
+ 'info' => array(
325
+ 'ModuleId' => 23,
326
+ 'IsPublic' => true,
327
+ ),
328
+ 'classes' => array(
329
+ 'GdbcWordPressTweaksAdminModule' => '/modules/wordpress-tweaks/GdbcWordPressTweaksAdminModule.php',
330
+ 'GdbcWordPressTweaksPublicModule' => '/modules/wordpress-tweaks/GdbcWordPressTweaksPublicModule.php',
331
+ )
332
+ ),
333
+
334
+ self::MODULE_EMAIL_NOTIFICATIONS => array(
335
+ 'info' => array(
336
+ 'ModuleId' => 24,
337
+ 'IsPublic' => true,
338
+ ),
339
+ 'classes' => array(
340
+ 'GdbcEmailNotificationsAdminModule' => '/modules/email-notifications/GdbcEmailNotificationsAdminModule.php',
341
+ 'GdbcEmailNotificationsPublicModule' => '/modules/email-notifications/GdbcEmailNotificationsPublicModule.php',
342
+ )
343
+ ),
344
+
345
+ self::MODULE_PLANSO_FORMS => array(
346
+ 'info' => array(
347
+ 'ModuleId' => 25,
348
+ 'IsPublic' => true,
349
+ ),
350
+ 'classes' => array(
351
+ 'GdbcPlanSoFormsAdminModule' => '/modules/planso-forms/GdbcPlanSoFormsAdminModule.php',
352
+ 'GdbcPlanSoFormsPublicModule' => '/modules/planso-forms/GdbcPlanSoFormsPublicModule.php',
353
+ )
354
+ ),
355
+
356
+ );
357
+
358
+ public static function getRegisteredModules()
359
+ {
360
+ if(null === self::$arrRegisteredModules)
361
+ self::setRegisteredModules();
362
+
363
+ return self::$arrRegisteredModules;
364
+ }
365
+
366
+ private static function setRegisteredModules()
367
+ {
368
+ if(null !== self::$arrRegisteredModules)
369
+ return;
370
+
371
+ self::$arrRegisteredModules = array();
372
+
373
+ $activatedPlugins = defined('WP_PLUGIN_DIR') ? array_merge( array_flip((array) get_option( 'active_plugins', array())), (array) get_site_option( 'active_sitewide_plugins', array() ) ) : array(); // wp_get_mu_plugins()
374
+
375
+ foreach(self::$arrAllModules as $moduleName => $arrModule)
376
+ {
377
+ self::$arrRegisteredModules[$moduleName] = array();
378
+
379
+ foreach ($arrModule['classes'] as $className => $filePath)
380
+ {
381
+ $filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . ( $dirPath = trim( dirname($filePath) , '/\\' ) . DIRECTORY_SEPARATOR . basename($filePath) );
382
+
383
+ if(file_exists($filePath))
384
+ {
385
+ self::$arrRegisteredModules[$moduleName][$className] = $filePath;
386
+ continue;
387
+ }
388
+
389
+ foreach($activatedPlugins as $activePlugin => $value)
390
+ {
391
+ if(false === strpos($activePlugin, 'GoodByeCaptcha')){
392
+ unset($activatedPlugins[$activePlugin]);continue;
393
+ }
394
+
395
+ if(false === strpos($activePlugin, "GoodByeCaptcha$moduleName"))
396
+ continue;
397
+
398
+ $filePath = @dirname(WP_PLUGIN_DIR . '/' . $activePlugin ) . "/engine/$dirPath" ;
399
+
400
+ break;
401
+
402
+ }
403
+
404
+ file_exists($filePath) ? self::$arrRegisteredModules[$moduleName][$className] = $filePath : null;
405
+ }
406
+
407
+ if(empty(self::$arrRegisteredModules[$moduleName]))
408
+ unset(self::$arrRegisteredModules[$moduleName]);
409
+ }
410
+
411
+
412
+ }
413
+
414
+
415
+ public static function getModuleIdByName($moduleName)
416
+ {
417
+ return isset(self::$arrAllModules[$moduleName]['info']['ModuleId']) ? self::$arrAllModules[$moduleName]['info']['ModuleId'] : null;
418
+ }
419
+
420
+ public static function isPublicModule($moduleIdORmoduleName)
421
+ {
422
+ $moduleName = ((false === filter_var($moduleIdORmoduleName, FILTER_VALIDATE_INT)) ? $moduleIdORmoduleName : self::getModuleNameById($moduleIdORmoduleName));
423
+
424
+ if(!isset(self::$arrAllModules[$moduleName]['info']['IsPublic']))
425
+ return false;
426
+
427
+ #Returns TRUE for true, "1", "true", "on" and "yes"
428
+ return (false === filter_var(self::$arrAllModules[$moduleName]['info']['IsPublic'], FILTER_VALIDATE_BOOLEAN)) ? false : true;
429
+ }
430
+
431
+
432
+ public static function unRegisterModule($moduleName)
433
+ {
434
+ unset(self::$arrRegisteredModules[(string)$moduleName]);
435
+ }
436
+
437
+
438
+ public static function getPublicModulesName()
439
+ {
440
+ $arrFreeModules = array();
441
+ foreach(self::$arrAllModules as $moduleName => $arrAllModulesettings)
442
+ {
443
+ self::isPublicModule($moduleName) ? $arrFreeModules[] = $moduleName : null;
444
+ }
445
+
446
+ return $arrFreeModules;
447
+ }
448
+
449
+ public static function getModuleNameById($moduleId)
450
+ {
451
+ foreach(self::$arrAllModules as $moduleKey => $moduleValue)
452
+ {
453
+ if (isset($moduleValue['info']['ModuleId']) && $moduleValue['info']['ModuleId'] == $moduleId)
454
+ return $moduleKey;
455
+ }
456
+
457
+ return null;
458
+ }
459
+
460
+ public static function getModuleOptionDisplayText($moduleId, $optionId)
461
+ {
462
+ if(null === ($moduleAdminInstance = self::getAdminModuleInstance(self::getModuleNameById($moduleId))))
463
+ return null;
464
+
465
+ return $moduleAdminInstance->getOptionDisplayTextByOptionId($optionId);
466
+ }
467
+
468
+ public static function getModuleOptionId($moduleName, $optionName)
469
+ {
470
+ if(null === ($moduleAdminInstance = self::getAdminModuleInstance($moduleName)))
471
+ return null;
472
+
473
+ return $moduleAdminInstance->getOptionIdByOptionName($optionName);
474
+ }
475
+
476
+ public static function getModuleDirectoryPath($moduleName)
477
+ {
478
+ if(null === self::$arrRegisteredModules)
479
+ self::setRegisteredModules();
480
+
481
+ if(!isset(self::$arrRegisteredModules[$moduleName]) || !is_array(self::$arrRegisteredModules[$moduleName]))
482
+ return null;
483
+
484
+ return @dirname(reset(self::$arrRegisteredModules[$moduleName]));
485
+ }
486
+
487
+ /**
488
+ *
489
+ * @staticvar array $arrInstances
490
+ * @param string $moduleName
491
+ * @param int $moduleType
492
+ * @return \MchGdbcBaseModule | null
493
+ */
494
+ private static function getModuleInstance($moduleName, $moduleType)
495
+ {
496
+ if(null === self::$arrRegisteredModules)
497
+ self::setRegisteredModules();
498
+
499
+ if(!isset(self::$arrRegisteredModules[$moduleName]))
500
+ return null;
501
+
502
+ foreach (self::$arrRegisteredModules[$moduleName] as $moduleClassName => $filePath)
503
+ {
504
+ if(1 === $moduleType && (false === strpos($moduleClassName, 'Admin')))
505
+ continue;
506
+ elseif(2 === $moduleType && (false === strpos($moduleClassName, 'Public')))
507
+ continue;
508
+
509
+ if(!method_exists($moduleClassName, 'getInstance'))
510
+ return null;
511
+
512
+ if(false !== ($moduleInstance = call_user_func(array($moduleClassName, 'getInstance'))))
513
+ return $moduleInstance;
514
+ }
515
+
516
+ return null;
517
+ }
518
+
519
+ /**
520
+ * @param string $moduleName Module name
521
+ *
522
+ * @return \GdbcBaseAdminModule|null
523
+ */
524
+ public static function getAdminModuleInstance($moduleName)
525
+ {
526
+ return self::getModuleInstance($moduleName, 1);
527
+ }
528
+
529
+ /**
530
+ * @param string $moduleName Module name
531
+ *
532
+ * @return \MchGdbcBasePublicModule|null
533
+ */
534
+ public static function getPublicModuleInstance($moduleName)
535
+ {
536
+ return self::getModuleInstance($moduleName, 2);
537
+ }
538
+
539
+
540
+ /**
541
+ * @param $moduleName string Module name
542
+ *
543
+ * @return bool
544
+ */
545
+ public static function isModuleRegistered($moduleName)
546
+ {
547
+ if(null === self::$arrRegisteredModules)
548
+ self::setRegisteredModules();
549
+
550
+ return isset(self::$arrRegisteredModules[$moduleName]);
551
+ }
552
+
553
+ public static function autoLoadModulesClasses($moduleClassName)
554
+ {
555
+ if(null === self::$arrRegisteredModules)
556
+ self::setRegisteredModules();
557
+
558
+ foreach(self::$arrRegisteredModules as $arrModuleClasses)
559
+ {
560
+ if(!isset($arrModuleClasses[$moduleClassName]))
561
+ continue;
562
+
563
+ return require_once($arrModuleClasses[$moduleClassName]);
564
+ }
565
+ }
566
+ }
engine/GdbcNotificationsController.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GdbcNotificationsController
21
+ {
22
+ public static function sendTestModeEmailNotification(GdbcAttemptEntity $gdbcAttemptEntity)
23
+ {
24
+ GdbcEmailNotificationsPublicModule::getInstance()->EmailSubject = __('GoodBye Captcha - Test Mode Notification', GoodByeCaptcha::PLUGIN_SLUG);
25
+
26
+ $clientIpAddress = GdbcIPUtils::getClientIpAddress();
27
+ $currentSiteLink = MchGdbcWpUtils::getCurrentBlogLink();
28
+ $adminFullName = MchGdbcWpUtils::getAdminFullName();
29
+ empty($adminFullName) ? $adminFullName = MchGdbcWpUtils::getAdminDisplayName() : null;
30
+
31
+ $submittedForm = GdbcModulesController::getModuleNameById($gdbcAttemptEntity->ModuleId);
32
+ $submittedForm .= empty($gdbcAttemptEntity->SectionId) ? '' : '/' . GdbcModulesController::getModuleOptionDisplayText($gdbcAttemptEntity->ModuleId, $gdbcAttemptEntity->SectionId);
33
+
34
+ $rejectReason = GdbcRequestController::tokenAlreadyRejected() ? GdbcRequestController::getRejectReasonDescription(GdbcRequestController::getRejectReasonId()) : null;
35
+
36
+ $moduleDirPath = GdbcModulesController::getModuleDirectoryPath(GdbcModulesController::MODULE_EMAIL_NOTIFICATIONS);
37
+
38
+ if(empty($moduleDirPath))
39
+ {
40
+ GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = __('GoodBye Captcha encountered an error while trying to parse the email template!', GoodByeCaptcha::PLUGIN_SLUG);
41
+ }
42
+ else
43
+ {
44
+ ob_start();
45
+ require_once ($moduleDirPath . '/templates/notification-test-mode.php');
46
+ GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = ob_get_clean() . "\n";
47
+ }
48
+
49
+ GdbcEmailNotificationsPublicModule::getInstance()->send(true);
50
+
51
+ }
52
+
53
+ public static function sendBruteForceAttackDetectedEmailNotification(array $arrLoginAttempts)
54
+ {
55
+
56
+ if( ! GdbcEmailNotificationsPublicModule::getInstance()->getOption(GdbcEmailNotificationsAdminModule::OPTION_BRUTE_FORCE_ATTACK_DETECTED) )
57
+ return;
58
+
59
+ GdbcEmailNotificationsPublicModule::getInstance()->EmailSubject = __('Alert - Brute Force Attack Detected by GoodBye Captcha!', GoodByeCaptcha::PLUGIN_SLUG);
60
+
61
+ $adminFullName = MchGdbcWpUtils::getAdminFullName();
62
+ empty($adminFullName) ? $adminFullName = MchGdbcWpUtils::getAdminDisplayName() : null;
63
+
64
+ $totalHits = 0;
65
+ $totalIPs = 0;
66
+ $totalProxyAnonym = 0;
67
+ $totalWebAttackers = 0;
68
+ $totalBlackListed = 0;
69
+
70
+ $detectedDate = get_date_from_gmt ( date( 'Y-m-d H:i:s', MchGdbcHttpRequest::getServerRequestTime() ), 'l, F d, Y');
71
+ $detectedTime = get_date_from_gmt ( date( 'Y-m-d H:i:s', MchGdbcHttpRequest::getServerRequestTime() ), 'H:i:s');
72
+
73
+ foreach($arrLoginAttempts as $clientIp => $hits)
74
+ {
75
+ $totalHits += $hits;
76
+ $totalIPs++;
77
+
78
+ $loginAttempt = new stdClass();
79
+ $loginAttempt->IsIpBlackListed = GdbcIPUtils::isIpBlackListed($clientIp);
80
+ $loginAttempt->IsIpProxyAnonym = GdbcIPUtils::isIpProxyAnonymizer($clientIp);
81
+ $loginAttempt->IsIpWebAttacker = GdbcIPUtils::isIpWebAttacker($clientIp);
82
+
83
+
84
+ $totalBlackListed += $loginAttempt->IsIpBlackListed ? 1 : 0;
85
+ $totalWebAttackers += $loginAttempt->IsIpWebAttacker ? 1 : 0;
86
+ $totalProxyAnonym += ($loginAttempt->IsIpProxyAnonym && !$loginAttempt->IsIpWebAttacker) ? 1 : 0;
87
+ }
88
+
89
+ if( 0 === $totalIPs )
90
+ return;
91
+
92
+ $totalBlackListed = $totalBlackListed . ' (' . number_format( 100 - ( ($totalIPs - $totalBlackListed) * (100 / $totalIPs) ), 2, '.', '' ) . '%)';
93
+ $totalWebAttackers = $totalWebAttackers . ' (' . number_format( 100 - ( ($totalIPs - $totalWebAttackers) * (100 / $totalIPs) ), 2, '.', '' ) . '%)';
94
+ $totalProxyAnonym = $totalProxyAnonym . ' (' . number_format( 100 - ( ($totalIPs - $totalProxyAnonym) * (100 / $totalIPs) ), 2, '.', '' ) . '%)';
95
+
96
+ $arrReplaceableContent = array(
97
+
98
+ '{current-site-link}' => MchGdbcWpUtils::getCurrentBlogLink(),
99
+ '{admin-full-name}' => $adminFullName,
100
+ '{total-hits}' => $totalHits,
101
+ '{total-ips}' => $totalIPs,
102
+ '{total-black-listed}' => $totalBlackListed,
103
+ '{total-web-attackers}' => $totalWebAttackers,
104
+ '{total-proxy-anonymizers}' => $totalProxyAnonym,
105
+ '{detection-date-time}' => $detectedDate . ' at ' . $detectedTime,
106
+ );
107
+
108
+ $arrSuggestions = array(
109
+ GdbcBruteForceAdminModule::OPTION_AUTO_BLOCK_IP => GdbcBruteForceAdminModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_AUTO_BLOCK_IP),
110
+ GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS => GdbcBruteForceAdminModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS),
111
+ GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY => GdbcBruteForceAdminModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY),
112
+ );
113
+
114
+ foreach($arrSuggestions as $optionName => &$optionInfo)
115
+ {
116
+ if(!empty($optionInfo))
117
+ {
118
+ unset($arrSuggestions[$optionName]);
119
+ continue;
120
+ }
121
+
122
+
123
+ $arrDefaultOptions = GdbcBruteForceAdminModule::getInstance()->getDefaultOptions();
124
+ if(!isset($arrDefaultOptions[$optionName]['LabelText']))
125
+ continue;
126
+
127
+ $optionInfo = $arrDefaultOptions[$optionName]['LabelText'];
128
+ }
129
+
130
+ $moduleDirPath = GdbcModulesController::getModuleDirectoryPath(GdbcModulesController::MODULE_EMAIL_NOTIFICATIONS);
131
+ if(empty($moduleDirPath))
132
+ {
133
+ GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = __("Brute Force attack detected on " . MchGdbcWpUtils::getCurrentBlogLink(), GoodByeCaptcha::PLUGIN_SLUG);
134
+ }
135
+ else
136
+ {
137
+ ob_start();
138
+ require_once ($moduleDirPath . '/templates/notification-brute-force-attack.php');
139
+ $emailContent = ob_get_clean();
140
+
141
+ $emailContent = str_replace(array_keys($arrReplaceableContent), array_values($arrReplaceableContent), $emailContent);
142
+
143
+ GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = $emailContent;
144
+ }
145
+
146
+ unset($emailContent, $arrLoginAttempts, $moduleDirPath, $totalHits, $totalIPs, $totalProxyAnonym, $totalWebAttackers);
147
+
148
+ GdbcEmailNotificationsPublicModule::getInstance()->send(true);
149
+
150
+ }
151
+
152
+ }
engine/GdbcRequestController.php ADDED
@@ -0,0 +1,288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Copyright (C) 2014 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ final class GdbcRequestController
22
+ {
23
+
24
+ CONST TOKEN_SEPARATOR = '|';
25
+
26
+ CONST REJECT_REASON_TOKEN_INVALID = 1;
27
+ CONST REJECT_REASON_TOKEN_MISSING = 2;
28
+ CONST REJECT_REASON_TOKEN_EXPIRED = 3;
29
+ CONST REJECT_REASON_TOKEN_SUBMITTED_EARLY = 4;
30
+ CONST REJECT_REASON_CLIENT_IP_BLOCKED = 5;
31
+ CONST REJECT_REASON_BROWSER_INFO_MISSING = 6;
32
+ CONST REJECT_REASON_BROWSER_INFO_INVALID = 7;
33
+ CONST REJECT_REASON_CLIENT_IP_UNDETECTABLE = 8;
34
+ CONST REJECT_REASON_USER_ENUMERATION = 9;
35
+ CONST REJECT_REASON_PROXY_ANONYMIZER = 10;
36
+ CONST REJECT_REASON_WEB_ATTACKER = 11;
37
+ CONST REJECT_REASON_SERVICE_UNAVAILABLE = 12;
38
+
39
+ private static $rejectReasonCode = null;
40
+ private static $browserInfoInputName = null;
41
+
42
+
43
+ public static function isValid(GdbcAttemptEntity $attemptEntity)
44
+ {
45
+ static $isRequestValid = null;
46
+
47
+ if(null !== $isRequestValid)
48
+ return $isRequestValid;
49
+
50
+ $settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
51
+ if(null === $settingsModuleInstance)
52
+ return $isRequestValid = false;
53
+
54
+ $isTestModeActivated = (bool)$settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_TEST_MODE_ACTIVATED);
55
+
56
+ if( (!$isTestModeActivated) && GdbcIPUtils::isClientIpWhiteListed())
57
+ return $isRequestValid = true;
58
+
59
+ if( self::isReceivedTokenValid($attemptEntity) && GdbcIPUtils::isClientIpBlackListed()){
60
+ self::$rejectReasonCode = self::REJECT_REASON_CLIENT_IP_BLOCKED;
61
+ }
62
+ elseif( (null === self::$rejectReasonCode) && GdbcIPUtils::isClientIpWebAttacker()){
63
+ self::$rejectReasonCode = self::REJECT_REASON_WEB_ATTACKER;
64
+ }
65
+ elseif( (null === self::$rejectReasonCode) && GdbcIPUtils::isClientIpProxyAnonymizer()){
66
+ self::$rejectReasonCode = self::REJECT_REASON_PROXY_ANONYMIZER;
67
+ }
68
+
69
+ if($isTestModeActivated){
70
+ GdbcNotificationsController::sendTestModeEmailNotification($attemptEntity);
71
+ self::$rejectReasonCode = null;
72
+ }
73
+
74
+ if(null === self::$rejectReasonCode){
75
+ return $isRequestValid = true;
76
+ }
77
+
78
+ $attemptEntity->ReasonId = self::getRejectReasonId();
79
+ GdbcBruteGuardian::logRejectedAttempt($attemptEntity);
80
+
81
+ return $isRequestValid = false;
82
+
83
+ }
84
+
85
+
86
+ private static function isReceivedTokenValid(GdbcAttemptEntity $attemptEntity)
87
+ {
88
+ if(self::$rejectReasonCode !== null) {
89
+ return false;
90
+ }
91
+
92
+ $settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
93
+ if(null === $settingsModuleInstance)
94
+ return false;
95
+
96
+ $tokenSecretKey = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_TOKEN_SECRET_KEY);
97
+ $hiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
98
+
99
+ $minSubmissionTime = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_MIN_SUBMISSION_TIME);
100
+
101
+ // $isPluginInTestMode = (bool)$settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_TEST_MODE_ACTIVATED);
102
+
103
+ $isProtectionDisabled = ((bool)$settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_DISABLE_IF_USER_LOGGED_IN)) && MchGdbcWpUtils::isUserLoggedIn();
104
+ if($isProtectionDisabled) {
105
+ return true;
106
+ }
107
+
108
+ if(null === GdbcIPUtils::getClientIpAddress())
109
+ {
110
+ self::$rejectReasonCode = self::REJECT_REASON_CLIENT_IP_UNDETECTABLE;
111
+ return false;
112
+ }
113
+
114
+ $receivedToken = isset($_POST[$hiddenInputName]) ? $_POST[$hiddenInputName] : null;
115
+
116
+ if(null === $receivedToken){
117
+ self::$rejectReasonCode = self::REJECT_REASON_TOKEN_MISSING;
118
+ return false;
119
+ }
120
+
121
+ if(!isset($receivedToken[10])) {
122
+ self::$rejectReasonCode = self::REJECT_REASON_TOKEN_INVALID;
123
+ return false;
124
+ }
125
+
126
+ $arrDecryptedToken = json_decode(MchCrypt::decryptToken($tokenSecretKey, $receivedToken), true);
127
+
128
+ // if($isPluginInTestMode)
129
+ // {
130
+ // //$this->arrTokenDebugData['received-info'] = $arrDecryptedToken;
131
+ // //$this->arrTokenDebugData['token-data'] = $this->getTokenData();
132
+ // }
133
+
134
+ if( !isset($arrDecryptedToken[0]) || false === ($tokenIndex = strpos($arrDecryptedToken[0], self::TOKEN_SEPARATOR)) )
135
+ {
136
+ self::$rejectReasonCode = self::REJECT_REASON_TOKEN_INVALID;
137
+ return false;
138
+ }
139
+
140
+ self::$browserInfoInputName = substr($arrDecryptedToken[0], 0, $tokenIndex);
141
+
142
+ $receivedBrowserInfoInput = isset($_POST[self::$browserInfoInputName]) ? $_POST[self::$browserInfoInputName] : null;
143
+
144
+ if( null === $receivedBrowserInfoInput )
145
+ {
146
+ self::$rejectReasonCode = self::REJECT_REASON_BROWSER_INFO_MISSING;
147
+ return false;
148
+ }
149
+
150
+ $receivedBrowserInfoInput = MchGdbcUtils::replaceNonAlphaNumericCharacters($receivedBrowserInfoInput, '');
151
+
152
+ if($arrDecryptedToken[0] !== self::$browserInfoInputName . self::TOKEN_SEPARATOR . $receivedBrowserInfoInput)
153
+ {
154
+ self::$rejectReasonCode = self::REJECT_REASON_BROWSER_INFO_INVALID;
155
+ return false;
156
+ }
157
+
158
+ array_shift($arrDecryptedToken);
159
+
160
+ $arrTokenData = self::getTokenData();
161
+
162
+ $timeSinceGenerated = ((int)array_pop($arrTokenData)) - ((int)array_pop($arrDecryptedToken));
163
+
164
+ if($timeSinceGenerated < $minSubmissionTime)
165
+ {
166
+ if( ! GoodByeCaptchaUtils::isLoginAttemptEntity($attemptEntity) ){
167
+ self::$rejectReasonCode = self::REJECT_REASON_TOKEN_SUBMITTED_EARLY;
168
+ return false;
169
+ }
170
+ }
171
+
172
+ if(count(array_diff($arrDecryptedToken, $arrTokenData)) !== 0)
173
+ {
174
+ self::$rejectReasonCode = self::REJECT_REASON_TOKEN_INVALID;
175
+ return false;
176
+ }
177
+
178
+ unset($_POST[self::$browserInfoInputName], $_POST[$hiddenInputName]);
179
+
180
+ global $ultimatemember;
181
+
182
+ if(isset($ultimatemember->form))
183
+ {
184
+ unset($ultimatemember->form->post_form[self::$browserInfoInputName], $ultimatemember->form->post_form[$hiddenInputName]);
185
+ unset($ultimatemember->form->post_form['submitted'][self::$browserInfoInputName], $ultimatemember->form->post_form['submitted'][$hiddenInputName]);
186
+ }
187
+
188
+ return true;
189
+
190
+ }
191
+
192
+
193
+ public static function getEncryptedToken()
194
+ {
195
+ if( ! isset($_POST['browserInfo']) || null === ($arrBrowserInfo = json_decode(stripcslashes($_POST['browserInfo']), true)))
196
+ return array();
197
+
198
+ foreach ((array)$arrBrowserInfo as $prop => $propValue)
199
+ {
200
+ if(!is_array($propValue) && false === strpos($prop, ' '))
201
+ continue;
202
+
203
+ unset($arrBrowserInfo[$prop]);
204
+ }
205
+
206
+ if( ($arrBrowserInfoLength = count($arrBrowserInfo)) < 3)
207
+ return array();
208
+
209
+ $arrKeysToSave = array_flip((array)array_rand($arrBrowserInfo, mt_rand(3, $arrBrowserInfoLength - 1)));
210
+
211
+ foreach ($arrKeysToSave as $key => &$val)
212
+ {
213
+ $val = var_export($arrBrowserInfo[$key], true);
214
+ }
215
+
216
+ $arrTokenData = self::getTokenData();
217
+ $browserField = MchGdbcUtils::replaceNonAlphaCharacters(MchCrypt::getRandomString(25), '-');
218
+
219
+ array_unshift($arrTokenData, $browserField . self::TOKEN_SEPARATOR . MchGdbcUtils::replaceNonAlphaNumericCharacters(implode('', array_values($arrKeysToSave)), ''));
220
+
221
+ return array(
222
+ 'token' => MchCrypt::encryptToken(GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_TOKEN_SECRET_KEY), json_encode($arrTokenData)),
223
+ $browserField => implode(self::TOKEN_SEPARATOR, array_keys($arrKeysToSave))
224
+ );
225
+
226
+ }
227
+
228
+
229
+ private static function getTokenData()
230
+ {
231
+ $arrData = array();
232
+
233
+ $arrData[] = get_current_blog_id();
234
+ $arrData[] = GdbcIPUtils::getClientIpAddress();
235
+ $arrData[] = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_TOKEN_CREATED_TIMESTAMP);
236
+ $arrData[] = MchGdbcHttpRequest::getServerRequestTime();
237
+
238
+ return array_filter($arrData);
239
+ }
240
+
241
+ public static function tokenAlreadyRejected()
242
+ {
243
+ return null !== self::$rejectReasonCode;
244
+ }
245
+
246
+ public static function getRejectReasonId()
247
+ {
248
+ return self::$rejectReasonCode;
249
+ }
250
+
251
+ public static function getRejectReasonDescription($reasonId)
252
+ {
253
+ static $arrReasonDescription = null;
254
+ if(null === $arrReasonDescription)
255
+ {
256
+ $arrReasonDescription = array(
257
+
258
+ self::REJECT_REASON_TOKEN_INVALID => __('Invalid Token', GoodByeCaptcha::PLUGIN_SLUG),
259
+ self::REJECT_REASON_TOKEN_MISSING => __('Token Not Submitted', GoodByeCaptcha::PLUGIN_SLUG),
260
+ self::REJECT_REASON_TOKEN_EXPIRED => __('Token Expired', GoodByeCaptcha::PLUGIN_SLUG),
261
+ self::REJECT_REASON_TOKEN_SUBMITTED_EARLY => __('Token Submitted Early', GoodByeCaptcha::PLUGIN_SLUG),
262
+ self::REJECT_REASON_CLIENT_IP_BLOCKED => __('Client IP Blocked', GoodByeCaptcha::PLUGIN_SLUG),
263
+ self::REJECT_REASON_BROWSER_INFO_MISSING => __('Browser Info Missing', GoodByeCaptcha::PLUGIN_SLUG),
264
+ self::REJECT_REASON_BROWSER_INFO_INVALID => __('Browser Info Invalid', GoodByeCaptcha::PLUGIN_SLUG),
265
+ self::REJECT_REASON_CLIENT_IP_UNDETECTABLE => __('Undetectable Client IP', GoodByeCaptcha::PLUGIN_SLUG),
266
+ self::REJECT_REASON_USER_ENUMERATION => __('User Enumeration', GoodByeCaptcha::PLUGIN_SLUG),
267
+ self::REJECT_REASON_PROXY_ANONYMIZER => __('Proxy Anonymizer', GoodByeCaptcha::PLUGIN_SLUG),
268
+ self::REJECT_REASON_WEB_ATTACKER => __('Web Attacker', GoodByeCaptcha::PLUGIN_SLUG),
269
+ self::REJECT_REASON_SERVICE_UNAVAILABLE => __('Service Unavailable', GoodByeCaptcha::PLUGIN_SLUG),
270
+ );
271
+ }
272
+
273
+ return isset($arrReasonDescription[$reasonId]) ? $arrReasonDescription[$reasonId] : __('Unknown', GoodByeCaptcha::PLUGIN_SLUG);
274
+
275
+ }
276
+
277
+
278
+ public static function getPostedBrowserInfoInputName()
279
+ {
280
+ return self::$browserInfoInputName;
281
+ }
282
+
283
+ public static function redirectToHomePage()
284
+ {
285
+ wp_redirect( home_url() ); exit;
286
+ }
287
+
288
+ }
engine/GdbcTaskScheduler.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GdbcTaskScheduler
21
+ {
22
+ private static function getGdbcTasks()
23
+ {
24
+ return array(
25
+ new GdbcLogsCleanerTask(MchGdbcWpTaskScheduler::SECONDS_IN_DAY, true),
26
+ );
27
+
28
+ // static $arrGdbcTasks = array();
29
+ // if(!empty($arrGdbcTasks))
30
+ // return $arrGdbcTasks;
31
+ //
32
+ // $arrGdbcTasks[] = new GdbcLogsCleanerTask(MchGdbcWpTaskScheduler::SECONDS_IN_DAY, true);
33
+ //
34
+ // return $arrGdbcTasks;
35
+ }
36
+
37
+ public static function scheduleGdbcTasks()
38
+ {
39
+ foreach(self::getGdbcTasks() as $gdbcTask)
40
+ {
41
+ MchGdbcWpTaskScheduler::getInstance()->registerTask($gdbcTask);
42
+ }
43
+
44
+ MchGdbcWpTaskScheduler::getInstance()->scheduleRegisteredTasks();
45
+ }
46
+
47
+ public static function unScheduleGdbcTasks()
48
+ {
49
+ foreach(self::getGdbcTasks() as $gdbcTask)
50
+ {
51
+ MchGdbcWpTaskScheduler::getInstance()->registerTask($gdbcTask);
52
+ MchGdbcWpTaskScheduler::getInstance()->unScheduleRegisteredTask($gdbcTask);
53
+ }
54
+ }
55
+
56
+ private function __construct(){}
57
+ private function __clone(){}
58
+ }
engine/GdbcUpdatesController.php ADDED
@@ -0,0 +1,317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GdbcUpdatesController
21
+ {
22
+ public static function updateToCurrentVersion()
23
+ {
24
+
25
+ if(null === ($settingsModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_SETTINGS)))
26
+ return;
27
+
28
+ $savedPluginVersion = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_PLUGIN_VERSION);
29
+
30
+ if(null === $savedPluginVersion) // fresh install. Save default options
31
+ {
32
+ foreach(array_keys(GdbcModulesController::getRegisteredModules()) as $moduleName)
33
+ {
34
+ if(null === ($adminModuleInstance = GdbcModulesController::getAdminModuleInstance($moduleName)))
35
+ continue;
36
+
37
+ foreach($adminModuleInstance->getDefaultOptionsValues() as $optionName => $optionValue)
38
+ {
39
+ if( ! is_scalar($optionValue) )
40
+ continue;
41
+
42
+ $adminModuleInstance->saveOption($optionName, $optionValue);
43
+ }
44
+ }
45
+ }
46
+
47
+ $arrPublicModulesKeys = array_flip(GdbcModulesController::getPublicModulesName());
48
+ foreach( array_keys(GdbcModulesController::getRegisteredModules()) as $registeredModuleName)
49
+ {
50
+ if( isset( $arrPublicModulesKeys[$registeredModuleName] ) )
51
+ continue;
52
+
53
+ if( ! defined("GoodByeCaptcha$registeredModuleName::MODULE_VERSION") || -1 !== version_compare(constant("GoodByeCaptcha$registeredModuleName::MODULE_VERSION"), '2.0') )
54
+ continue;
55
+
56
+ GdbcModulesController::unRegisterModule($registeredModuleName);
57
+ remove_action('plugins_loaded', array("GoodByeCaptcha$registeredModuleName", 'getInstance'));
58
+
59
+ }
60
+ remove_action('plugins_loaded', array( 'GoodByeCaptchaPro', 'getInstance' ));
61
+
62
+ if(MchGdbcWpUtils::isUserInDashboard())
63
+ {
64
+ $arrActiveSites = MchGdbcWpUtils::isMultiSite() ? MchGdbcWpUtils::getAllBlogIds() : array(get_current_blog_id());
65
+
66
+ foreach($arrActiveSites as $blogId) {
67
+ self::migrateTableDataFromV1($blogId);
68
+ }
69
+ }
70
+
71
+ if( 0 === version_compare($savedPluginVersion, GoodByeCaptcha::PLUGIN_VERSION) )
72
+ return;
73
+
74
+
75
+ $arrActiveSites = MchGdbcWpUtils::isMultiSite() ? MchGdbcWpUtils::getAllBlogIds() : array(get_current_blog_id());
76
+
77
+ if( -1 === version_compare($savedPluginVersion, '2.0') )
78
+ {
79
+ GdbcTaskScheduler::unScheduleGdbcTasks();
80
+ delete_site_option('gdbc-blocked-attempts');
81
+
82
+ self::updateToVersion_2_0();
83
+
84
+ foreach($arrActiveSites as $blogId){
85
+ self::migrateTableDataFromV1($blogId);
86
+ }
87
+
88
+ }
89
+
90
+
91
+ $settingsModuleInstance->saveOption(GdbcSettingsAdminModule::OPTION_PLUGIN_VERSION, GoodByeCaptcha::PLUGIN_VERSION);
92
+
93
+
94
+ GoodByeCaptchaUtils::flushSiteCache();
95
+
96
+ if(GoodByeCaptcha::isNetworkActivated()){
97
+ foreach($arrActiveSites as $blogId){
98
+ $blogId != get_current_blog_id() ? GoodByeCaptchaUtils::flushSiteCache($blogId) : null;
99
+ }
100
+ }
101
+
102
+
103
+ }
104
+
105
+ private static function updateToVersion_2_0()
106
+ {
107
+ global $wpdb;
108
+
109
+ $suppressOldValue = $wpdb->suppress_errors(true);
110
+ $wpdb->hide_errors();
111
+
112
+ if(!GdbcDbAccessController::attemptsTableExists()){
113
+ GdbcDbAccessController::createAttemptsTable();
114
+ }
115
+
116
+ $arrBlogs = MchGdbcWpUtils::isMultiSite() ? MchGdbcWpUtils::getAllBlogIds() : array(get_current_blog_id());
117
+
118
+ foreach($arrBlogs as $blogId)
119
+ {
120
+ $blogTablePrefix = $wpdb->get_blog_prefix($blogId);
121
+
122
+ $gdbcTableName = $blogTablePrefix . 'gdbc_attempts';
123
+
124
+ if($wpdb->get_var("SHOW TABLES LIKE '$gdbcTableName'") !== $gdbcTableName)
125
+ continue;
126
+
127
+ $arrQueryResult = $wpdb->get_results("SELECT * FROM $gdbcTableName LIMIT 1");
128
+
129
+ if(isset($arrQueryResult[0]->IsDeleted) || empty($arrQueryResult)) {
130
+ $wpdb->query( "RENAME TABLE $gdbcTableName TO {$gdbcTableName}_old" );
131
+ }
132
+ }
133
+
134
+ GdbcDbAccessController::createAttemptsTable();
135
+
136
+ $wpdb->suppress_errors($suppressOldValue);
137
+
138
+ }
139
+
140
+ private static function migrateTableDataFromV1($blogId)
141
+ {
142
+ global $wpdb;
143
+ $blogTablePrefix = $wpdb->get_blog_prefix($blogId);
144
+
145
+ $gdbcOldTableName = $blogTablePrefix . 'gdbc_attempts_old' ;
146
+
147
+ if($wpdb->get_var("SHOW TABLES LIKE '$gdbcOldTableName'") !== $gdbcOldTableName)
148
+ return;
149
+
150
+ if( ! GdbcDbAccessController::attemptsTableExists() )
151
+ return;
152
+
153
+ $alreadyBlockedIpsList = (array)$wpdb->get_results("SELECT DISTINCT ClientIp FROM $gdbcOldTableName WHERE IsIpBlocked <> 0 AND IsDeleted = 0");
154
+
155
+ foreach($alreadyBlockedIpsList as $ipAddressObject)
156
+ {
157
+ $clientIp = MchGdbcIPUtils::ipAddressFromBinary($ipAddressObject->ClientIp);
158
+ if(!MchGdbcIPUtils::isValidIpAddress($clientIp))
159
+ continue;
160
+
161
+ if(GdbcIPUtils::isIpBlackListed($clientIp))
162
+ continue;
163
+
164
+ GdbcBlackListedIpsAdminModule::getInstance()->registerBlackListedIp($clientIp);
165
+
166
+ }
167
+
168
+ unset($alreadyBlockedIpsList, $ipAddressObject, $clientIp);
169
+
170
+
171
+ $arrModulesIdMapping = array( // key - oldModuleId
172
+ 1 => GdbcModulesController::MODULE_WORDPRESS ,
173
+ 2 => GdbcModulesController::MODULE_JETPACK_CONTACT_FORM ,
174
+ 3 => GdbcModulesController::MODULE_BUDDY_PRESS ,
175
+ 4 => GdbcModulesController::MODULE_NINJA_FORMS ,
176
+ 5 => GdbcModulesController::MODULE_CONTACT_FORM_7 ,
177
+ 6 => GdbcModulesController::MODULE_GRAVITY_FORMS ,
178
+ 7 => GdbcModulesController::MODULE_FAST_SECURE_FORM ,
179
+ 8 => GdbcModulesController::MODULE_FORMIDABLE_FORMS ,
180
+ 9 => GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP ,
181
+ 11 => GdbcModulesController::MODULE_USER_PRO ,
182
+ 12 => GdbcModulesController::MODULE_ULTIMATE_MEMBER ,
183
+ 13 => GdbcModulesController::MODULE_WOOCOMMERCE ,
184
+ 14 => GdbcModulesController::MODULE_UPME ,
185
+ 15 => GdbcModulesController::MODULE_PLANSO_FORMS ,
186
+ 16 => GdbcModulesController::MODULE_SEAMLESS_DONATIONS ,
187
+ );
188
+
189
+
190
+
191
+ $minDateTime = date('Y-m-d H:i:s', strtotime(((-1) * (30)) . ' days', current_time( 'timestamp' )));
192
+ $maxDateTime = date('Y-m-d H:i:s', current_time( 'timestamp' ));
193
+
194
+ $gdbcAttemptsQuery = "
195
+ SELECT Id, UNIX_TIMESTAMP(CreatedDate) AS CreatedDate, ModuleId, SectionId, ClientIp, CountryId, ReasonId
196
+ FROM $gdbcOldTableName WHERE IsDeleted = 0 AND CreatedDate BETWEEN '$minDateTime' AND '$maxDateTime' order by CreatedDate DESC LIMIT 500;
197
+ ";
198
+
199
+
200
+ $gdbcAttemptsList = (array)$wpdb->get_results($gdbcAttemptsQuery);
201
+
202
+ $oldSettingsOptions = get_site_option('gdbcsettingsadminmodule-settings');
203
+ if(!empty($oldSettingsOptions['TrustedIps'][0]) && MchGdbcIPUtils::isValidIpAddress($oldSettingsOptions['TrustedIps'][0]))
204
+ {
205
+ if(!GdbcIPUtils::isIpWhiteListed($oldSettingsOptions['TrustedIps'][0])){
206
+ GdbcWhiteListedIpsAdminModule::getInstance()->registerWhiteListedIp($oldSettingsOptions['TrustedIps'][0]);
207
+ }
208
+ }
209
+
210
+ $oldSettingsOptions = get_site_option('gdbcwordpressadminmodule-settings');
211
+ if(!empty($oldSettingsOptions['IsCommentsFormActivated']))
212
+ {
213
+ GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_COMMENTS_FORM, true);
214
+ }
215
+
216
+ if(!empty($oldSettingsOptions['IsLoginFormActivated']))
217
+ {
218
+ GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_LOGIN_FORM, true);
219
+ }
220
+ if(!empty($oldSettingsOptions['IsLostPasswordFormActivated']))
221
+ {
222
+ GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_LOST_PASSWORD_FORM, true);
223
+ }
224
+ if(!empty($oldSettingsOptions['IsUserRegistrationFormActivated']))
225
+ {
226
+ GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_REGISTRATION_FORM, true);
227
+ }
228
+
229
+ $oldSettingsOptions = get_site_option('gdbcultimatememberadminmodule-settings');
230
+ if(!empty($oldSettingsOptions['IsUMLoginActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
231
+ {
232
+ GdbcUltimateMemberAdminModule::getInstance()->saveOption(GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_LOGIN_FORM, true);
233
+ }
234
+ if(!empty($oldSettingsOptions['IsUMRegisterActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
235
+ {
236
+ GdbcUltimateMemberAdminModule::getInstance()->saveOption(GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_REGISTER_FORM, true);
237
+ }
238
+ if(!empty($oldSettingsOptions['IsUMLostPasswordActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
239
+ {
240
+ GdbcUltimateMemberAdminModule::getInstance()->saveOption(GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_LOST_PASSWORD_FORM, true);
241
+ }
242
+
243
+ $oldSettingsOptions = get_site_option('gdbcsubscriptionsadminmodule-settings');
244
+ if(!empty($oldSettingsOptions['IsMCLActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP))
245
+ {
246
+ GdbcMailChimpForWpAdminModule::getInstance()->saveOption(GdbcMailChimpForWpAdminModule::OPTION_MODULE_MAIL_CHIMP_FOR_WP, true);
247
+ }
248
+
249
+ $oldSettingsOptions = get_site_option('gdbcpopularformsadminmodule-settings');
250
+ if(!empty($oldSettingsOptions['IsJCFctivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_JETPACK_CONTACT_FORM))
251
+ {
252
+ GdbcJetPackContactFormAdminModule::getInstance()->saveOption(GdbcJetPackContactFormAdminModule::OPTION_IS_JETPACK_CONTACT_FORM_ACTIVATE, true);
253
+ }
254
+ if(!empty($oldSettingsOptions['IsPFActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_PLANSO_FORMS))
255
+ {
256
+ GdbcPlanSoFormsAdminModule::getInstance()->saveOption(GdbcPlanSoFormsAdminModule::OPTION_PLANSO_GENERAL_FORM, true);
257
+ }
258
+
259
+ delete_site_option('gdbcsettingsadminmodule-settings');
260
+ delete_site_option('gdbcwordpressadminmodule-settings');
261
+ delete_site_option('gdbcultimatememberadminmodule-settings');
262
+ delete_site_option('gdbcsubscriptionsadminmodule-settings');
263
+ delete_site_option('gdbcpopularformsadminmodule-settings');
264
+
265
+ if(empty($gdbcAttemptsList)) {
266
+
267
+ foreach(GdbcModulesController::getRegisteredModules() as $moduleName => $arrModuleInfo)
268
+ {
269
+ if(null === ($adminModuleInstance = GdbcModulesController::getAdminModuleInstance($moduleName)))
270
+ continue;
271
+
272
+ $oldOptionKey = strtolower(get_class($adminModuleInstance)) . '-settings';
273
+
274
+ MchGdbcWpUtils::isMultiSite() && function_exists('delete_blog_option') ? delete_blog_option($blogId, $oldOptionKey) : delete_option($oldOptionKey);
275
+ }
276
+
277
+
278
+ $wpdb->query("DROP TABLE IF EXISTS $gdbcOldTableName");
279
+ return;
280
+ }
281
+
282
+ $arrSelectedIds = array();
283
+ foreach($gdbcAttemptsList as $gdbcAttempt)
284
+ {
285
+
286
+ empty($gdbcAttempt->SectionId) ? $gdbcAttempt->SectionId = 0 : null;
287
+
288
+ $newModuleName = isset($arrModulesIdMapping[$gdbcAttempt->ModuleId]) ? $arrModulesIdMapping[$gdbcAttempt->ModuleId] : null;
289
+ $newModuleId = GdbcModulesController::getModuleIdByName($newModuleName);
290
+
291
+ if(empty($newModuleId))
292
+ continue;
293
+
294
+ $attemptEntity = new GdbcAttemptEntity($newModuleId);
295
+
296
+ $attemptEntity->ModuleId = $newModuleId;
297
+ $attemptEntity->SectionId = !empty($gdbcAttempt->SectionId) ? $gdbcAttempt->SectionId : 0;
298
+ $attemptEntity->SiteId = $blogId;
299
+ $attemptEntity->CreatedDate = $gdbcAttempt->CreatedDate;
300
+ $attemptEntity->ReasonId = $gdbcAttempt->ReasonId;
301
+ $attemptEntity->ClientIp = MchGdbcIPUtils::ipAddressFromBinary($gdbcAttempt->ClientIp);
302
+
303
+
304
+ if(0 !== GdbcDbAccessController::registerAttempt($attemptEntity)) {
305
+ $arrSelectedIds[] = $gdbcAttempt->Id;
306
+ }
307
+
308
+ }
309
+
310
+ $wpdb->query("DELETE FROM $gdbcOldTableName WHERE Id IN (" . implode(',', $arrSelectedIds) . ")");
311
+
312
+ }
313
+
314
+
315
+ private function __construct()
316
+ {}
317
+ }
engine/GoodByeCaptchaAdmin.php ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GoodByeCaptchaAdmin extends MchGdbcBaseAdminPlugin
21
+ {
22
+ CONST GDBC_ADMIN_NOTICES_FILTER_KEY = 'gdbc-admin-notices';
23
+
24
+ private static $adminNoticesList = array();
25
+
26
+ protected function __construct(array $arrPluginInfo)
27
+ {
28
+
29
+ parent::__construct($arrPluginInfo);
30
+
31
+ $this->adminPagesList = array(
32
+
33
+ new GdbcSettingsAdminPage(__('Settings', self::$PLUGIN_SLUG), __('General Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
34
+ new GdbcSecurityAdminPage(__('Security', self::$PLUGIN_SLUG), __('Security Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
35
+ new GdbcWordpressAdminPage(__('WordPress', self::$PLUGIN_SLUG), __('WordPress Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
36
+ new GdbcContactFormsAdminPage(__('Contact Forms', self::$PLUGIN_SLUG), __('Contact Forms Plugins', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
37
+ new GdbcMembershipAdminPage(__('Membership', self::$PLUGIN_SLUG), __('Membership Page Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
38
+ new GdbcOthersAdminPage(__('Others', self::$PLUGIN_SLUG), __('All other popular plugins settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
39
+ new GdbcNotificationsAdminPage(__('Notifications', self::$PLUGIN_SLUG), __('Notifications Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
40
+ new GdbcReportsAdminPage(__('Reports', self::$PLUGIN_SLUG), __('GoodBye Captcha - Blocked Attempts', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
41
+
42
+ );
43
+
44
+
45
+ if(MchGdbcWpUtils::isMultiSite() && GoodByeCaptcha::isNetworkActivated())
46
+ {
47
+ add_action( 'network_admin_menu', array( $this, 'buildPluginMenu' ), 10 );
48
+ }
49
+ else
50
+ {
51
+ add_action( 'admin_menu', array( $this, 'buildPluginMenu' ), 10 );
52
+ }
53
+
54
+ foreach(self::getAdminRegisteredNotices() as $adminNotice)
55
+ {
56
+ if($adminNotice->isDismissible() && $adminNotice->isDismissed())
57
+ continue;
58
+
59
+ if(MchGdbcWpUtils::isMultiSite() && GoodByeCaptcha::isNetworkActivated())
60
+ {
61
+ add_action('network_admin_notices', array($adminNotice, 'showNotice'));
62
+ }
63
+ else
64
+ {
65
+ add_action( 'admin_notices', array( $adminNotice, 'showNotice' ) );
66
+ }
67
+
68
+ }
69
+
70
+ }
71
+
72
+ public static function getAdminRegisteredNotices()
73
+ {
74
+ if( empty(self::$adminNoticesList) )
75
+ self::registerAdminNotices();
76
+
77
+ return self::$adminNoticesList = apply_filters(self::GDBC_ADMIN_NOTICES_FILTER_KEY, self::$adminNoticesList);
78
+
79
+ }
80
+
81
+ private static function registerAdminNotices()
82
+ {
83
+ $bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE);
84
+
85
+ if( !GdbcIPUtils::isClientIpWhiteListed() && GdbcIPUtils::isClientIpWebAttacker(true) && $bruteForceModuleInstance)
86
+ {
87
+ $bruteForceModuleInstance->deleteOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS, GoodByeCaptcha::isNetworkActivated());
88
+ $adminNotice = new GdbcAdminNotice( GdbcAdminNotice::USER_IP_WEB_ATTACKER_NOTICE_KEY, GdbcAdminNotice::NOTICE_TYPE_DANGER );
89
+
90
+ $noticeMessage = '<p><b>';
91
+ $noticeMessage .= sprintf( __( "Your IP Address - %s - is reported as a Web Attacker! In order to keep <b>Block Web Attackers IPs</b> option activated you must white-list your IP Address!", GoodByeCaptcha::PLUGIN_SLUG ), esc_html( GdbcIPUtils::getClientIpAddress() ) );
92
+ $noticeMessage .= '</b></p>';
93
+
94
+ $adminNotice->setMessage( $noticeMessage );
95
+ $adminNotice->setIsDismissible( true );
96
+
97
+ self::$adminNoticesList[] = $adminNotice;
98
+
99
+ }
100
+
101
+ if( !GdbcIPUtils::isClientIpWhiteListed() && GdbcIPUtils::isClientIpProxyAnonymizer(true))
102
+ {
103
+ $bruteForceModuleInstance->deleteOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY, GoodByeCaptcha::isNetworkActivated());
104
+
105
+ $adminNotice = new GdbcAdminNotice(GdbcAdminNotice::USER_IP_PROXY_ANONYM_NOTICE_KEY, GdbcAdminNotice::NOTICE_TYPE_DANGER);
106
+ $noticeMessage = '<p><b>';
107
+ $noticeMessage .= sprintf(__("Your IP Address - %s - is reported as a dangerous Anonymous Proxy IP! In order to keep <b>Block Anonymous Proxy IPs</b> option activated you must white-list your IP Address!", GoodByeCaptcha::PLUGIN_SLUG), esc_html(GdbcIPUtils::getClientIpAddress()));
108
+ $noticeMessage .= '</b></p>';
109
+
110
+ $adminNotice->setMessage($noticeMessage);
111
+ $adminNotice->setIsDismissible(false);
112
+
113
+ self::$adminNoticesList[] = $adminNotice;
114
+
115
+ }
116
+
117
+ }
118
+
119
+ public function renderPluginActiveAdminPage()
120
+ {
121
+ $activeAdminPage = $this->getActivePage();
122
+
123
+ $adminPageHtmlCode = '<div class="' . "wrap container-fluid gdbc-settings " . $activeAdminPage->getAdminScreenId() . '">';
124
+
125
+ $adminPageHtmlCode .= '<h2 class="nav-tab-wrapper">';
126
+
127
+ foreach($this->getRegisteredAdminPages() as $adminPage)
128
+ {
129
+ $adminPageHtmlCode .= '<a class="nav-tab' . (($adminPage->isActive()) ? ' nav-tab-active' : '') . '" href="?page=' . $adminPage->getPageMenuSlug() . '">';
130
+ $adminPageHtmlCode .= $adminPage->getPageMenuTitle() . '</a>';
131
+ }
132
+
133
+ $adminPageHtmlCode .= '</h2>';
134
+
135
+
136
+ echo $adminPageHtmlCode;
137
+
138
+
139
+ if(null !== $activeAdminPage)
140
+ {
141
+ $activeAdminPage->renderPageContent();
142
+ }
143
+
144
+ echo '</div>';
145
+ }
146
+
147
+ public function buildPluginMenu()
148
+ {
149
+ $arrRegisteredPages = $this->getRegisteredAdminPages();
150
+ $adminFirstPage = reset($arrRegisteredPages);
151
+ if(false === $adminFirstPage)
152
+ return;
153
+
154
+ $pageAdminScreenId = add_menu_page(
155
+ $adminFirstPage->getPageBrowserTitle(),
156
+ 'GoodBye Captcha',
157
+ 'manage_options',
158
+ $adminFirstPage->getPageMenuSlug(),
159
+ array($this, 'renderPluginActiveAdminPage'),
160
+ 'dashicons-shield',
161
+ '53.8393'
162
+ );
163
+
164
+ $this->adminPagesList[0]->setAdminScreenId($pageAdminScreenId);
165
+
166
+ $arrSize = count($this->adminPagesList);
167
+ if(1 === $arrSize)
168
+ return;
169
+
170
+ add_submenu_page(
171
+ $adminFirstPage->getPageMenuSlug(),
172
+ $adminFirstPage->getPageBrowserTitle(),
173
+ $adminFirstPage->getPageMenuTitle(),
174
+ 'manage_options',
175
+ $adminFirstPage->getPageMenuSlug()
176
+ );
177
+
178
+
179
+ for($i = 1; $i < $arrSize; ++$i)
180
+ {
181
+ if(!$this->adminPagesList[$i]->hasRegisteredModules())
182
+ {
183
+ unset($this->adminPagesList[$i]);
184
+ continue;
185
+ }
186
+
187
+ $pageAdminScreenId = add_submenu_page(
188
+ $adminFirstPage->getPageMenuSlug(),
189
+ $this->adminPagesList[$i]->getPageBrowserTitle(),
190
+ $this->adminPagesList[$i]->getPageMenuTitle(),
191
+ 'manage_options',
192
+ $this->adminPagesList[$i]->getPageMenuSlug(),
193
+ array($this, 'renderPluginActiveAdminPage')
194
+ );
195
+
196
+ $this->adminPagesList[$i]->setAdminScreenId($pageAdminScreenId);
197
+ }
198
+
199
+
200
+ }
201
+
202
+
203
+
204
+ public function enqueueAdminScriptsAndStyles()
205
+ {
206
+
207
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-admin-script', plugins_url('/assets/admin/scripts/gdbc-admin.js', self::$PLUGIN_MAIN_FILE), array('jquery'), self::$PLUGIN_VERSION);
208
+
209
+ wp_localize_script(self::$PLUGIN_SLUG . '-admin-script', 'GdbcAdmin', array(
210
+ 'ajaxUrl' => admin_url('admin-ajax.php'),
211
+ 'ajaxRequestNonce' => wp_create_nonce(GdbcAjaxController::AJAX_NONCE_VALUE),
212
+ ));
213
+
214
+ if(null === ($activeAdminPage = $this->getActivePage()))
215
+ return;
216
+
217
+ if($this->getActivePage() instanceof GdbcReportsAdminPage)
218
+ {
219
+ remove_action( 'admin_print_styles', 'print_emoji_styles' );
220
+ remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
221
+
222
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-flot', plugins_url('/assets/admin/scripts/jquery-flot.js', self::$PLUGIN_MAIN_FILE), array('jquery'), self::$PLUGIN_VERSION);
223
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-flot-tooltip', plugins_url('/assets/admin/scripts/jquery-flot-tooltip.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
224
+
225
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-raphael', plugins_url('/assets/admin/scripts/raphael.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
226
+
227
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-morris', plugins_url('/assets/admin/scripts/morris.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
228
+
229
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-reports-script', plugins_url('/assets/admin/scripts/gdbc-reports.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
230
+
231
+
232
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-bootstrap', plugins_url('/assets/admin/scripts/bootstrap.min.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
233
+
234
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-jvectormap', plugins_url('/assets/admin/scripts/jquery-jvectormap-1.2.2.min.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
235
+ wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-jvectormap-world', plugins_url('/assets/admin/scripts/jquery-jvectormap-world-mill-en.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
236
+
237
+ wp_enqueue_style(self::$PLUGIN_SLUG . '-bootstrap', plugins_url('/assets/admin/styles/bootstrap.css', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
238
+ wp_enqueue_style(self::$PLUGIN_SLUG . '-morris', plugins_url('/assets/admin/styles/morris.css', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
239
+ }
240
+
241
+
242
+ wp_enqueue_style('dashboard');
243
+ wp_enqueue_script('dashboard');
244
+
245
+
246
+ wp_enqueue_style (self::$PLUGIN_SLUG . '-admin-style', plugins_url('/assets/admin/styles/gdbc-admin.css', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
247
+
248
+ }
249
+
250
+
251
+ public static function getInstance(array $arrPluginInfo)
252
+ {
253
+ static $gdbcAdminInstance = null;
254
+ return null !== $gdbcAdminInstance ? $gdbcAdminInstance : $gdbcAdminInstance = new self($arrPluginInfo);
255
+ }
256
+
257
+ public function initializeAdminPlugin()
258
+ {
259
+ parent::initializeAdminPlugin();
260
+
261
+ if(MchGdbcWpUtils::isAjaxRequest())
262
+ return;
263
+
264
+
265
+ add_action('shutdown', array($this, 'executeLowPriorityTasks'));
266
+
267
+ }
268
+
269
+ public function executeLowPriorityTasks()
270
+ {
271
+
272
+ GdbcDbAccessController::deleteAttemptsOlderThan(GdbcSettingsAdminModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_MAX_LOGS_DAYS));
273
+ GdbcDbAccessController::clearAttemptsNotesOlderThan(GdbcSettingsAdminModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_BLOCKED_CONTENT_LOG_DAYS));
274
+
275
+ if(null === self::$PLUGIN_MAIN_FILE)
276
+ return;
277
+
278
+ if (!current_user_can( 'manage_options' ))
279
+ return;
280
+
281
+ $pluginBaseName = plugin_basename(self::$PLUGIN_MAIN_FILE);
282
+ $arrBlogActivePlugins = (array) get_option( 'active_plugins', array() );
283
+
284
+ $firstActivatedPlugin = reset($arrBlogActivePlugins);
285
+ if(false === $firstActivatedPlugin || $firstActivatedPlugin === $pluginBaseName)
286
+ return;
287
+
288
+ $gdbcPluginKey = array_search( $pluginBaseName, $arrBlogActivePlugins );
289
+ if(false === $gdbcPluginKey)
290
+ return;
291
+
292
+ array_splice( $arrBlogActivePlugins, $gdbcPluginKey, 1 );
293
+ array_unshift( $arrBlogActivePlugins, $pluginBaseName );
294
+
295
+ update_option( 'active_plugins', $arrBlogActivePlugins );
296
+
297
+ }
298
+
299
+
300
+ public static function onPluginActivate()
301
+ {}
302
+
303
+ private function __clone()
304
+ {}
305
+
306
+ }
engine/GoodByeCaptchaPublic.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GoodByeCaptchaPublic extends MchGdbcBasePublicPlugin
21
+ {
22
+
23
+ private $formHiddenInputName = null;
24
+
25
+ protected function __construct(array $arrPluginInfo)
26
+ {
27
+ parent::__construct($arrPluginInfo);
28
+
29
+ if(!GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS))
30
+ return ;
31
+
32
+ $settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
33
+ if(null === $settingsModuleInstance)
34
+ return;
35
+
36
+ $this->formHiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
37
+
38
+ foreach(array_keys((array)GdbcModulesController::getRegisteredModules()) as $moduleName)
39
+ {
40
+ $moduleInstance = GdbcModulesController::getPublicModuleInstance($moduleName);
41
+
42
+ if( ! ($moduleInstance instanceof MchGdbcBaseModule) )
43
+ continue;
44
+
45
+ call_user_func(array($moduleInstance, 'registerAttachedHooks'));
46
+ }
47
+
48
+ }
49
+
50
+ public function initializePlugin()
51
+ {
52
+ parent::initializePlugin();
53
+
54
+ }
55
+
56
+
57
+ public function registerAfterSetupThemeHooks()
58
+ {
59
+
60
+ add_action('login_enqueue_scripts', array($this, 'enqueuePublicScriptsAndStyles'));
61
+ }
62
+
63
+ public static function getInstance(array $arrPluginInfo)
64
+ {
65
+ static $gdbcPublicInstance = null;
66
+ return null !== $gdbcPublicInstance ? $gdbcPublicInstance : $gdbcPublicInstance = new self($arrPluginInfo);
67
+ }
68
+
69
+ public function enqueuePublicScriptsAndStyles()
70
+ {
71
+ $scriptId = self::$PLUGIN_SLUG . '-public-script';
72
+
73
+ wp_register_script($scriptId, plugins_url( '/assets/public/scripts/gdbc-public.js', self::$PLUGIN_MAIN_FILE ), array( 'jquery' ), self::$PLUGIN_VERSION);
74
+
75
+ wp_localize_script($scriptId, 'Gdbc', array(
76
+ 'ajaxUrl' => MchGdbcWpUtils::getAjaxUrl(),
77
+ 'clientUrl' => esc_url(home_url('/', MchGdbcWpUtils::isSslRequest() ? 'https' : 'http') . '?gdbc-client=' . self::$PLUGIN_VERSION),
78
+ 'formFieldName' => $this->formHiddenInputName,
79
+ 'shortCode' => self::$PLUGIN_SHORT_CODE,
80
+ 'slug' => self::$PLUGIN_SLUG,
81
+ ));
82
+
83
+ wp_enqueue_script($scriptId);
84
+
85
+ }
86
+
87
+
88
+ private function __clone()
89
+ {}
90
+
91
+ }
engine/GoodByeCaptchaUtils.php ADDED
@@ -0,0 +1,593 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GoodByeCaptchaUtils
21
+ {
22
+
23
+ public static function isZmAlrActivated()
24
+ {
25
+ return defined('ZM_ALR_NAMESPACE');
26
+ }
27
+
28
+ public static function isUserProfileMadeEasyActivated()
29
+ {
30
+ return defined('upme_path');
31
+ }
32
+
33
+ public static function isWooCommerceActivated()
34
+ {
35
+ return class_exists('WooCommerce');
36
+ }
37
+
38
+ public static function isUltimateMemberActivated()
39
+ {
40
+ return class_exists('UM_API');
41
+ }
42
+
43
+ public static function isUjiCountDownActivated()
44
+ {
45
+ return class_exists('Uji_Countdown');
46
+ }
47
+
48
+ public static function isMailChimpForWPActivated()
49
+ {
50
+ return function_exists('__mc4wp_load_plugin') || function_exists('__mc4wp_premium_load') || function_exists('mc4wp_load_plugin') || function_exists('mc4wp_pro_load_plugin');
51
+ }
52
+
53
+ public static function isNinjaFormsActivated()
54
+ {
55
+ return class_exists('Ninja_Forms');
56
+ }
57
+
58
+ public static function isPlanSoFormsActivated()
59
+ {
60
+ return function_exists('psfb_register');
61
+ }
62
+
63
+ public static function isSeamlessDonationsActivated()
64
+ {
65
+ return function_exists('seamless_donations_init');
66
+ }
67
+
68
+ public static function isGravityFormsActivated()
69
+ {
70
+ return class_exists('GFForms');
71
+ }
72
+
73
+ public static function isContactForm7Activated()
74
+ {
75
+ return class_exists('WPCF7_ContactForm');
76
+ }
77
+
78
+ public static function isFastSecureFormActivated()
79
+ {
80
+ return class_exists('FSCF_Util');
81
+ }
82
+
83
+ public static function isFormidableFormsActivated()
84
+ {
85
+ return class_exists('FrmSettings');
86
+ }
87
+
88
+ public static function isUserProPluginActivated()
89
+ {
90
+ return class_exists('userpro_api');
91
+ }
92
+
93
+ // public static function setCookie($cookieKey, $cookieValue, $cookieTime, $path = null, $httpOnly = true)
94
+ // {
95
+ // if(headers_sent()) return;
96
+ // return setcookie($cookieKey, $cookieValue, $cookieTime + (isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time()), empty($path) ? COOKIEPATH : $path, COOKIE_DOMAIN, is_ssl(), $httpOnly);
97
+ // }
98
+ //
99
+ // public static function getCookie($cookieKey)
100
+ // {
101
+ // return isset($_COOKIE[$cookieKey]) ? $_COOKIE[$cookieKey] : null;
102
+ // }
103
+ //
104
+ // public static function deleteCookie($cookieKey)
105
+ // {
106
+ // if(headers_sent()) return;
107
+ // return setcookie($cookieKey, null, (isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time()) - 3600);
108
+ // }
109
+
110
+ public static function isJetPackContactFormModuleActivated()
111
+ {
112
+ return self::isJetPackModuleActivated('contact-form');
113
+ }
114
+
115
+ public static function isJetPackCommentsModuleActivated()
116
+ {
117
+ return self::isJetPackModuleActivated('comments');
118
+ }
119
+
120
+ public static function isValidReferer()
121
+ {
122
+ static $validReferer = null;
123
+ if(null !== $validReferer)
124
+ return $validReferer;
125
+
126
+ $referer = wp_get_referer();
127
+ $actualHost = parse_url(home_url(), PHP_URL_HOST);
128
+
129
+ return $validReferer = (!empty($referer) && !empty($actualHost) && false !== stripos($referer, $actualHost));
130
+ }
131
+
132
+ public static function isNginxWebServer()
133
+ {
134
+ if(empty($_SERVER['SERVER_SOFTWARE']))
135
+ return false;
136
+
137
+ return (false !== stripos($_SERVER['SERVER_SOFTWARE'], 'nginx')) && (@php_sapi_name() === 'fpm-fcgi');
138
+ }
139
+
140
+ public static function isJetPackPluginActivated()
141
+ {
142
+ return class_exists('Jetpack');
143
+ }
144
+
145
+ private static function isJetPackModuleActivated($moduleName)
146
+ {
147
+ static $arrActivatedModules = array();
148
+ if(isset($arrActivatedModules[$moduleName]))
149
+ return $arrActivatedModules[$moduleName];
150
+
151
+ return $arrActivatedModules[$moduleName] = ((null !== ($arrJetPackModules = self::getJetPackActiveModules())) &&
152
+ in_array(strtolower($moduleName), $arrJetPackModules, true));
153
+ }
154
+
155
+ private static function getJetPackActiveModules()
156
+ {
157
+ static $isActivated = null;
158
+ (null === $isActivated) ? $isActivated = class_exists( 'Jetpack' ) : null;
159
+
160
+ if( !$isActivated)
161
+ return null;
162
+
163
+ static $arrJetPackOptions = null;
164
+ if(null !== $arrJetPackOptions)
165
+ return $arrJetPackOptions;
166
+
167
+ $arrJetPackOptions = get_option('jetpack_active_modules');
168
+ if(false === $arrJetPackOptions)
169
+ return null;
170
+
171
+ foreach ($arrJetPackOptions as &$moduleName)
172
+ $moduleName = strtolower(trim($moduleName));
173
+
174
+ return $arrJetPackOptions;
175
+ }
176
+
177
+
178
+ public static function getCountryIdByCode($countryCode)
179
+ {
180
+ $countryCode = trim(strtoupper($countryCode));
181
+
182
+ foreach (self::getCountryDataSource() as $key => $value)
183
+ if ($countryCode === $value[1])
184
+ return $key;
185
+
186
+ return 0;
187
+ }
188
+
189
+ public static function getCountryCodeById($countryId)
190
+ {
191
+ $arrCountry = self::getCountryDataSource();
192
+ return isset($arrCountry[$countryId][1]) ? $arrCountry[$countryId][1] : null;
193
+ }
194
+
195
+ public static function getCountryNameById($countryId)
196
+ {
197
+ $arrCountry = self::getCountryDataSource();
198
+ return isset($arrCountry[$countryId][0]) ? $arrCountry[$countryId][0] : null;
199
+ }
200
+
201
+ private static function getCountryDataSource()
202
+ {
203
+ return array(
204
+ 1 => array("Afghanistan", "AF"),
205
+ 2 => array("Aland Islands", "AX"),
206
+ 3 => array("Albania", "AL"),
207
+ 4 => array("Algeria", "DZ"),
208
+ 5 => array("American Samoa", "AS"),
209
+ 6 => array("Andorra", "AD"),
210
+ 7 => array("Angola", "AO"),
211
+ 8 => array("Anguilla", "AI"),
212
+ 9 => array("Antarctica", "AQ"),
213
+ 10 => array("Antigua and Barbuda", "AG"),
214
+ 11 => array("Argentina", "AR"),
215
+ 12 => array("Armenia", "AM"),
216
+ 13 => array("Aruba", "AW"),
217
+ 14 => array("Australia", "AU"),
218
+ 15 => array("Austria", "AT"),
219
+ 16 => array("Azerbaijan", "AZ"),
220
+ 17 => array("Bahamas", "BS"),
221
+ 18 => array("Bahrain", "BH"),
222
+ 19 => array("Bangladesh", "BD"),
223
+ 20 => array("Barbados", "BB"),
224
+ 21 => array("Belarus", "BY"),
225
+ 22 => array("Belgium", "BE"),
226
+ 23 => array("Belize", "BZ"),
227
+ 24 => array("Benin", "BJ"),
228
+ 25 => array("Bermuda", "BM"),
229
+ 26 => array("Bhutan", "BT"),
230
+ 27 => array("Bolivia", "BO"),
231
+ 28 => array("Bosnia and Herzegovina", "BA"),
232
+ 29 => array("Botswana", "BW"),
233
+ 30 => array("Bouvet island", "BV"),
234
+ 31 => array("Brazil", "BR"),
235
+ 32 => array("British Indian Ocean", "IO"),
236
+ 33 => array("Brunei Darussalam", "BN"),
237
+ 34 => array("Bulgaria", "BG"),
238
+ 35 => array("Burkina Faso", "BF"),
239
+ 36 => array("Burundi", "BI"),
240
+ 37 => array("Cambodia", "KH"),
241
+ 38 => array("Cameroon", "CM"),
242
+ 39 => array("Canada", "CA"),
243
+ 40 => array("Cape Verde", "CV"),
244
+ 41 => array("Cayman Islands", "KY"),
245
+ 42 => array("Central African Republic", "CF"),
246
+ 43 => array("Chad", "TD"),
247
+ 44 => array("Chile", "CL"),
248
+ 45 => array("China", "CN"),
249
+ 46 => array("Christmas Island", "CX"),
250
+ 47 => array("Cocos Islands", "CC"),
251
+ 48 => array("Colombia", "CO"),
252
+ 49 => array("Comoros", "KM"),
253
+ 50 => array("Congo", "CG"),
254
+ 51 => array("Congo", "CD"),
255
+ 52 => array("Cook Islands", "CK"),
256
+ 53 => array("Costa Rica", "CR"),
257
+ 54 => array("Cote d'Ivoire", "CI"),
258
+ 55 => array("Croatia", "HR"),
259
+ 56 => array("Cuba", "CU"),
260
+ 57 => array("Cyprus", "CY"),
261
+ 58 => array("Czech Republic", "CZ"),
262
+ 59 => array("Denmark", "DK"),
263
+ 60 => array("Djibouti", "DJ"),
264
+ 61 => array("Dominica", "DM"),
265
+ 62 => array("Dominican republic", "DO"),
266
+ 63 => array("Ecuador", "EC"),
267
+ 64 => array("Egypt", "EG"),
268
+ 65 => array("El Salvador", "SV"),
269
+ 66 => array("Equatorial Guinea", "GQ"),
270
+ 67 => array("Eritrea", "ER"),
271
+ 68 => array("Estonia", "EE"),
272
+ 69 => array("Ethiopia", "ET"),
273
+ 70 => array("Falkland Islands", "FK"),
274
+ 71 => array("Faroe Islands", "FO"),
275
+ 72 => array("Fiji", "FJ"),
276
+ 73 => array("Finland", "FI"),
277
+ 74 => array("France", "FR"),
278
+ 75 => array("French Guiana", "GF"),
279
+ 76 => array("French Polynesia", "PF"),
280
+ 77 => array("French Southern Territories", "TF"),
281
+ 78 => array("Gabon", "GA"),
282
+ 79 => array("Gambia", "GM"),
283
+ 80 => array("Georgia", "GE"),
284
+ 81 => array("Germany", "DE"),
285
+ 82 => array("Ghana", "GH"),
286
+ 83 => array("Gibraltar", "GI"),
287
+ 84 => array("Greece", "GR"),
288
+ 85 => array("Greenland", "Gl"),
289
+ 86 => array("Grenada", "GD"),
290
+ 87 => array("Guadeloupe", "GP"),
291
+ 88 => array("Guam", "GU"),
292
+ 89 => array("Guatemala", "GT"),
293
+ 90 => array("Guernsey", "GG"),
294
+ 91 => array("Guinea", "GN"),
295
+ 92 => array("Guinea-Bissau", "GW"),
296
+ 93 => array("Guyana", "GY"),
297
+ 94 => array("Haiti", "HT"),
298
+ 95 => array("Heard and Mcdonald Islands", "HM"),
299
+ 96 => array("Vatican", "VA"),
300
+ 97 => array("Honduras", "HN"),
301
+ 98 => array("Hong Kong", "HK"),
302
+ 99 => array("Hungary", "HU"),
303
+ 100 => array("Iceland", "IS"),
304
+ 101 => array("India", "IN"),
305
+ 102 => array("Indonesia", "ID"),
306
+ 103 => array("Iran", "IR"),
307
+ 104 => array("Iraq", "IQ"),
308
+ 105 => array("Ireland", "IE"),
309
+ 106 => array("Isle of Man", "IM"),
310
+ 107 => array("Israel", "IL"),
311
+ 108 => array("Italy", "IT"),
312
+ 109 => array("Jamaica", "JM"),
313
+ 110 => array("Japan", "JP"),
314
+ 111 => array("Jersey", "JE"),
315
+ 112 => array("Jordan", "JO"),
316
+ 113 => array("Kazakhstan", "KZ"),
317
+ 114 => array("Kenya", "KE"),
318
+ 115 => array("Kiribati", "KI"),
319
+ 116 => array("Korea", "KP"),
320
+ 117 => array("Korea", "KR"),
321
+ 118 => array("Kuwait", "KW"),
322
+ 119 => array("Kyrgyzstan", "KG"),
323
+ 120 => array("Lao Republic", "LA"),
324
+ 121 => array("Latvia", "LV"),
325
+ 122 => array("Lebanon", "LB"),
326
+ 123 => array("Lesotho", "LS"),
327
+ 124 => array("Liberia", "LR"),
328
+ 125 => array("Libyan Arab Jamahiriya", "LY"),
329
+ 126 => array("Liechtenstein", "LI"),
330
+ 127 => array("Lithuania", "LT"),
331
+ 128 => array("Luxembourg", "LU"),
332
+ 129 => array("Macao", "MO"),
333
+ 130 => array("Macedonia", "MK"),
334
+ 131 => array("Madagascar", "MG"),
335
+ 132 => array("Malawi", "MW"),
336
+ 133 => array("Malaysia", "MY"),
337
+ 134 => array("Maldives", "MV"),
338
+ 135 => array("Mali", "Ml"),
339
+ 136 => array("Malta", "MT"),
340
+ 137 => array("Marshall Islands", "MH"),
341
+ 138 => array("Martinique", "MQ"),
342
+ 139 => array("Mauritania", "MR"),
343
+ 140 => array("Mauritius", "MU"),
344
+ 141 => array("Mayotte", "YT"),
345
+ 142 => array("Mexico", "MX"),
346
+ 143 => array("Micronesia", "FM"),
347
+ 144 => array("Moldova", "MD"),
348
+ 145 => array("Monaco", "MC"),
349
+ 146 => array("Mongolia", "MN"),
350
+ 147 => array("Montenegro", "ME"),
351
+ 148 => array("Montserrat", "MS"),
352
+ 149 => array("Morocco", "MA"),
353
+ 150 => array("Mozambique", "MZ"),
354
+ 151 => array("Myanmar", "MM"),
355
+ 152 => array("Namibia", "NA"),
356
+ 153 => array("Nauru", "NR"),
357
+ 154 => array("Nepal", "NP"),
358
+ 155 => array("Netherlands", "NL"),
359
+ 156 => array("Netherlands Antilles", "AN"),
360
+ 157 => array("New Caledonia", "NC"),
361
+ 158 => array("New Zealand", "NZ"),
362
+ 159 => array("Nicaragua", "NI"),
363
+ 160 => array("Niger", "NE"),
364
+ 161 => array("Nigeria", "NG"),
365
+ 162 => array("Niue", "NU"),
366
+ 163 => array("Norfolk Island", "NF"),
367
+ 164 => array("Northern Mariana Islands", "MP"),
368
+ 165 => array("Norway", "NO"),
369
+ 166 => array("Oman", "OM"),
370
+ 167 => array("Pakistan", "PK"),
371
+ 168 => array("Palau", "PW"),
372
+ 169 => array("Palestinian Territory Occupied", "PS"),
373
+ 170 => array("Panama", "PA"),
374
+ 171 => array("Papua New Guinea", "PG"),
375
+ 172 => array("Paraguay", "PY"),
376
+ 173 => array("Peru", "PE"),
377
+ 174 => array("Philippines", "PH"),
378
+ 175 => array("Pitcairn", "PN"),
379
+ 176 => array("Poland", "PL"),
380
+ 177 => array("Portugal", "PT"),
381
+ 178 => array("Puerto rico", "PR"),
382
+ 179 => array("Qatar", "QA"),
383
+ 180 => array("Reunion", "RE"),
384
+ 181 => array("Romania", "RO"),
385
+ 182 => array("Russian Federation", "RU"),
386
+ 183 => array("Rwanda", "RW"),
387
+ 184 => array("Saint Barthelemy", "BL"),
388
+ 185 => array("Saint Helena", "SH"),
389
+ 186 => array("Saint Kitts and Nevis", "KN"),
390
+ 187 => array("Saint Lucia", "LC"),
391
+ 188 => array("Saint Martin", "MF"),
392
+ 189 => array("Saint Pierre and Miquelon", "PM"),
393
+ 190 => array("Saint Vincent", "VC"),
394
+ 191 => array("Samoa", "WS"),
395
+ 192 => array("San Marino", "SM"),
396
+ 193 => array("Sao Tome and Principe", "ST"),
397
+ 194 => array("Saudi Arabia", "SA"),
398
+ 195 => array("Senegal", "SN"),
399
+ 196 => array("Serbia", "RS"),
400
+ 197 => array("Seychelles", "SC"),
401
+ 198 => array("Sierra Leone", "SL"),
402
+ 199 => array("Singapore", "SG"),
403
+ 200 => array("Slovakia", "SK"),
404
+ 201 => array("Slovenia", "SI"),
405
+ 202 => array("Solomon Islands", "SB"),
406
+ 203 => array("Somalia", "SO"),
407
+ 204 => array("South Africa", "ZA"),
408
+ 205 => array("South Georgia and Islands", "GS"),
409
+ 206 => array("Spain", "ES"),
410
+ 207 => array("Sri Lanka", "LK"),
411
+ 208 => array("Sudan", "SD"),
412
+ 209 => array("Suriname", "SR"),
413
+ 210 => array("Svalbard and Jan Mayen", "SJ"),
414
+ 211 => array("Swaziland", "SZ"),
415
+ 212 => array("Sweden", "SE"),
416
+ 213 => array("Switzerland", "CH"),
417
+ 214 => array("Syrian Arab Republic", "SY"),
418
+ 215 => array("Taiwan", "TW"),
419
+ 216 => array("Tajikistan", "TJ"),
420
+ 217 => array("Tanzania", "TZ"),
421
+ 218 => array("Thailand", "TH"),
422
+ 219 => array("Timor-Leste", "TL"),
423
+ 220 => array("Togo", "TG"),
424
+ 221 => array("Tokelau", "TK"),
425
+ 222 => array("Tonga", "TO"),
426
+ 223 => array("Trinidad and Tobago", "TT"),
427
+ 224 => array("Tunisia", "TN"),
428
+ 225 => array("Turkey", "TR"),
429
+ 226 => array("Turkmenistan", "TM"),
430
+ 227 => array("Turks and Caicos Islands", "TC"),
431
+ 228 => array("Tuvalu", "TV"),
432
+ 229 => array("Uganda", "UG"),
433
+ 230 => array("Ukraine", "UA"),
434
+ 231 => array("United Arab Emirates", "AE"),
435
+ 232 => array("United Kingdom", "GB"),
436
+ 233 => array("United States", "US"),
437
+ 234 => array("United States Minor Islands", "UM"),
438
+ 235 => array("Uruguay", "UY"),
439
+ 236 => array("Uzbekistan", "UZ"),
440
+ 237 => array("Vanuatu", "VU"),
441
+ 238 => array("Venezuela", "VE"),
442
+ 239 => array("Vietnam", "VN"),
443
+ 240 => array("Virgin Islands British", "VG"),
444
+ 241 => array("Virgin Islands U.S.", "VI"),
445
+ 242 => array("Wallis and Futuna", "WF"),
446
+ 243 => array("Western Sahara", "EH"),
447
+ 244 => array("Yemen", "YE"),
448
+ 245 => array("Zambia", "ZM"),
449
+ 246 => array("Zimbabwe", "ZW")
450
+ );
451
+ }
452
+
453
+ public static function isLoginAttemptEntity(GdbcAttemptEntity $attemptEntity)
454
+ {
455
+ foreach(self::getAllPossibleLoginAttemptEntities() as $loginAttemptEntity)
456
+ {
457
+ if( ($loginAttemptEntity->ModuleId == $attemptEntity->ModuleId) && ($loginAttemptEntity->SectionId == $attemptEntity->SectionId) )
458
+ return true;
459
+ }
460
+
461
+ return false;
462
+ }
463
+
464
+ public static function getAllPossibleLoginAttemptEntities()
465
+ {
466
+ static $loginEntitiesList = null;
467
+ if(null !== $loginEntitiesList)
468
+ return $loginEntitiesList;
469
+
470
+ $loginEntitiesList = array();
471
+
472
+ foreach(GdbcModulesController::getRegisteredModules() as $moduleName => $arrModuleClasses)
473
+ {
474
+ switch($moduleName)
475
+ {
476
+ case GdbcModulesController::MODULE_WORDPRESS :
477
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcWordPressAdminModule::WORDPRESS_LOGIN_FORM);
478
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcWordPressAdminModule::WORDPRESS_LOGIN_XML_RPC);
479
+ break;
480
+
481
+ case GdbcModulesController::MODULE_ULTIMATE_MEMBER :
482
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_LOGIN_FORM);
483
+ break;
484
+
485
+ case GdbcModulesController::MODULE_WOOCOMMERCE :
486
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcWooCommerceAdminModule::WOOCOMMERCE_LOGIN_FORM);
487
+ break;
488
+
489
+ case GdbcModulesController::MODULE_USER_PRO :
490
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcUserProAdminModule::OPTION_LOGIN_FORM_PROTECTION_ACTIVATED);
491
+ break;
492
+
493
+ case GdbcModulesController::MODULE_UPME :
494
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcUPMEAdminModule::UPME_LOGIN_FORM);
495
+ break;
496
+
497
+ case GdbcModulesController::MODULE_ZM_ALR :
498
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcZmAlrAdminModule::OPTION_ZM_ALR_LOGIN_FORM);
499
+ break;
500
+
501
+ case GdbcModulesController::MODULE_PLANSO_FORMS :
502
+ $loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcPlanSoFormsAdminModule::OPTION_PLANSO_LOGIN_FORM);
503
+ break;
504
+
505
+
506
+ }
507
+ }
508
+
509
+
510
+ foreach($loginEntitiesList as $index => &$attemptEntity)
511
+ {
512
+ $attemptEntity->SectionId = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::getModuleNameById($attemptEntity->ModuleId))->getOptionIdByOptionName($attemptEntity->SectionId);
513
+ unset($attemptEntity->Id, $attemptEntity->ClientIp, $attemptEntity->CreatedDate, $attemptEntity->Notes, $attemptEntity->ReasonId, $attemptEntity->SiteId);
514
+ }
515
+
516
+ return $loginEntitiesList;
517
+ }
518
+
519
+
520
+
521
+
522
+ public static function flushSiteCache($siteId = 0)
523
+ {
524
+ $siteId = absint($siteId);
525
+ if($siteId === 0)
526
+ $siteId = get_current_blog_id();
527
+
528
+ // $blogDetails = get_blog_details($siteId, false);
529
+ // if(empty($blogDetails))
530
+ // return;
531
+
532
+ unset($blogDetails);
533
+
534
+ $shouldSwitchSite = ($siteId !== get_current_blog_id());
535
+
536
+ ($shouldSwitchSite) ? switch_to_blog( $siteId) : null;
537
+
538
+ if(function_exists('w3tc_flush_all')) { // w3tc
539
+ w3tc_flush_all();
540
+ }
541
+ elseif(function_exists('wp_cache_clear_cache')){ // wp super cache
542
+ wp_cache_clear_cache();
543
+ }
544
+ elseif(isset($GLOBALS['wp_fastest_cache']) && method_exists($GLOBALS['wp_fastest_cache'], 'deleteCache')){ // wp fastest cache
545
+ $GLOBALS['wp_fastest_cache']->deleteCache();
546
+ }
547
+ elseif(class_exists('zencache') && method_exists('zencache', 'clear')){ // zencache
548
+ zencache::clear();
549
+ }
550
+ // elseif{
551
+ // /*
552
+ // * @TODO - Support for Wp Rocket
553
+ // */
554
+ //
555
+ // }
556
+
557
+
558
+ ($shouldSwitchSite) ? restore_current_blog() : null;
559
+ }
560
+
561
+
562
+ /*
563
+ * return /MchGdbcCache
564
+ */
565
+ public static function getAvailableCacheStorage($dirPathForFileStorage)
566
+ {
567
+ static $cacheStorage = false;
568
+ if(false !== $cacheStorage)
569
+ return $cacheStorage;
570
+
571
+ $arrPossibleCacheStorage = array(
572
+ !empty($dirPathForFileStorage) ? new MchGdbcCacheFileStorage($dirPathForFileStorage, true, 'txt') : null,
573
+ new MchGdbcWordPressTransientsStorage(false),
574
+ new MchGdbcCacheAPCUStorage(),
575
+ new MchGdbcCacheAPCStorage(),
576
+ new MchGdbcCacheXCacheStorage(),
577
+ new MchGdbcCacheZendMemoryStorage(),
578
+ new MchGdbcCacheZendDiskStorage(),
579
+ new MchGdbcWordPressTransientsStorage(true),
580
+ );
581
+
582
+ foreach ($arrPossibleCacheStorage as $cacheStorageObject) {
583
+ if (null === $cacheStorageObject || !$cacheStorageObject->isAvailable())
584
+ continue;
585
+
586
+ return $cacheStorage = new MchGdbcCache($cacheStorageObject);
587
+ }
588
+
589
+ return $cacheStorage = null;
590
+ }
591
+
592
+
593
+ }
engine/admin/GdbcAdminNotice.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Copyright (C) 2015 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ final class GdbcAdminNotice extends MchGdbcAdminNotice
22
+ {
23
+ CONST USER_IP_WEB_ATTACKER_NOTICE_KEY = 'UserIpWebAttacker';
24
+ CONST USER_IP_PROXY_ANONYM_NOTICE_KEY = 'UserIpProxyAnonym';
25
+
26
+ public function __construct($noticeKey, $noticeType, $noticeMessage = null)
27
+ {
28
+ parent::__construct( $noticeKey, $noticeType, $noticeMessage );
29
+ }
30
+
31
+
32
+
33
+
34
+ }
engine/admin/pages/GdbcBaseAdminPage.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ abstract class GdbcBaseAdminPage extends MchGdbcBaseAdminPage
21
+ {
22
+ private static $arrPageInstances = array();
23
+
24
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
25
+ {
26
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
27
+ $this->setPageLayoutColumns(2);
28
+ self::$arrPageInstances[get_class($this)] = $this;
29
+ }
30
+
31
+ public function registerPageMetaBoxes()
32
+ {
33
+
34
+ parent::registerPageMetaBoxes();
35
+
36
+ if($this->getPageLayoutColumns() <= 1)
37
+ return;
38
+
39
+ add_meta_box(
40
+ "gdbc-help-metabox",
41
+ __('Need help? Have questions...?', GoodByeCaptcha::PLUGIN_SLUG),
42
+ array( $this, 'renderNeedHelpMetaBox' ),
43
+ $this->getAdminScreenId(),
44
+ 'side',
45
+ 'core',
46
+ null
47
+ );
48
+
49
+ add_meta_box(
50
+ "gdbc-help-metabox-test",
51
+ __('How to verify if it works?', GoodByeCaptcha::PLUGIN_SLUG),
52
+ array( $this, 'renderHowToTestMetaBox' ),
53
+ $this->getAdminScreenId(),
54
+ 'side',
55
+ 'low',
56
+ null
57
+ );
58
+
59
+ }
60
+
61
+
62
+ public function renderNeedHelpMetaBox()
63
+ {
64
+ $img = plugins_url('/assets/admin/images/gdbc-logo.png', GoodByeCaptcha::PLUGIN_MAIN_FILE);
65
+
66
+ $display_div = '<img class="logo-help" src="' . esc_attr($img) . '" />';
67
+
68
+ $display_div .= '<p class="contact-help"> <a class = "button-primary" href="' . GoodByeCaptcha::PLUGIN_SITE_URL . '/contact" target="_blank">Contact Us</a></p>';
69
+
70
+ echo $display_div;
71
+ }
72
+
73
+ public function renderHowToTestMetaBox()
74
+ {
75
+ $settingsPageUrl = isset(self::$arrPageInstances['GdbcSettingsAdminPage']) ? self::$arrPageInstances['GdbcSettingsAdminPage']->getAdminUrl() : '';
76
+ $notificationsPageUrl = isset(self::$arrPageInstances['GdbcNotificationsAdminPage']) ? self::$arrPageInstances['GdbcNotificationsAdminPage']->getAdminUrl() : '';
77
+
78
+ $textInfo = __('In order to verify if GoodBye Captcha works as expected, just go to, ', GoodByeCaptcha::PLUGIN_SLUG);
79
+ $textInfo .= MchGdbcHtmlUtils::createAnchorElement(__('Settings Page', GoodByeCaptcha::PLUGIN_SLUG), array('href' => $settingsPageUrl));
80
+ $textInfo .= __(' and <b>Switch the plugin to Test Mode</b>. <br/>While in test mode, the plugin just verifies if it can properly protect the enabled options and sends email notifications to the email address you set in ', GoodByeCaptcha::PLUGIN_SLUG);
81
+ $textInfo .= MchGdbcHtmlUtils::createAnchorElement(__('Notifications Page', GoodByeCaptcha::PLUGIN_SLUG), array('href' => $notificationsPageUrl));
82
+
83
+ $textInfo .= __(' For example, if you want to test the login form protection, just enable protection for the WordPress Login Form, logout from your dashboard and login again. The plugin will send an email notification letting you know if you can keep the protection activated.', GoodByeCaptcha::PLUGIN_SLUG);
84
+
85
+ $textInfo .= __(' In case something goes wrong, a warning message will be shown.', GoodByeCaptcha::PLUGIN_SLUG);
86
+
87
+ echo '<p style="text-align: justify">' . $textInfo . "</p>";
88
+
89
+ $textInfo = '<div class = "mch-meta-notice-warning">';
90
+ $textInfo .= __('<b>Turn off Test Mode as soon as you\'re done with testing!</b>', GoodByeCaptcha::PLUGIN_SLUG);
91
+ $textInfo .= '</div>';
92
+
93
+ echo $textInfo;
94
+
95
+ }
96
+
97
+
98
+ }
engine/admin/pages/GdbcContactFormsAdminPage.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcContactFormsAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
23
+ {
24
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
25
+
26
+ $modulesList = array();
27
+
28
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_JETPACK_CONTACT_FORM))
29
+ $modulesList[] = GdbcJetPackContactFormAdminModule::getInstance();
30
+
31
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_CONTACT_FORM_7))
32
+ $modulesList[] = GdbcContactForm7AdminModule::getInstance();
33
+
34
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_FAST_SECURE_FORM))
35
+ $modulesList[] = GdbcFastSecureFormAdminModule::getInstance();
36
+
37
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_FORMIDABLE_FORMS))
38
+ $modulesList[] = GdbcFormidableFormsAdminModule::getInstance();
39
+
40
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_GRAVITY_FORMS))
41
+ $modulesList[] = GdbcGravityFormsAdminModule::getInstance();
42
+
43
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_NINJA_FORMS))
44
+ $modulesList[] = GdbcNinjaFormsAdminModule::getInstance();
45
+
46
+ $this->registerGroupedModules(array(
47
+ new MchGdbcGroupedModules(__('GoodBye Captcha - Popular Contact Forms Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
48
+ )
49
+ );
50
+
51
+ }
52
+
53
+
54
+
55
+ }
engine/admin/pages/GdbcMembershipAdminPage.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcMembershipAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
23
+ {
24
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
25
+
26
+ $arrModules = array();
27
+
28
+
29
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
30
+ $arrModules[] = GdbcUltimateMemberAdminModule::getInstance();
31
+
32
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BUDDY_PRESS))
33
+ $arrModules[] = GdbcBuddyPressAdminModule::getInstance();
34
+
35
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BB_PRESS))
36
+ $arrModules[] = GdbcBbPressAdminModule::getInstance();
37
+
38
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_USER_PRO))
39
+ $arrModules[] = GdbcUserProAdminModule::getInstance();
40
+
41
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_UPME))
42
+ $arrModules[] = GdbcUPMEAdminModule::getInstance();
43
+
44
+
45
+ $this->registerGroupedModules(array(
46
+ new MchGdbcGroupedModules(__('GoodBye Captcha - Membership Plugins Settings', GoodByeCaptcha::PLUGIN_SLUG), $arrModules)
47
+ )
48
+ );
49
+
50
+ }
51
+
52
+ }
engine/admin/pages/GdbcNotificationsAdminPage.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Copyright (C) 2015 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ class GdbcNotificationsAdminPage extends GdbcBaseAdminPage
22
+ {
23
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
24
+ {
25
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
26
+
27
+ $modulesList = array();
28
+
29
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_EMAIL_NOTIFICATIONS))
30
+ $modulesList[] = GdbcEmailNotificationsAdminModule::getInstance();
31
+
32
+ $this->registerGroupedModules(array(
33
+ new MchGdbcGroupedModules(__('GoodBye Captcha - Notifications Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
34
+ )
35
+ );
36
+
37
+ }
38
+
39
+
40
+
41
+ }
engine/admin/pages/GdbcOthersAdminPage.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcOthersAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
23
+ {
24
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
25
+
26
+ $modulesList = array();
27
+
28
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP))
29
+ $modulesList[] = GdbcMailChimpForWpAdminModule::getInstance();
30
+
31
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_MAIL_POET))
32
+ $modulesList[] = GdbcMailPoetAdminModule::getInstance();
33
+
34
+
35
+ $this->registerGroupedModules(array(
36
+ new MchGdbcGroupedModules(__('GoodBye Captcha - Subscriptions Plugins Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
37
+ )
38
+ );
39
+
40
+
41
+ $modulesList = array();
42
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_WOOCOMMERCE))
43
+ $modulesList[] = GdbcWooCommerceAdminModule::getInstance();
44
+
45
+ $this->registerGroupedModules(array(
46
+ new MchGdbcGroupedModules(__('GoodBye Captcha - eCommerce Plugins Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
47
+ )
48
+ );
49
+
50
+
51
+ $modulesList = array();
52
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ZM_ALR))
53
+ $modulesList[] = GdbcZmAlrAdminModule::getInstance();
54
+
55
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_PLANSO_FORMS))
56
+ $modulesList[] = GdbcPlanSoFormsAdminModule::getInstance();
57
+
58
+
59
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SEAMLESS_DONATIONS))
60
+ $modulesList[] = GdbcSeamlessDonationsAdminModule::getInstance();
61
+
62
+ $this->registerGroupedModules(array(
63
+ new MchGdbcGroupedModules(__('GoodBye Captcha - Other Popular Plugins', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
64
+ )
65
+ );
66
+
67
+
68
+
69
+ }
70
+
71
+ }
engine/admin/pages/GdbcReportsAdminPage.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcReportsAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
23
+ {
24
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
25
+
26
+ $this->setPageLayoutColumns(1);
27
+
28
+ if(!GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_REPORTS))
29
+ return;
30
+
31
+ $this->registerGroupedModules(array(
32
+ new MchGdbcGroupedModules(__('GoodBye Captcha - Blocked Attempts', GoodByeCaptcha::PLUGIN_SLUG), array(GdbcReportsAdminModule::getInstance()))
33
+ )
34
+ );
35
+
36
+
37
+ }
38
+
39
+
40
+ public function renderPageContent()
41
+ {
42
+ $arrReportsNavigationTabUrl = array();
43
+
44
+ $arrQueryString = array(
45
+ 'page' => $this->getPageMenuSlug()
46
+ );
47
+
48
+ $pageAdminUrl = GoodByeCaptcha::isNetworkActivated() ? network_admin_url('admin.php') : admin_url('admin.php');
49
+ $arrReportsNavigationTabUrl[] = esc_url(add_query_arg($arrQueryString, $pageAdminUrl));
50
+ $arrQueryString['gdbc-detailed-report'] = 1;
51
+ $arrReportsNavigationTabUrl[] = esc_url(add_query_arg($arrQueryString, $pageAdminUrl));
52
+
53
+ echo '<div id = "gdbc-reports-holder" class = "clearfix">';
54
+ echo '<h3>' . __('GoodBye Captcha - Blocked Attempts', GoodByeCaptcha::PLUGIN_SLUG) . '</h3>';
55
+
56
+ GdbcReportsAdminModule::getInstance()->renderReportsMainPageContent($arrReportsNavigationTabUrl);
57
+
58
+ echo '</div>';
59
+ }
60
+
61
+
62
+
63
+
64
+ }
engine/admin/pages/GdbcSecurityAdminPage.php ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcSecurityAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ private $blackListedIpsGroupIndex = null;
23
+ private $whiteListedIpsGroupIndex = null;
24
+
25
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
26
+ {
27
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
28
+
29
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BRUTE_FORCE))
30
+ {
31
+ $this->registerGroupedModules(array(
32
+ new MchGdbcGroupedModules(__('GoodBye Captcha Brute Force Settings', GoodByeCaptcha::PLUGIN_SLUG), array(
33
+ GdbcBruteForceAdminModule::getInstance())
34
+ )
35
+ ));
36
+ }
37
+
38
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_WHITE_LISTED_IPS))
39
+ {
40
+ $this->whiteListedIpsGroupIndex = $this->registerGroupedModules(array(
41
+ new MchGdbcGroupedModules(__('White Listed IPs', GoodByeCaptcha::PLUGIN_SLUG), array(
42
+ GdbcWhiteListedIpsAdminModule::getInstance())
43
+ )
44
+ ));
45
+ }
46
+
47
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BLACK_LISTED_IPS))
48
+ {
49
+ $this->blackListedIpsGroupIndex = $this->registerGroupedModules(array(
50
+ new MchGdbcGroupedModules(__('Black Listed IPs', GoodByeCaptcha::PLUGIN_SLUG), array(
51
+ GdbcBlackListedIpsAdminModule::getInstance())
52
+ )
53
+ ));
54
+ }
55
+
56
+ }
57
+
58
+ private function getBlackListedIpsInputName()
59
+ {
60
+ return esc_attr(GdbcBlackListedIpsAdminModule::getInstance()->getSettingKey() . '[' . GdbcBlackListedIpsAdminModule::OPTION_BLACK_LISTED_IPS . ']');
61
+ }
62
+ private function getWhiteListedIpsInputName()
63
+ {
64
+ return esc_attr(GdbcWhiteListedIpsAdminModule::getInstance()->getSettingKey() . '[' . GdbcWhiteListedIpsAdminModule::OPTION_WHITE_LISTED_IPS . ']');
65
+ }
66
+
67
+ public function renderGroupModulesSettings($groupIndex = null)
68
+ {
69
+
70
+ if(!is_numeric($groupIndex))
71
+ {
72
+ foreach ( func_get_args() as $receivedArgument )
73
+ {
74
+ if ( ! isset( $receivedArgument['args'] ) || !is_numeric($receivedArgument['args']))
75
+ continue;
76
+
77
+ $groupIndex = $receivedArgument['args'];
78
+ break;
79
+ }
80
+ }
81
+
82
+ $this->displayGroupModulesMessages($groupIndex);
83
+
84
+ if($this->whiteListedIpsGroupIndex == $groupIndex)
85
+ {
86
+ if(null !== GdbcWhiteListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath())
87
+ {
88
+ include_once GdbcWhiteListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath();
89
+ }
90
+
91
+ return;
92
+ }
93
+
94
+
95
+ if($this->blackListedIpsGroupIndex == $groupIndex)
96
+ {
97
+ if(null !== GdbcBlackListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath())
98
+ {
99
+ include_once GdbcBlackListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath();
100
+ }
101
+
102
+ return;
103
+ }
104
+
105
+ return parent::renderGroupModulesSettings($groupIndex);
106
+
107
+ }
108
+
109
+
110
+ public function registerPageMetaBoxes()
111
+ {
112
+ parent::registerPageMetaBoxes();
113
+
114
+ if($this->getPageLayoutColumns() <= 1)
115
+ return;
116
+
117
+ add_meta_box(
118
+ "gdbc-help-web-attackers-list",
119
+ __('Web Attackers IPs List', GoodByeCaptcha::PLUGIN_SLUG),
120
+ array( $this, 'renderWebAttackersMetaBox' ),
121
+ $this->getAdminScreenId(),
122
+ 'side',
123
+ 'core',
124
+ null
125
+ );
126
+
127
+ add_meta_box(
128
+ "gdbc-help-proxy-anonymizers-list",
129
+ __('Anonymous Proxy IPs List', GoodByeCaptcha::PLUGIN_SLUG),
130
+ array( $this, 'renderProxyAnonymizersMetaBox' ),
131
+ $this->getAdminScreenId(),
132
+ 'side',
133
+ 'core',
134
+ null
135
+ );
136
+
137
+ }
138
+
139
+ public function renderWebAttackersMetaBox()
140
+ {
141
+ $textInfo = __('Provides security against the most well known attackers, with the minimum of false positives. Contains more than 100.000 attackers\' IPs reported by <a href="http://www.spamhaus.org/">Spamhaus.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
142
+ $textInfo .= __(' <a href="http://www.dshield.org/">DShield.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
143
+ $textInfo .= __(' <a href="http://www.openbl.org/">OpenBL.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
144
+ $textInfo .= __(' <a href="http://www.blocklist.de/">BlockList.de</a>,', GoodByeCaptcha::PLUGIN_SLUG);
145
+ $textInfo .= __(' <a href="http://www.projecthoneypot.org/">ProjectHoneypot.org</a> ', GoodByeCaptcha::PLUGIN_SLUG);
146
+ $textInfo .= __(' and <a href="https://greensnow.co/">GreenSnow.co</a>.', GoodByeCaptcha::PLUGIN_SLUG);
147
+
148
+
149
+ echo '<p>' . $textInfo . '</p>';
150
+ }
151
+
152
+ public function renderProxyAnonymizersMetaBox()
153
+ {
154
+ $textInfo = __('Provides protection against the most Proxy used IP addresses identified as high risk by reported by <a href="http://www.spamhaus.org/">Spamhaus.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
155
+ $textInfo .= __(' <a href="http://www.projecthoneypot.org/">ProjectHoneypot.org</a> and <a href="https://www.maxmind.com/en/proxy-detection-sample-list">MaxMind.com</a>.', GoodByeCaptcha::PLUGIN_SLUG);
156
+ $textInfo .= __(' <b>The list also contains the most fraudulent TOR network, TOR Nodes and TOR Exit Points IP Addresses.</b>', GoodByeCaptcha::PLUGIN_SLUG);
157
+
158
+ echo '<p style="text-align: justify">' . $textInfo . '</p>';
159
+ }
160
+
161
+ }
engine/admin/pages/GdbcSettingsAdminPage.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcSettingsAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
23
+ {
24
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
25
+
26
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS))
27
+ {
28
+ $this->registerGroupedModules(array(
29
+ new MchGdbcGroupedModules(__('GoodBye Captcha General Settings', GoodByeCaptcha::PLUGIN_SLUG), array(
30
+ GdbcSettingsAdminModule::getInstance())
31
+ )
32
+ ));
33
+ }
34
+
35
+ }
36
+
37
+ }
engine/admin/pages/GdbcWordpressAdminPage.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcWordpressAdminPage extends GdbcBaseAdminPage
21
+ {
22
+ public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
23
+ {
24
+ parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
25
+
26
+ if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_WORDPRESS))
27
+ {
28
+ $this->registerGroupedModules(array(
29
+ new MchGdbcGroupedModules(__('WordPress Standard Forms Settings', GoodByeCaptcha::PLUGIN_SLUG), array(
30
+ GdbcWordPressAdminModule::getInstance(),
31
+ )
32
+ )
33
+ ));
34
+
35
+
36
+ $this->registerGroupedModules(array(
37
+ new MchGdbcGroupedModules(__('Tweaking WordPress', GoodByeCaptcha::PLUGIN_SLUG), array(
38
+ GdbcWordPressTweaksAdminModule::getInstance(),
39
+ )
40
+ )
41
+ ));
42
+
43
+ }
44
+
45
+ }
46
+
47
+ public function registerPageMetaBoxes()
48
+ {
49
+ parent::registerPageMetaBoxes();
50
+
51
+ if($this->getPageLayoutColumns() <= 1)
52
+ return;
53
+
54
+ add_meta_box(
55
+ "gdbc-help-xml-rpc",
56
+ __('Disabling XML-RPC Service', GoodByeCaptcha::PLUGIN_SLUG),
57
+ array( $this, 'renderXmlRpcMetaBox' ),
58
+ $this->getAdminScreenId(),
59
+ 'side',
60
+ 'core',
61
+ null
62
+ );
63
+
64
+ add_meta_box(
65
+ "gdbc-help-xml-rpc-pingback",
66
+ __('Disabling XML-RPC Pingbacks', GoodByeCaptcha::PLUGIN_SLUG),
67
+ array( $this, 'renderXmlRpcPingbacksMetaBox' ),
68
+ $this->getAdminScreenId(),
69
+ 'side',
70
+ 'core',
71
+ null
72
+ );
73
+
74
+ }
75
+
76
+ public function renderXmlRpcMetaBox()
77
+ {
78
+ $textInfo = __('XML-RPC is used in WordPress as an API for third-party clients such as WordPress mobile apps, popular weblog clients like Windows Writer or popular plugins such as Jetpack.', GoodByeCaptcha::PLUGIN_SLUG);
79
+ $textInfo .= __('If you use any application which calls your XML-RPC Service, <b>do not</b> Completely Disable XML-RPC. Otherwise, completely disabling XML-RPC it is strongly recommended.', GoodByeCaptcha::PLUGIN_SLUG);
80
+
81
+ echo '<p style="text-align: justify">' . $textInfo . '</p>';
82
+
83
+
84
+ $textInfo = '<div class = "mch-meta-notice-info">';
85
+ $textInfo .= __('<span><b>Feel free to Completely Disable XML-RPC if you are using Jetpack plugin</b>. GoodBye Captcha simply allows Jetpack\'s XML-RPC Requests</span>', GoodByeCaptcha::PLUGIN_SLUG);
86
+ $textInfo .= '</div>';
87
+
88
+ echo $textInfo;
89
+
90
+ }
91
+
92
+
93
+ public function renderXmlRpcPingbacksMetaBox()
94
+ {
95
+ $textInfo = __('XML-RPC is used for Pingbacks and Trackbacks which can be heavily misused to start <a href="https://blog.sucuri.net/2014/03/more-than-162000-wordpress-sites-used-for-distributed-denial-of-service-attack.html">DDoS attacks</a>.', GoodByeCaptcha::PLUGIN_SLUG);
96
+
97
+ echo '<p style="text-align: justify">' . $textInfo . '</p>';
98
+
99
+ $textInfo = '<div class = "mch-meta-notice-info">';
100
+ $textInfo .= __('<span>If the <b>Completely Disable XML-RPC</b> option is checked, enabling/disabling this option has no effect!</span>', GoodByeCaptcha::PLUGIN_SLUG);
101
+ $textInfo .= '</div>';
102
+
103
+ echo $textInfo;
104
+ }
105
+
106
+
107
+ }
engine/db-access/GdbcDbAccessController.php ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ final class GdbcDbAccessController
21
+ {
22
+ public static $LAST_INSERTED_ATTEMPT_ID = 0;
23
+
24
+ private static function sanitizeEntityNotes($entityNote)
25
+ {
26
+ if(is_string($entityNote))
27
+ {
28
+ return wp_filter_kses(wp_check_invalid_utf8($entityNote));
29
+ }
30
+
31
+ if(is_array($entityNote))
32
+ {
33
+ return array_map( array( __CLASS__, 'sanitizeEntityNotes' ), $entityNote );
34
+ }
35
+
36
+ return $entityNote;
37
+ }
38
+
39
+ public static function registerAttempt(GdbcAttemptEntity $attemptEntity)
40
+ {
41
+ self::$LAST_INSERTED_ATTEMPT_ID = 0;
42
+
43
+ if(empty($attemptEntity->ModuleId) || empty($attemptEntity->SiteId) || empty($attemptEntity->CreatedDate) || empty($attemptEntity->ReasonId))
44
+ return;
45
+
46
+ unset($attemptEntity->Id);
47
+
48
+ if(is_array($attemptEntity->Notes))
49
+ {
50
+ $attemptEntity->Notes = array_filter($attemptEntity->Notes);
51
+
52
+ $tokenFieldName = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
53
+ $browserInputName = GdbcRequestController::getPostedBrowserInfoInputName();
54
+
55
+ $arrKeysToUnset = array($tokenFieldName, $browserInputName, strtolower($tokenFieldName), strtolower($browserInputName), strtoupper($tokenFieldName), strtoupper($browserInputName), '_wpnonce');
56
+ foreach($arrKeysToUnset as $keyName)
57
+ {
58
+ unset($attemptEntity->Notes[$keyName]);
59
+ }
60
+ }
61
+
62
+ $attemptEntity->Notes = !empty($attemptEntity->Notes) ? maybe_serialize(self::sanitizeEntityNotes($attemptEntity->Notes)) : null;
63
+ global $wpdb;
64
+
65
+ return self::$LAST_INSERTED_ATTEMPT_ID = (false === $wpdb->insert(self::getAttemptsTableName(), array_filter((array)$attemptEntity))) ? 0 : $wpdb->insert_id;
66
+ }
67
+
68
+
69
+ public static function getCombinedAttemptsPerDay($numberOfDays)
70
+ {
71
+ $createdDateTime = self::getDaysAgoTimeStamp($numberOfDays);
72
+
73
+ global $wpdb;
74
+
75
+ $sqlQuery = "SELECT COUNT(1) AS AttemptsNumber, FROM_UNIXTIME(CreatedDate, '%%Y-%%m-%%d') as CreatedDate FROM " . self::getAttemptsTableName() . " WHERE CreatedDate >= %d ";
76
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? '' : ' AND SiteId = %d ';
77
+ $sqlQuery .= " GROUP BY FROM_UNIXTIME(CreatedDate, '%%Y-%%m-%%d') ORDER BY CreatedDate ";
78
+
79
+ $arrParams = array($createdDateTime);
80
+ GoodByeCaptcha::isNetworkActivated() ? null : $arrParams[] = get_current_blog_id();
81
+
82
+ return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
83
+
84
+ }
85
+
86
+ public static function getLatestAttempts($numberOfAttempts)
87
+ {
88
+ global $wpdb;
89
+
90
+ $sqlQuery = 'SELECT * FROM ' . self::getAttemptsTableName();
91
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? '' : ' WHERE SiteId = %d';
92
+ $sqlQuery .= ' ORDER BY CreatedDate DESC LIMIT 0, %d';
93
+
94
+ $arrParams = array();
95
+ GoodByeCaptcha::isNetworkActivated() ? null : $arrParams[] = get_current_blog_id();
96
+
97
+ $arrParams[] = (int)$numberOfAttempts;
98
+
99
+ $latestAttemptsList = (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
100
+
101
+ return $latestAttemptsList;
102
+ }
103
+
104
+ public static function getAttemptsByClientIp($pageNumber, $recordsPerPage = 10)
105
+ {
106
+ global $wpdb;
107
+
108
+ $sqlQuery = "SELECT COUNT(1) AS Attempts, ClientIp FROM " . self::getAttemptsTableName();
109
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
110
+ $sqlQuery .= 'GROUP BY ClientIp ORDER BY Attempts DESC LIMIT %d, %d';
111
+
112
+ $arrParams = array();
113
+
114
+ GoodByeCaptcha::isNetworkActivated() ? null : $arrParams[] = get_current_blog_id();
115
+
116
+ $arrParams = array();
117
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
118
+ $arrParams[] = ($pageNumber-1) * $recordsPerPage;
119
+ $arrParams[] = $recordsPerPage;
120
+
121
+ return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
122
+
123
+ }
124
+
125
+ public static function getTotalAttemptsPerModule()
126
+ {
127
+ global $wpdb;
128
+ $sqlQuery = 'SELECT ModuleId, COUNT(1) as Total FROM ' . self::getAttemptsTableName();
129
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d' : ' WHERE SiteId = %d';
130
+ $sqlQuery .= ' GROUP BY ModuleId';
131
+
132
+ $arrParams = array();
133
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
134
+
135
+ return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
136
+ }
137
+
138
+ public static function getAttemptsPerModuleAndDay($numberOfDays)
139
+ {
140
+ global $wpdb;
141
+ $createdDateTime = self::getDaysAgoTimeStamp($numberOfDays) + 1;
142
+
143
+ $sqlQuery = "SELECT ModuleId, FROM_UNIXTIME(CreatedDate, '%%Y-%%m-%%d') AS AttemptDate, COUNT(1) AS AttemptsNumber FROM " . self::getAttemptsTableName();
144
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
145
+ $sqlQuery .= " AND CreatedDate > $createdDateTime GROUP BY ModuleId, AttemptDate ORDER BY ModuleId ASC, AttemptDate DESC";
146
+
147
+ $arrParams = array();
148
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
149
+
150
+ return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
151
+ }
152
+
153
+ public static function getNumberOfAttemptsByModuleId($moduleId)
154
+ {
155
+ global $wpdb;
156
+ $sqlQuery = 'SELECT COUNT(1) AS Total FROM ' . self::getAttemptsTableName();
157
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
158
+ $sqlQuery .= ' AND ModuleId = %d ';
159
+
160
+ $arrParams = array();
161
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
162
+ $arrParams[] = $moduleId;
163
+
164
+ $arrTotalAttempts = self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
165
+
166
+ return isset($arrTotalAttempts[0]) ? (int)$arrTotalAttempts[0]->Total : 0;
167
+
168
+ }
169
+
170
+ public static function getAttemptsPerModule($moduleId, $pageNumber, $recordsPerPage)
171
+ {
172
+ global $wpdb;
173
+
174
+ $pageNumber < 1 ? $pageNumber = 1 : null;
175
+
176
+ $sqlQuery = "SELECT * FROM " . self::getAttemptsTableName();
177
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
178
+ $sqlQuery .= ' AND ModuleId = %d ORDER BY CreatedDate DESC LIMIT %d, %d';
179
+
180
+ $arrParams = array();
181
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
182
+ $arrParams[] = $moduleId;
183
+
184
+ $arrParams[] = ($pageNumber-1) * $recordsPerPage;
185
+ $arrParams[] = $recordsPerPage;
186
+
187
+ return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
188
+ }
189
+
190
+ public static function getAttemptById($attemptId)
191
+ {
192
+ global $wpdb;
193
+ $sqlQuery = 'SELECT * FROM ' . self::getAttemptsTableName() . ' WHERE Id = %d';
194
+ $arrGdbcAttempts = self::executePreparedQuery($wpdb->prepare($sqlQuery, $attemptId));
195
+ return isset($arrGdbcAttempts[0]) ? $arrGdbcAttempts[0] : 0;
196
+ }
197
+
198
+ public static function getAttemptsPerModuleAndSection()
199
+ {
200
+ global $wpdb;
201
+ $sqlQuery = 'SELECT ModuleId, SectionId, Count(ModuleId) AS Attempts FROM ' . self::getAttemptsTableName();
202
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d' : ' WHERE SiteId = %d';
203
+ $sqlQuery .= ' GROUP BY ModuleId, SectionId';
204
+
205
+ $arrParams = array();
206
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
207
+
208
+ return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
209
+
210
+
211
+ }
212
+
213
+ private static function getDaysAgoTimeStamp($numberOfDays)
214
+ {
215
+ return MchGdbcHttpRequest::getServerRequestTime() - ( absint($numberOfDays) * 3600 * 24 );
216
+ }
217
+
218
+ private static function executePreparedQuery($sqlQuery)
219
+ {
220
+ global $wpdb;
221
+ return null !== ($queryResult = $wpdb->get_results($sqlQuery)) ? $queryResult : array();
222
+ }
223
+
224
+ public static function createAttemptsTable()
225
+ {
226
+ global $wpdb;
227
+ if(self::attemptsTableExists())
228
+ return false;
229
+
230
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
231
+
232
+ $createTableStatement = "CREATE TABLE " . self::getAttemptsTableName() . " (
233
+ Id int unsigned NOT NULL auto_increment,
234
+ CreatedDate int unsigned NOT NULL,
235
+ SiteId smallint unsigned NOT NULL,
236
+ ClientIp varchar(45) DEFAULT NULL,
237
+ ModuleId tinyint unsigned NOT NULL,
238
+ SectionId tinyint unsigned default 0,
239
+ ReasonId tinyint unsigned NOT NULL,
240
+ Notes longtext NOT NULL DEFAULT '',
241
+ PRIMARY KEY (Id),
242
+ KEY idx_gdbc_CreatedDateSiteId (CreatedDate, SiteId)
243
+ )"; //KEY index_gdbc_ClientIp (ClientIp)
244
+
245
+ $createTableStatement .= !empty($wpdb->charset) ? " DEFAULT CHARACTER SET {$wpdb->charset}" : '';
246
+ $createTableStatement .= !empty($wpdb->collate) ? " COLLATE {$wpdb->collate}" : '';
247
+
248
+ $result = dbDelta($createTableStatement);
249
+
250
+ return !empty($result) ? true : false;
251
+
252
+ }
253
+
254
+
255
+
256
+ public static function deleteAttemptsOlderThan($numberOfDays)
257
+ {
258
+ if(empty($numberOfDays))
259
+ return;
260
+
261
+ $createdDateTime = self::getDaysAgoTimeStamp($numberOfDays);
262
+
263
+ global $wpdb;
264
+ $sqlQuery = 'DELETE FROM ' . self::getAttemptsTableName() . ' WHERE CreatedDate < %d ';
265
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' AND Id > %d ' : ' AND SiteId = %d ';
266
+ $sqlQuery .= 'LIMIT 300';
267
+
268
+ $arrParams = array($createdDateTime);
269
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
270
+
271
+ self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
272
+
273
+ }
274
+
275
+ public static function clearAttemptsNotesOlderThan($numberOfDays)
276
+ {
277
+ if(empty($numberOfDays))
278
+ return;
279
+
280
+ $createdDateTime = self::getDaysAgoTimeStamp($numberOfDays);
281
+
282
+ global $wpdb;
283
+ $sqlQuery = 'UPDATE ' . self::getAttemptsTableName() . " SET Notes = '' WHERE CreatedDate < %d AND (Notes <> '' OR Notes IS NOT NULL )";
284
+ $sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' AND Id > %d ' : ' AND SiteId = %d ';
285
+ $sqlQuery .= 'LIMIT 300';
286
+
287
+ $arrParams = array($createdDateTime);
288
+ $arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
289
+
290
+ self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
291
+
292
+ }
293
+
294
+
295
+ public static function getLatestLoginAttempts($numberOfSecondsAgo, $calculateAverage = false)
296
+ {
297
+ global $wpdb;
298
+
299
+ $averageStatement = ($calculateAverage) ? 'FORMAT( (MAX(CreatedDate) - MIN(CreatedDate)) / (Count(1) - 1) , 2) As TimeAverage,' : '';
300
+
301
+ $sqlQuery = "SELECT Count(1) AS Hits, $averageStatement ClientIp FROM " . self::getAttemptsTableName();
302
+ $sqlQuery .= ' WHERE CreatedDate > %d ' . ( GoodByeCaptcha::isNetworkActivated() ? 'AND SiteId = %d' : '');
303
+ $sqlQuery .= ' AND ( ';
304
+
305
+ foreach(GoodByeCaptchaUtils::getAllPossibleLoginAttemptEntities() as $gdbcAttempt){
306
+ $sqlQuery .= '(ModuleId = ' . $gdbcAttempt->ModuleId . ' AND SectionId = ' . $gdbcAttempt->SectionId . ') OR ';
307
+ }
308
+
309
+ $sqlQuery = substr($sqlQuery, 0, -4) . ' ) GROUP BY ClientIp';
310
+
311
+ $arrParams = array(MchGdbcHttpRequest::getServerRequestTime() - $numberOfSecondsAgo - 1);
312
+
313
+ $arrParams = array(
314
+ MchGdbcHttpRequest::getServerRequestTime() - $numberOfSecondsAgo - 2,
315
+ get_current_blog_id()
316
+ );
317
+
318
+
319
+ return self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
320
+
321
+ }
322
+
323
+
324
+ public static function attemptsTableExistsAndIsEmpty()
325
+ {
326
+ if(!self::attemptsTableExists())
327
+ return false;
328
+
329
+ global $wpdb;
330
+ $arrFirstId = $wpdb->get_col('SELECT Id FROM ' . self::getAttemptsTableName() . ' LIMIT 1');
331
+ return empty($arrFirstId);
332
+ }
333
+
334
+ public static function attemptsTableExists()
335
+ {
336
+ global $wpdb;
337
+ return ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", self::getAttemptsTableName())) === self::getAttemptsTableName());
338
+ }
339
+
340
+
341
+ public static function getAttemptsTableName()
342
+ {
343
+ global $wpdb;
344
+ return $wpdb->base_prefix . 'gdbc_attempts';
345
+ }
346
+
347
+
348
+ public static function getLoginAttempts($lastNumberOfSeconds)
349
+ {
350
+ // SELECT Count(1) AS Hits , ((MAX(CreatedDate) - MIN(CreatedDate)) / (Count(1) - 1)) As Average, ClientIp
351
+ // from wp_gdbc_attempts qa where qa.CreatedDate > (1443473534 - (1 * 60)) GROUP BY ClientIp;
352
+ }
353
+
354
+ private function __construct()
355
+ {}
356
+ }
engine/entities/GdbcAttemptEntity.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Copyright (C) 2014 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ class GdbcAttemptEntity
22
+ {
23
+ public $Id = null;
24
+ public $CreatedDate = null;
25
+ public $ModuleId = null;
26
+ public $SectionId = null;
27
+ public $SiteId = null;
28
+ public $ClientIp = null;
29
+ // public $CountryId = null;
30
+ public $ReasonId = null;
31
+ public $Notes = null;
32
+
33
+ public function __construct($moduleId, $sectionId = 0)
34
+ {
35
+ $this->ModuleId = $moduleId;
36
+ $this->SectionId = $sectionId;
37
+ }
38
+
39
+ public static function getInstanceFromRawData($rawDataEntity)
40
+ {
41
+ if(empty($rawDataEntity))
42
+ return null;
43
+
44
+ $jsonDecoded = is_string($rawDataEntity) ? json_decode($rawDataEntity, true) : null;
45
+ if(null !== $jsonDecoded)
46
+ $rawDataEntity = $jsonDecoded;
47
+
48
+ $rawDataEntity = (null !== $jsonDecoded) ? $jsonDecoded : (array)$rawDataEntity;
49
+
50
+ if(empty($rawDataEntity['ModuleId']))
51
+ return null;
52
+
53
+ $attemptEntity = new GdbcAttemptEntity($rawDataEntity['ModuleId']);
54
+ foreach($rawDataEntity as $property=>$value)
55
+ {
56
+ if(!property_exists($attemptEntity, $property))
57
+ continue;
58
+
59
+ $attemptEntity->{$property} = $value;
60
+ }
61
+
62
+ return $attemptEntity;
63
+ }
64
+ }
engine/modules/GdbcBaseAdminModule.php ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ abstract class GdbcBaseAdminModule extends MchGdbcBaseAdminModule
21
+ {
22
+
23
+ protected function __construct()
24
+ {
25
+ parent::__construct();
26
+ }
27
+
28
+ public abstract function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity);
29
+
30
+ protected function getAllSavedOptions($asNetworkOption = true)
31
+ {
32
+ return parent::getAllSavedOptions(GoodByeCaptcha::isNetworkActivated());
33
+ }
34
+
35
+ public function getOption($optionName, $asNetworkOption = true)
36
+ {
37
+ return parent::getOption($optionName, GoodByeCaptcha::isNetworkActivated());
38
+ }
39
+
40
+ public function saveOption($optionName, $optionValue, $asNetworkOption = true)
41
+ {
42
+ return parent::saveOption($optionName, $optionValue, GoodByeCaptcha::isNetworkActivated());
43
+ }
44
+
45
+ public function renderModuleSettingsSectionHeader(array $arrSectionInfo)
46
+ {
47
+ //echo '<h3>' . __('WordPress General Settings', GoodByeCaptcha::PLUGIN_SLUG) . '</h3><hr />';
48
+ }
49
+
50
+ public function renderModuleSettingsField(array $arrSettingsField)
51
+ {
52
+ $arrDefaultValues = $this->getDefaultOptionsValues();
53
+ $optionName = key($arrSettingsField);
54
+ if(null === $optionName || !array_key_exists($optionName, $arrDefaultValues))
55
+ return;
56
+
57
+ $optionValue = $this->getOption($optionName);
58
+ // if(null === $optionValue && isset($arrDefaultValues[$optionName]))
59
+ // {
60
+ // if(!is_array($arrDefaultValues[$optionName])) {
61
+ // $optionValue = $arrDefaultValues[$optionName];
62
+ // }
63
+ // }
64
+
65
+ $arrSettingsField = $arrSettingsField[$optionName];
66
+ $arrFieldAttributes = array(
67
+ 'name' => $this->getSettingKey() . '[' . $optionName . ']',
68
+ 'type' => !empty($arrSettingsField['InputType']) ? $arrSettingsField['InputType'] : 'text',
69
+ 'value' => $optionValue,
70
+ 'id' => $this->getSettingKey() . '-' . $optionName,
71
+ );
72
+
73
+ if($arrFieldAttributes['type'] === MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX)
74
+ {
75
+ !empty($arrFieldAttributes['value']) ? $arrFieldAttributes['checked'] = 'checked' : null;
76
+ $arrFieldAttributes['value'] = true;
77
+ }
78
+
79
+
80
+ switch ($arrFieldAttributes['type'])
81
+ {
82
+ case MchGdbcHtmlUtils::FORM_ELEMENT_SELECT :
83
+
84
+ echo MchGdbcHtmlUtils::createSelectElement($arrFieldAttributes);
85
+
86
+ break;
87
+
88
+ default :
89
+
90
+ echo MchGdbcHtmlUtils::createInputElement($arrFieldAttributes);
91
+ }
92
+
93
+ if(!empty($arrSettingsField['Description']))
94
+ {
95
+ echo '<p class = "description">' . $arrSettingsField['Description'] . '</p>';
96
+ }
97
+
98
+ }
99
+
100
+ protected function getFormattedFieldDescription($description)
101
+ {
102
+ return '<p class = "description">' . esc_html( $description ); '</p>';
103
+ }
104
+
105
+
106
+ public function getOptionDisplayTextByOptionId($settingOptionId)
107
+ {
108
+ $settingOptionId = (int)$settingOptionId;
109
+
110
+ foreach($this->getDefaultOptions() as $arrOptionInfo)
111
+ {
112
+ if (isset($arrOptionInfo['Id']) && $arrOptionInfo['Id'] === $settingOptionId && isset($arrOptionInfo['DisplayText']))
113
+ return esc_html($arrOptionInfo['DisplayText']);
114
+ }
115
+
116
+ return null;
117
+ }
118
+
119
+ public function getOptionIdByOptionName($settingOptionName)
120
+ {
121
+ $arrDefaultSettingOptions = $this->getDefaultOptions();
122
+
123
+ return isset($arrDefaultSettingOptions[$settingOptionName]['Id']) ? $arrDefaultSettingOptions[$settingOptionName]['Id'] : 0;
124
+ }
125
+
126
+ public function getOptionNameByOptionId($settingOptionId)
127
+ {
128
+ $settingOptionId = (int)$settingOptionId;
129
+ foreach($this->getDefaultOptions() as $optionName => $arrOptionInfo)
130
+ {
131
+ if (isset($arrOptionInfo['Id']) && (int)$arrOptionInfo['Id'] === $settingOptionId)
132
+ return $optionName;
133
+ }
134
+
135
+ return null;
136
+ }
137
+
138
+ protected static function getBlockedContentDisplayableKey($blockedContentKey)
139
+ {
140
+ $arrMappedKeys = array(
141
+
142
+ 'username' => __('Username', GoodByeCaptcha::PLUGIN_SLUG),
143
+ 'password' => __('Password', GoodByeCaptcha::PLUGIN_SLUG),
144
+ 'email' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
145
+ 'post' => __('Post', GoodByeCaptcha::PLUGIN_SLUG),
146
+ 'page' => __('Page', GoodByeCaptcha::PLUGIN_SLUG),
147
+
148
+ 'comment_post_ID' => __('Post Id', GoodByeCaptcha::PLUGIN_SLUG),
149
+ 'comment_author' => __('Author', GoodByeCaptcha::PLUGIN_SLUG),
150
+ 'comment_author_email' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
151
+ 'comment_author_url' => __('Website', GoodByeCaptcha::PLUGIN_SLUG),
152
+ 'comment_content' => __('Content', GoodByeCaptcha::PLUGIN_SLUG),
153
+ 'comment_parent' => __('As Reply to', GoodByeCaptcha::PLUGIN_SLUG),
154
+
155
+ 'your-name' => __('Name', GoodByeCaptcha::PLUGIN_SLUG),
156
+ 'your-email' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
157
+ 'your-subject' => __('Subject', GoodByeCaptcha::PLUGIN_SLUG),
158
+ 'your-message' => __('Message', GoodByeCaptcha::PLUGIN_SLUG),
159
+
160
+ 'page-url' => __('Page URL', GoodByeCaptcha::PLUGIN_SLUG),
161
+ 'post-url' => __('Post URL', GoodByeCaptcha::PLUGIN_SLUG),
162
+
163
+ 'ADDRESS' => __('Address', GoodByeCaptcha::PLUGIN_SLUG),
164
+ 'FNAME' => __('First Name', GoodByeCaptcha::PLUGIN_SLUG),
165
+ 'LNAME' => __('Last Name', GoodByeCaptcha::PLUGIN_SLUG),
166
+ 'NNAME' => __('Nick Name', GoodByeCaptcha::PLUGIN_SLUG),
167
+ 'GROUPINGS' => __('Group', GoodByeCaptcha::PLUGIN_SLUG),
168
+ 'EMAIL' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
169
+
170
+
171
+ 'honoreestate' => __('State', GoodByeCaptcha::PLUGIN_SLUG),
172
+ 'honoreeprovince' => __('Province', GoodByeCaptcha::PLUGIN_SLUG),
173
+ 'honoreecountry' => __('Country', GoodByeCaptcha::PLUGIN_SLUG),
174
+
175
+ 'firstname' => __('First Name', GoodByeCaptcha::PLUGIN_SLUG),
176
+ 'lastname' => __('Last Name', GoodByeCaptcha::PLUGIN_SLUG),
177
+ 'phone' => __('Phone', GoodByeCaptcha::PLUGIN_SLUG),
178
+
179
+
180
+ 'country' => __('Country', GoodByeCaptcha::PLUGIN_SLUG),
181
+ 'item_name' => __('Item', GoodByeCaptcha::PLUGIN_SLUG),
182
+ 'amount' => __('Amount', GoodByeCaptcha::PLUGIN_SLUG),
183
+ 'paymentmethod' => __('Method', GoodByeCaptcha::PLUGIN_SLUG),
184
+
185
+
186
+ 'secretkey' => __('Secret key', GoodByeCaptcha::PLUGIN_SLUG),
187
+ 'authorid' => __('Author Id', GoodByeCaptcha::PLUGIN_SLUG),
188
+ );
189
+
190
+ $blockedKey = trim($blockedContentKey);
191
+ return isset($arrMappedKeys[$blockedKey]) ? $arrMappedKeys[$blockedKey] : esc_html($blockedContentKey);
192
+ }
193
+
194
+ }
engine/modules/GdbcBasePublicModule.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ abstract class GdbcBasePublicModule extends MchGdbcBasePublicModule
21
+ {
22
+ private $submittedData = null;
23
+
24
+
25
+ protected $attemptEntity = null;
26
+
27
+ /**
28
+ * @return int
29
+ */
30
+ protected abstract function getModuleId();
31
+
32
+ protected function __construct()
33
+ {
34
+ parent::__construct();
35
+
36
+ $this->submittedData = array();
37
+ $this->attemptEntity = new GdbcAttemptEntity($this->getModuleId());
38
+ }
39
+
40
+ protected function getAllSavedOptions($asNetworkOption = true)
41
+ {
42
+ return parent::getAllSavedOptions(GoodByeCaptcha::isNetworkActivated());
43
+ }
44
+
45
+ public function getOption($optionName, $asNetworkOption = true)
46
+ {
47
+ return parent::getOption($optionName, GoodByeCaptcha::isNetworkActivated());
48
+ }
49
+
50
+ protected function setSubmittedData(array $submittedData)
51
+ {
52
+ $this->submittedData = $submittedData;
53
+ }
54
+
55
+ protected function getSubmittedData()
56
+ {
57
+ return $this->submittedData;
58
+ }
59
+
60
+ /**
61
+ * @return GdbcAttemptEntity | null
62
+ */
63
+
64
+ protected function getAttemptEntity()
65
+ {
66
+ return $this->attemptEntity;
67
+ }
68
+
69
+
70
+ public function getOptionIdByOptionName($settingOptionName)
71
+ {
72
+
73
+ $adminModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::getModuleNameById($this->getModuleId()));
74
+ if(null === $adminModuleInstance)
75
+ return 0;
76
+
77
+ return $adminModuleInstance->getOptionIdByOptionName($settingOptionName);
78
+
79
+ }
80
+
81
+
82
+ public function renderTokenFieldIntoForm()
83
+ {
84
+ echo $this->getTokenFieldHtml();
85
+ }
86
+
87
+ public function getTokenFieldHtml()
88
+ {
89
+ $hiddenField = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
90
+ if(!isset($hiddenField[0]))
91
+ {
92
+ GdbcSettingsAdminModule::getInstance()->saveSecuredOptions(true);
93
+ $hiddenField = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
94
+ }
95
+
96
+ return '<input type="hidden" autocomplete="off" autocorrect="off" name="' . esc_attr( $hiddenField ) . '" value="" />';
97
+ }
98
+
99
+
100
+ }
engine/modules/black-listed-ips/GdbcBlackListedIpsAdminModule.php ADDED
@@ -0,0 +1,249 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Copyright (C) 2015 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ final class GdbcBlackListedIpsAdminModule extends GdbcBaseAdminModule
22
+ {
23
+ CONST OPTION_BLACK_LISTED_IPS = 'BlackListedIps';
24
+
25
+ protected function __construct()
26
+ {
27
+ parent::__construct();
28
+ }
29
+
30
+ public function getDefaultOptions()
31
+ {
32
+ static $arrDefaultSettingOptions = null;
33
+ if(null !== $arrDefaultSettingOptions)
34
+ return $arrDefaultSettingOptions;
35
+
36
+ $arrDefaultSettingOptions = array(
37
+
38
+ self::OPTION_BLACK_LISTED_IPS => array(
39
+ 'Id' => 1,
40
+ 'Value' => null,
41
+ 'LabelText' => null,
42
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_TEXT
43
+ ),
44
+
45
+ );
46
+
47
+ return $arrDefaultSettingOptions;
48
+
49
+ }
50
+
51
+ public function validateModuleSettingsFields($arrSettingOptions)
52
+ {
53
+ $arrSettingOptions = array_map('sanitize_text_field', (array)$arrSettingOptions);
54
+ $arrAlreadySavedIps = (array)$this->getOption(self::OPTION_BLACK_LISTED_IPS);
55
+
56
+ $action = 'add';
57
+ if(!empty($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]) && strpos($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS], 'remove-') !== false)
58
+ {
59
+ $action = 'remove';
60
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = str_replace('remove-', '', $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]);
61
+ }
62
+
63
+ $preparedData = empty($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]) ? array() : GdbcIPUtils::getFormattedIpRangeForDb($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]);
64
+ $ipVersion = key($preparedData);
65
+
66
+ if('remove' === $action && !empty($preparedData[$ipVersion]))
67
+ {
68
+ $minIpValue = $preparedData[$ipVersion][0];
69
+ $maxIpValue = $preparedData[$ipVersion][1];
70
+
71
+ if( isset($arrAlreadySavedIps[$ipVersion][$minIpValue]) && $arrAlreadySavedIps[$ipVersion][$minIpValue] == $maxIpValue)
72
+ {
73
+ $this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
74
+ unset($arrAlreadySavedIps[$ipVersion][$minIpValue]);
75
+ }
76
+
77
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
78
+ return $arrSettingOptions;
79
+ }
80
+
81
+ if(empty($preparedData[$ipVersion]) || !is_array($preparedData[$ipVersion]))
82
+ {
83
+ $this->registerErrorMessage(__('Invalid IP/CIDR/Range provided!', GoodByeCaptcha::PLUGIN_SLUG));
84
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
85
+
86
+ return $arrSettingOptions;
87
+ }
88
+
89
+ if(!in_array($ipVersion, array(MchGdbcIPUtils::IP_VERSION_4, MchGdbcIPUtils::IP_VERSION_6)))
90
+ {
91
+ $this->registerErrorMessage(__('Invalid IP/CIDR/Range provided', GoodByeCaptcha::PLUGIN_SLUG));
92
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
93
+
94
+ return $arrSettingOptions;
95
+ }
96
+
97
+ if(1 === $preparedData[$ipVersion][1])
98
+ {
99
+ if (GdbcIPUtils::isIpBlackListed($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]))
100
+ {
101
+ $this->registerErrorMessage(sprintf(__("The IP %s is already black-listed!", GoodByeCaptcha::PLUGIN_SLUG), esc_html($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS])));
102
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
103
+
104
+ return $arrSettingOptions;
105
+ }
106
+ }
107
+
108
+ if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4]))
109
+ $arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4] = array();
110
+
111
+ if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6]))
112
+ $arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6] = array();
113
+
114
+ $arrIpRanges = array();
115
+ $arrSingleIPs = array();
116
+ if(1 !== $preparedData[$ipVersion][1])
117
+ {
118
+ foreach($arrAlreadySavedIps[$ipVersion] as $minValue => $maxValue)
119
+ {
120
+ if( 1 === $maxValue )
121
+ {
122
+ $arrSingleIPs[] = $minValue;
123
+ continue;
124
+ }
125
+
126
+ if( ($minValue <= $preparedData[$ipVersion][0]) && ($preparedData[$ipVersion][1] <= $maxValue) )
127
+ {
128
+ $this->registerErrorMessage(sprintf(__("The IP Range %s is already black-listed!", GoodByeCaptcha::PLUGIN_SLUG), esc_html($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS])));
129
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
130
+
131
+ return $arrSettingOptions;
132
+ }
133
+
134
+ $arrIpRanges[] = array($minValue, $maxValue);
135
+ }
136
+
137
+ $arrIpRanges[] = $preparedData[$ipVersion];
138
+ }
139
+
140
+ if(!empty($arrIpRanges)) {
141
+ $arrIpRanges = MchGdbcUtils::overlapIntervals($arrIpRanges);
142
+
143
+ $arrAlreadySavedIps[$ipVersion] = array();
144
+ // Add single IPs always on top of Ranges
145
+ foreach($arrSingleIPs as $ipNumber){
146
+ if(!isset($arrAlreadySavedIps[$ipVersion][$ipNumber]))
147
+ $arrAlreadySavedIps[$ipVersion][$ipNumber] = 1;
148
+ }
149
+
150
+ foreach($arrIpRanges as $arrRange){
151
+ $arrAlreadySavedIps[$ipVersion][ $arrRange[0] ] = $arrRange[1];
152
+ }
153
+ }
154
+ else
155
+ {
156
+ $arrAlreadySavedIps[$ipVersion][$preparedData[$ipVersion][0]] = $preparedData[$ipVersion][1];
157
+ }
158
+
159
+
160
+ $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
161
+
162
+ $this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
163
+
164
+ return $arrSettingOptions;
165
+ }
166
+
167
+ public function renderModuleSettingsSectionHeader(array $arrSectionInfo)
168
+ {}
169
+
170
+ public function getPartialAdminSettingsFilePath()
171
+ {
172
+ $filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'partials' . DIRECTORY_SEPARATOR . 'admin-settings.php';
173
+ return is_file($filePath) ? $filePath : null;
174
+ }
175
+
176
+ public static function getInstance()
177
+ {
178
+ static $adminInstance = null;
179
+ return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
180
+ }
181
+
182
+ public function registerBlackListedIp($ipAddress)
183
+ {
184
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
185
+
186
+ if($ipVersion !== MchGdbcIPUtils::IP_VERSION_4 && $ipVersion !== MchGdbcIPUtils::IP_VERSION_6)
187
+ return false;
188
+
189
+ $arrAlreadySavedIps = $this->getOption(self::OPTION_BLACK_LISTED_IPS);
190
+ (null === $arrAlreadySavedIps) ? $arrAlreadySavedIps = array() : null;
191
+
192
+ if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4]))
193
+ $arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4] = array();
194
+
195
+ if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6]))
196
+ $arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6] = array();
197
+
198
+ $preparedDataForDb = GdbcIPUtils::getFormattedIpRangeForDb($ipAddress);
199
+
200
+ if(!isset($preparedDataForDb[$ipVersion][0]))
201
+ return false;
202
+
203
+ if(isset($arrAlreadySavedIps[$ipVersion][ $preparedDataForDb[$ipVersion][0] ])) // single IP
204
+ return true;
205
+
206
+ $arrAlreadySavedIps[$ipVersion][$preparedDataForDb[$ipVersion][0]] = $preparedDataForDb[$ipVersion][1];
207
+
208
+
209
+ return $this->saveOption(self::OPTION_BLACK_LISTED_IPS, $arrAlreadySavedIps);
210
+
211
+ }
212
+
213
+ public function unRegisterBlackListedIp($ipAddress)
214
+ {
215
+ $ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
216
+
217
+ if($ipVersion !== MchGdbcIPUtils::IP_VERSION_4 && $ipVersion !== MchGdbcIPUtils::IP_VERSION_6)
218
+ return false;
219
+
220
+
221
+ $arrAlreadySavedIps = $this->getOption(self::OPTION_BLACK_LISTED_IPS);
222
+ (null === $arrAlreadySavedIps) ? $arrAlreadySavedIps = array() : null;
223
+
224
+ if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4]))
225
+ $arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4] = array();
226
+
227
+ if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6]))
228
+ $arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6] = array();
229
+
230
+ if(empty($arrAlreadySavedIps[$ipVersion]))
231
+ return false;
232
+
233
+ $arrFormattedRanges = GdbcIPUtils::removeIpFromFormattedRange($ipAddress, $arrAlreadySavedIps[$ipVersion]);
234
+ if($arrFormattedRanges == $arrAlreadySavedIps[$ipVersion])
235
+ return false;
236
+
237
+ $arrAlreadySavedIps[$ipVersion] = $arrFormattedRanges;
238
+
239
+ return $this->saveOption(self::OPTION_BLACK_LISTED_IPS, $arrAlreadySavedIps);
240
+
241
+ }
242
+
243
+ public function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity)
244
+ {
245
+ return null;
246
+ }
247
+
248
+
249
+ }
engine/modules/black-listed-ips/GdbcBlackListedIpsPublicModule.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Copyright (C) 2015 Mihai Chelaru
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ */
20
+
21
+ final class GdbcBlackListedIpsPublicModule extends GdbcBasePublicModule
22
+ {
23
+
24
+ protected function __construct()
25
+ {
26
+ parent::__construct();
27
+ }
28
+
29
+ /**
30
+ * @return int
31
+ */
32
+ protected function getModuleId()
33
+ {
34
+ return GdbcModulesController::getModuleIdByName(GdbcModulesController::MODULE_BLACK_LISTED_IPS);
35
+ }
36
+
37
+ public static function getInstance()
38
+ {
39
+ static $adminInstance = null;
40
+ return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
41
+ }
42
+
43
+ }
engine/modules/black-listed-ips/partials/admin-settings.php ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2015 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+ ?>
20
+ <style type="text/css">
21
+
22
+ .gdbc-settings tr.even
23
+ {
24
+ background-color:#f5f5f5;
25
+ }
26
+
27
+ .gdbc-blacklisted-ips-holder input[type="text"]
28
+ {
29
+ width: 99%;
30
+ }
31
+ .gdbc-blacklisted-ips-holder thead tbody > tr form > td:first-child
32
+ {
33
+ padding: 0 30px !important;
34
+ }
35
+
36
+ .gdbc-blacklisted-ips-holder td
37
+ {
38
+ vertical-align: middle !important;
39
+ word-wrap: normal !important;
40
+ }
41
+ .gdbc-blacklisted-ips-holder th
42
+ {
43
+ font-weight: 700;
44
+ }
45
+
46
+ .gdbc-settings .tablenav-pages span.current {
47
+ font-size: 18px;
48
+ font-weight: bold;
49
+ line-height: 30px;
50
+ padding: 4px 6px;
51
+ text-decoration: none;
52
+ }
53
+
54
+ </style>
55
+
56
+ <?php
57
+
58
+ $formAction = GoodByeCaptcha::isNetworkActivated() ? '' : 'options.php';
59
+
60
+ ?>
61
+
62
+
63
+ <table class="wp-list-table widefat fixed gdbc-blacklisted-ips-holder">
64
+ <thead>
65
+
66
+ <tr>
67
+ <th></th>
68
+ <th></th>
69
+ <th></th>
70
+ <th></th>
71
+ </tr>
72
+
73
+
74
+ <tr class = "even">
75
+ <td colspan="4" style=" text-align: right">
76
+ <form method="post" action="<?php echo $formAction ?>">
77
+ <div class="clearfix" style="margin:0 auto; width: 700px;">
78
+ <input style = "float: left;clear: left; width: 80%;" type="text" name="<?php echo $this->getBlackListedIpsInputName();?>" placeholder="<?php _e('IP/RANGE/CIDR', GoodByeCaptcha::PLUGIN_SLUG); ?>" required />
79
+ <input style = "float: right;" type="submit" value="<?php _e('Add to BlackList', GoodByeCaptcha::PLUGIN_SLUG); ?>" class="button button-primary" />
80
+ </div>
81
+
82
+ <?php settings_fields( $this->getSettingGroupId($this->blackListedIpsGroupIndex) );?>
83
+
84
+ </form>
85
+ </td>
86
+ </tr>
87
+ <tr>
88
+ <th width="5%"></th>
89
+ <th width="30%"></th>
90
+ <th width="50%"></th>
91
+ <th width="15%"></th>
92
+ </tr>
93
+
94
+ <tr>
95
+ <th width="5%"><?php _e('Blocked Hosts', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
96
+ <th width="30%"><?php _e('IP Address/Range/CIDR', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
97
+ <th width="60%"><?php _e('Country', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
98
+ <th width="5%" style="text-align: right; padding-right: 22px"><?php _e('Actions', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
99
+ </tr>
100
+
101
+ </thead>
102
+
103
+ <tbody>
104
+ <?php
105
+
106
+ $arrAllIPs = GdbcIPUtils::getFormattedIpRangesForDisplay(GdbcBlackListedIpsAdminModule::getInstance()->getOption(GdbcBlackListedIpsAdminModule::OPTION_BLACK_LISTED_IPS));
107
+
108
+ $blackListPageNumber = !empty( $_GET['blackListPageNumber'] ) ? absint( sanitize_text_field($_GET['blackListPageNumber']) ) : 1;
109
+
110
+ $recordsPerPage = 10;
111
+
112
+ $paginationCode = null;
113
+
114
+ $arrRecords = array_chunk($arrAllIPs, $recordsPerPage, true);
115
+
116
+ if(isset($arrRecords[1]))
117
+ {
118
+ $paginationCode = paginate_links(
119
+ array(
120
+ 'base' => add_query_arg( 'blackListPageNumber', '%#%' ),
121
+ 'format' => '',
122
+ 'prev_text' => __( '&laquo;', GoodByeCaptcha::PLUGIN_SLUG ),
123
+ 'next_text' => __( '&raquo;', GoodByeCaptcha::PLUGIN_SLUG ),
124
+ 'total' => ceil(count($arrAllIPs)/$recordsPerPage),
125
+ 'current' => $blackListPageNumber
126
+ )
127
+ );
128
+ }
129
+
130
+ if(!empty($arrRecords[$blackListPageNumber - 1]))
131
+ $arrRecords = $arrRecords[$blackListPageNumber - 1];
132
+ else
133
+ $arrRecords = $arrAllIPs;
134
+
135
+ foreach($arrRecords as $key => $formattedIp)
136
+ {
137
+
138
+ $arrFormattedIp = explode('|', $formattedIp);
139
+ if(count($arrFormattedIp) != 2)
140
+ continue;
141
+
142
+ $countryCode = sanitize_text_field(MchGdbcIPUtils::getCountryCode($arrFormattedIp[0]));
143
+
144
+ $countryName = GoodByeCaptchaUtils::getCountryNameById(GoodByeCaptchaUtils::getCountryIdByCode($countryCode));
145
+
146
+ if(empty($countryName))
147
+ {
148
+ $countryName = __('Unavailable', GoodByeCaptcha::PLUGIN_SLUG);
149
+ }
150
+
151
+ $rowClass = (($key % 2) == 0) ? 'even' : '';
152
+
153
+ echo '<tr class="' . $rowClass . '">';
154
+
155
+ echo '<td width="5%">' . $arrFormattedIp[1] . '</td>';
156
+ echo '<td width="30%">' . strtoupper($arrFormattedIp[0]) . '</td>';
157
+ echo '<td width="60%">' . $countryName . '</td>';
158
+
159
+ ?>
160
+
161
+ <td style="text-align: right;" width="5%">
162
+ <form method="post" action="<?php echo $formAction ?>">
163
+ <?php settings_fields( $this->getSettingGroupId($this->blackListedIpsGroupIndex) );?>
164
+ <input type="hidden" name="<?php echo $this->getBlackListedIpsInputName();?>" value="<?php echo 'remove-' . $arrFormattedIp[0]?>" />
165
+ <input type="submit" value="<?php echo __('Remove', GoodByeCaptcha::PLUGIN_SLUG); ?>" class="button" />
166
+ </form>
167
+ </td>
168
+
169
+
170
+
171
+ <?php
172
+
173
+ echo '</tr>';
174
+
175
+ }
176
+
177
+
178
+ ?>
179
+
180
+
181
+ </tbody>
182
+ </table>
183
+
184
+
185
+ <?php
186
+ if(!empty($paginationCode))
187
+ {
188
+ echo '<div class="postbox-footer clearfix" style="">';
189
+ echo '<div class="tablenav"><div class="tablenav-pages" style="margin:0">' . $paginationCode . '</div></div></div>';
190
+ }
191
+ ?>
192
+
193
+
194
+ <div class="postbox-footer clearfix" style="">
195
+
196
+ <dl style="width: 48%; float: left; border-right: 1px solid #ddd; padding-right: 15px">
197
+ <dt><h4 style="margin: 2px 0; border-bottom: 1px solid #ccc;">Accepted IPV4 Formats</h4></dt>
198
+ <dd style="margin-left: 0">Standard IPV4 format <span style="float: right">123.123.1.1</span></dd>
199
+ <dd style="margin-left: 0">Standard CIDR Block format <span style="float: right">123.123.1.1/32</span></dd>
200
+ <dd style="margin-left: 0">Wildcard Range format <span style="float: right">123.123.1.*</span></dd>
201
+ <dd style="margin-left: 0">Non-Standard Range format <span style="float: right">123.123.1.1 - 123.123.1.10</span></dd>
202
+ </dl>
203
+
204
+ <dl style="width: 50%; float: right;" >
205
+ <dt><h4 style="margin: 2px 0; border-bottom: 1px solid #ccc;">Accepted IPV6 Formats</h4></dt>
206
+ <dd style="margin-left: 0">Fully Uncompressed format <span style="float: right">2002:4559:1FE2:0000:0000:0000:4559:1FE2</span></dd>
207
+ <dd style="margin-left: 0">Standard CIDR Block format <span style="float: right">2002:4559:1FE2::4559:1FE2/128</span></dd>
208
+ <dd style="margin-left: 0">Uncompressed format <span style="float: right">2002:4559:1FE2:0:0:0:4559:1FE2</span></dd>
209
+ <dd style="margin-left: 0">Compressed format <span style="float: right">2002:4559:1FE2::4559:1FE2</span></dd>
210
+ </dl>
211
+
212
+ </div>
213
+
214
+
engine/modules/brute-force/GdbcBruteForceAdminModule.php ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcBruteForceAdminModule extends GdbcBaseAdminModule
21
+ {
22
+ CONST OPTION_AUTO_BLOCK_IP = 'AutoBlockIp';
23
+ CONST OPTION_PREVENT_USER_ENUM = 'PreventUserEnum';
24
+ CONST OPTION_BLOCK_ANONYMOUS_PROXY = 'AnonymousProxy';
25
+ CONST OPTION_BLOCK_WEB_ATTACKERS = 'WebAttackers';
26
+
27
+ protected function __construct()
28
+ {
29
+ parent::__construct();
30
+ }
31
+
32
+ public function getDefaultOptions()
33
+ {
34
+ static $arrDefaultSettingOptions = null;
35
+ if(null !== $arrDefaultSettingOptions)
36
+ return $arrDefaultSettingOptions;
37
+
38
+ $arrDefaultSettingOptions = array(
39
+
40
+ self::OPTION_AUTO_BLOCK_IP => array(
41
+ 'Id' => 1,
42
+ 'Value' => NULL,
43
+ 'LabelText' => __('Automatically Block IP Addresses', GoodByeCaptcha::PLUGIN_SLUG),
44
+ 'Description' => __('Automatically block IP Addresses that are brute-forcing your system', GoodByeCaptcha::PLUGIN_SLUG),
45
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
46
+ ),
47
+
48
+ self::OPTION_PREVENT_USER_ENUM => array(
49
+ 'Id' => 2,
50
+ 'Value' => true,
51
+ 'LabelText' => __('Prevent User Enumeration', GoodByeCaptcha::PLUGIN_SLUG),
52
+ 'Description' => __('Prevents bots from enumerating users by ID in order to find their real username', GoodByeCaptcha::PLUGIN_SLUG),
53
+ 'DisplayText' => __('UserEnumeration', GoodByeCaptcha::PLUGIN_SLUG),
54
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
55
+ ),
56
+
57
+
58
+ self::OPTION_BLOCK_WEB_ATTACKERS => array(
59
+ 'Id' => 3,
60
+ 'Value' => NULL,
61
+ 'LabelText' => __('Block Web Attackers IPs', GoodByeCaptcha::PLUGIN_SLUG),
62
+ 'Description' => __('Blocks most dangerous IP addresses involved in brute force attacks, cross-site scripting or SQL injection', GoodByeCaptcha::PLUGIN_SLUG),
63
+ 'DisplayText' => __('Attacker', GoodByeCaptcha::PLUGIN_SLUG),
64
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
65
+ ),
66
+
67
+ self::OPTION_BLOCK_ANONYMOUS_PROXY => array(
68
+ 'Id' => 4,
69
+ 'Value' => NULL,
70
+ 'LabelText' => __('Block Anonymous Proxy IPs', GoodByeCaptcha::PLUGIN_SLUG),
71
+ 'Description' => __('Blocks most dangerous IP addresses associated with web proxies that shield the originator\'s IP address', GoodByeCaptcha::PLUGIN_SLUG),
72
+ 'DisplayText' => __('Anonymizer', GoodByeCaptcha::PLUGIN_SLUG),
73
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
74
+ ),
75
+
76
+ );
77
+
78
+ return $arrDefaultSettingOptions;
79
+
80
+ }
81
+
82
+ public function renderModuleSettingsField(array $arrSettingsField)
83
+ {
84
+
85
+ $optionName = key($arrSettingsField);
86
+ if(null === $optionName || !array_key_exists($optionName, $this->getDefaultOptionsValues()))
87
+ return;
88
+
89
+ parent::renderModuleSettingsField($arrSettingsField);
90
+ }
91
+
92
+
93
+ public function validateModuleSettingsFields($arrSettingOptions)
94
+ {
95
+ $arrSettingOptions = array_map('sanitize_text_field', (array)$arrSettingOptions);
96
+
97
+ $this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
98
+
99
+ return $arrSettingOptions;
100
+
101
+ }
102
+
103
+ public function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity)
104
+ {
105
+ $attemptEntity->Notes = (array)maybe_unserialize($attemptEntity->Notes);
106
+ $arrContent = array('table-head-rows' => '', 'table-body-rows' => '');
107
+
108
+ $section = null;
109
+ switch($this->getOptionNameByOptionId($attemptEntity->SectionId))
110
+ {
111
+ case self::OPTION_PREVENT_USER_ENUM :
112
+ $section = __('User Enumeration', GoodByeCaptcha::PLUGIN_SLUG);
113
+ break;
114
+
115
+ default:
116
+ $section = __('Brute Force', GoodByeCaptcha::PLUGIN_SLUG);
117
+ break;
118
+
119
+ }
120
+
121
+ $tableHeadRows = '';
122
+ $tableBodyRows = '';
123
+
124
+ $tableHeadRows .= '<tr>';
125
+ $tableHeadRows .= '<th colspan="2">' . sprintf(__("%s - Blocked Attempt", GoodByeCaptcha::PLUGIN_SLUG), $section) . '</th>';
126
+ $tableHeadRows .= '</tr>';
127
+
128
+ $tableHeadRows .= '<tr>';
129
+ $tableHeadRows .= '<th>' . __('Field', GoodByeCaptcha::PLUGIN_SLUG) . '</th>';
130
+ $tableHeadRows .= '<th>' . __('Value', GoodByeCaptcha::PLUGIN_SLUG) . '</th>';
131
+ $tableHeadRows .= '</tr>';
132
+
133
+
134
+ foreach($attemptEntity->Notes as $key => $value)
135
+ {
136
+ $tableBodyRows .='<tr>';
137
+ $tableBodyRows .= '<td>' . self::getBlockedContentDisplayableKey($key) . '</td>';
138
+ $tableBodyRows .= '<td>' . wp_filter_kses(print_r($value, true)) . '</td>';
139
+ $tableBodyRows .='</tr>';
140
+ }
141
+
142
+ $arrContent['table-head-rows'] = $tableHeadRows;
143
+ $arrContent['table-body-rows'] = $tableBodyRows;
144
+
145
+ return $arrContent;
146
+
147
+ }
148
+
149
+ public static function getInstance()
150
+ {
151
+ static $adminInstance = null;
152
+ return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
153
+ }
154
+
155
+
156
+ }
engine/modules/brute-force/GdbcBruteForcePublicModule.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcBruteForcePublicModule extends GdbcBasePublicModule
21
+ {
22
+ private $preventUserEnumHookIndex = null;
23
+
24
+ protected function __construct()
25
+ {
26
+ parent::__construct();
27
+
28
+ if($this->getOption(GdbcBruteForceAdminModule::OPTION_PREVENT_USER_ENUM))
29
+ {
30
+ $this->preventUserEnumHookIndex = $this->addActionHook('pre_get_posts', array($this, 'checkUserEnumeration'), 10, 1);
31
+ }
32
+
33
+ }
34
+
35
+ public function checkUserEnumeration($wpQuery)
36
+ {
37
+ if(!$wpQuery->is_main_query() || !$wpQuery->is_author() || empty($_REQUEST['author']) || !is_numeric($_REQUEST['author']))
38
+ return;
39
+
40
+ $wpQuery->set('author_name', '');
41
+
42
+ $this->attemptEntity->SectionId = $this->getOptionIdByOptionName(GdbcBruteForceAdminModule::OPTION_PREVENT_USER_ENUM);
43
+ $this->attemptEntity->Notes = array('authorid'=>absint($_REQUEST['author']));
44
+ $this->attemptEntity->ReasonId = GdbcRequestController::REJECT_REASON_USER_ENUMERATION;
45
+
46
+ GdbcBruteGuardian::logRejectedAttempt($this->attemptEntity);
47
+
48
+ GdbcRequestController::redirectToHomePage();
49
+ }
50
+
51
+
52
+ /**
53
+ * @return int
54
+ */
55
+ protected function getModuleId()
56
+ {
57
+ return GdbcModulesController::getModuleIdByName(GdbcModulesController::MODULE_BRUTE_FORCE);
58
+ }
59
+
60
+ public static function getInstance()
61
+ {
62
+ static $publicInstance = null;
63
+ return null !== $publicInstance ? $publicInstance : $publicInstance = new self();
64
+ }
65
+
66
+ }
engine/modules/email-notifications/GdbcEmailNotificationsAdminModule.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcEmailNotificationsAdminModule extends GdbcBaseAdminModule
21
+ {
22
+ CONST OPTION_EMAIL_ADDRESS = 'Email';
23
+ CONST OPTION_TEST_MODE_NOTIFICATION = 'TestModeNotification';
24
+ CONST OPTION_BRUTE_FORCE_ATTACK_DETECTED = 'IsUnderAttack';
25
+
26
+ protected function __construct()
27
+ {
28
+ parent::__construct();
29
+ }
30
+
31
+ public function getDefaultOptions()
32
+ {
33
+ static $arrDefaultSettingOptions = null;
34
+ if(null !== $arrDefaultSettingOptions)
35
+ return $arrDefaultSettingOptions;
36
+
37
+ $arrDefaultSettingOptions = array(
38
+
39
+ self::OPTION_BRUTE_FORCE_ATTACK_DETECTED => array(
40
+ 'Value' => true,
41
+ 'LabelText' => __('Brute Force Attack Detected', GoodByeCaptcha::PLUGIN_SLUG),
42
+ 'Description' => __('A notification email will be sent when a brute force attack is detected', GoodByeCaptcha::PLUGIN_SLUG),
43
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
44
+ ),
45
+
46
+ self::OPTION_EMAIL_ADDRESS => array(
47
+ 'Value' => MchGdbcWpUtils::getAdminEmailAddress(),
48
+ 'LabelText' => __('Administrator Email Address', GoodByeCaptcha::PLUGIN_SLUG),
49
+ 'Description' => __('The email address where GoodBye Captcha will send notifications', GoodByeCaptcha::PLUGIN_SLUG),
50
+ 'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_TEXT
51
+ ),
52
+
53
+ );
54
+
55
+ return $arrDefaultSettingOptions;
56
+
57
+ }
58
+
59
+
60
+ public function renderModuleSettingsSectionHeader(array $arrSectionInfo)
61
+ {
62
+ echo '<h3>' . __('Email Notifications Settings', GoodByeCaptcha::PLUGIN_SLUG) . '</h3><hr />';
63
+ }
64
+
65
+ public function renderModuleSettingsField(array $arrSettingsField)
66
+ {
67
+ parent::renderModuleSettingsField($arrSettingsField);
68
+ }
69
+
70
+
71
+ public function validateModuleSettingsFields($arrSettingOptions)
72
+ {
73
+
74
+ $arrSettingOptions = array_map('sanitize_text_field', (array)$arrSettingOptions);
75
+ if(!empty($arrSettingOptions[self::OPTION_EMAIL_ADDRESS]))
76
+ {
77
+ $arrSettingOptions[self::OPTION_EMAIL_ADDRESS] = sanitize_email($arrSettingOptions[self::OPTION_EMAIL_ADDRESS]);
78
+ if(false === is_email($arrSettingOptions[self::OPTION_EMAIL_ADDRESS])){
79
+ $this->registerErrorMessage(__('Please provide a valid email address!', GoodByeCaptcha::PLUGIN_SLUG));
80
+ unset($arrSettingOptions[self::OPTION_EMAIL_ADDRESS]);
81
+ }
82
+ }
83
+
84
+ $this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
85
+
86
+ return $arrSettingOptions;
87
+
88
+ }
89
+
90
+ public static function getInstance()
91
+ {
92
+ static $adminInstance = null;
93
+ return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
94
+ }
95
+
96
+ public function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity)
97
+ {
98
+ return null;
99
+ }
100
+
101
+ }
engine/modules/email-notifications/GdbcEmailNotificationsPublicModule.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014 Mihai Chelaru
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ class GdbcEmailNotificationsPublicModule extends GdbcBasePublicModule
21
+ {
22
+
23
+ //private $layoutTemplateFilePath = null;
24
+ //private $isHtmlFormattedEmail = false;
25
+
26
+ //public $AddressToSend = null;
27
+