tiro-notes 0.51.58 → 0.51.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/node-build/cli.js +309 -0
  2. package/{client → node-build/client}/asset-manifest.json +2 -2
  3. package/{client → node-build/client}/index.html +1 -1
  4. package/{client/static/js/main.27398ae3.chunk.js → node-build/client/static/js/main.1a719093.chunk.js} +1 -1
  5. package/node-build/package.json +28 -0
  6. package/{server → node-build/server}/tiro-server.js +1 -1
  7. package/package.json +2 -2
  8. /package/{README.md → node-build/README.md} +0 -0
  9. /package/{client → node-build/client}/appicons/icons/mac/icon.icns +0 -0
  10. /package/{client → node-build/client}/appicons/icons/png/1024x1024.png +0 -0
  11. /package/{client → node-build/client}/appicons/icons/png/128x128.png +0 -0
  12. /package/{client → node-build/client}/appicons/icons/png/16x16.png +0 -0
  13. /package/{client → node-build/client}/appicons/icons/png/24x24.png +0 -0
  14. /package/{client → node-build/client}/appicons/icons/png/256x256.png +0 -0
  15. /package/{client → node-build/client}/appicons/icons/png/32x32.png +0 -0
  16. /package/{client → node-build/client}/appicons/icons/png/48x48.png +0 -0
  17. /package/{client → node-build/client}/appicons/icons/png/512x512.png +0 -0
  18. /package/{client → node-build/client}/appicons/icons/png/64x64.png +0 -0
  19. /package/{client → node-build/client}/appicons/icons/win/icon.ico +0 -0
  20. /package/{client → node-build/client}/appicons/tiro_icon.icns +0 -0
  21. /package/{client → node-build/client}/appicons/tiro_icon.ico +0 -0
  22. /package/{client → node-build/client}/appicons/tiro_icon.png +0 -0
  23. /package/{client → node-build/client}/custom_icons/bottom-left.png +0 -0
  24. /package/{client → node-build/client}/custom_icons/bottom-right.png +0 -0
  25. /package/{client → node-build/client}/custom_icons/bottom.png +0 -0
  26. /package/{client → node-build/client}/custom_icons/check.svg +0 -0
  27. /package/{client → node-build/client}/custom_icons/left.png +0 -0
  28. /package/{client → node-build/client}/custom_icons/line.svg +0 -0
  29. /package/{client → node-build/client}/custom_icons/right.png +0 -0
  30. /package/{client → node-build/client}/custom_icons/top-left.png +0 -0
  31. /package/{client → node-build/client}/custom_icons/top-right.png +0 -0
  32. /package/{client → node-build/client}/custom_icons/top.png +0 -0
  33. /package/{client → node-build/client}/custom_icons/uncheck.svg +0 -0
  34. /package/{client → node-build/client}/custom_icons/view-1.svg +0 -0
  35. /package/{client → node-build/client}/custom_icons/view-2.svg +0 -0
  36. /package/{client → node-build/client}/custom_icons/view-3.svg +0 -0
  37. /package/{client → node-build/client}/custom_icons/view-4.svg +0 -0
  38. /package/{client → node-build/client}/favicon.png +0 -0
  39. /package/{client → node-build/client}/icon-192x192.png +0 -0
  40. /package/{client → node-build/client}/icon-256x256.png +0 -0
  41. /package/{client → node-build/client}/icon-384x384.png +0 -0
  42. /package/{client → node-build/client}/icon-512x512.png +0 -0
  43. /package/{client → node-build/client}/manifest.json +0 -0
  44. /package/{client → node-build/client}/manifest.webmanifest +0 -0
  45. /package/{client → node-build/client}/service-worker.js +0 -0
  46. /package/{client → node-build/client}/static/css/12.394917b1.chunk.css +0 -0
  47. /package/{client → node-build/client}/static/js/0.b890b1cb.chunk.js +0 -0
  48. /package/{client → node-build/client}/static/js/1.24c0d2eb.chunk.js +0 -0
  49. /package/{client → node-build/client}/static/js/100.4020f20c.chunk.js +0 -0
  50. /package/{client → node-build/client}/static/js/101.21c27e18.chunk.js +0 -0
  51. /package/{client → node-build/client}/static/js/102.e3f94c8e.chunk.js +0 -0
  52. /package/{client → node-build/client}/static/js/103.18e92661.chunk.js +0 -0
  53. /package/{client → node-build/client}/static/js/104.cd956379.chunk.js +0 -0
  54. /package/{client → node-build/client}/static/js/105.1e2e5889.chunk.js +0 -0
  55. /package/{client → node-build/client}/static/js/106.5c24ba4b.chunk.js +0 -0
  56. /package/{client → node-build/client}/static/js/107.80b988bf.chunk.js +0 -0
  57. /package/{client → node-build/client}/static/js/108.fff04134.chunk.js +0 -0
  58. /package/{client → node-build/client}/static/js/109.ec78f8d9.chunk.js +0 -0
  59. /package/{client → node-build/client}/static/js/110.44788eb1.chunk.js +0 -0
  60. /package/{client → node-build/client}/static/js/12.6d6dc9bb.chunk.js +0 -0
  61. /package/{client → node-build/client}/static/js/12.6d6dc9bb.chunk.js.LICENSE.txt +0 -0
  62. /package/{client → node-build/client}/static/js/13.9e34d8ba.chunk.js +0 -0
  63. /package/{client → node-build/client}/static/js/14.a886302f.chunk.js +0 -0
  64. /package/{client → node-build/client}/static/js/15.01bf8225.chunk.js +0 -0
  65. /package/{client → node-build/client}/static/js/16.67051f41.chunk.js +0 -0
  66. /package/{client → node-build/client}/static/js/17.82cdd47c.chunk.js +0 -0
  67. /package/{client → node-build/client}/static/js/18.ddb404ef.chunk.js +0 -0
  68. /package/{client → node-build/client}/static/js/19.7dd55448.chunk.js +0 -0
  69. /package/{client → node-build/client}/static/js/2.b4b18203.chunk.js +0 -0
  70. /package/{client → node-build/client}/static/js/20.59f5165d.chunk.js +0 -0
  71. /package/{client → node-build/client}/static/js/21.79c4b0e8.chunk.js +0 -0
  72. /package/{client → node-build/client}/static/js/22.007e32b0.chunk.js +0 -0
  73. /package/{client → node-build/client}/static/js/23.f61a9d2c.chunk.js +0 -0
  74. /package/{client → node-build/client}/static/js/24.e0d7947e.chunk.js +0 -0
  75. /package/{client → node-build/client}/static/js/25.e8450ff4.chunk.js +0 -0
  76. /package/{client → node-build/client}/static/js/26.ea917da6.chunk.js +0 -0
  77. /package/{client → node-build/client}/static/js/27.40c86fd7.chunk.js +0 -0
  78. /package/{client → node-build/client}/static/js/28.36540711.chunk.js +0 -0
  79. /package/{client → node-build/client}/static/js/29.90bee6cc.chunk.js +0 -0
  80. /package/{client → node-build/client}/static/js/3.303b3d58.chunk.js +0 -0
  81. /package/{client → node-build/client}/static/js/30.41fd826a.chunk.js +0 -0
  82. /package/{client → node-build/client}/static/js/31.ceec3129.chunk.js +0 -0
  83. /package/{client → node-build/client}/static/js/32.f164128c.chunk.js +0 -0
  84. /package/{client → node-build/client}/static/js/33.0aa32cf1.chunk.js +0 -0
  85. /package/{client → node-build/client}/static/js/34.a7b2b96c.chunk.js +0 -0
  86. /package/{client → node-build/client}/static/js/35.d6fc00c0.chunk.js +0 -0
  87. /package/{client → node-build/client}/static/js/36.2c384957.chunk.js +0 -0
  88. /package/{client → node-build/client}/static/js/37.a4733489.chunk.js +0 -0
  89. /package/{client → node-build/client}/static/js/38.151ab2a6.chunk.js +0 -0
  90. /package/{client → node-build/client}/static/js/39.79ebafd7.chunk.js +0 -0
  91. /package/{client → node-build/client}/static/js/4.5e26b40b.chunk.js +0 -0
  92. /package/{client → node-build/client}/static/js/40.f3d995a0.chunk.js +0 -0
  93. /package/{client → node-build/client}/static/js/41.e90a9137.chunk.js +0 -0
  94. /package/{client → node-build/client}/static/js/42.bd656ca1.chunk.js +0 -0
  95. /package/{client → node-build/client}/static/js/43.8074805b.chunk.js +0 -0
  96. /package/{client → node-build/client}/static/js/44.8da981a2.chunk.js +0 -0
  97. /package/{client → node-build/client}/static/js/45.1a2b3b01.chunk.js +0 -0
  98. /package/{client → node-build/client}/static/js/46.2e55aca9.chunk.js +0 -0
  99. /package/{client → node-build/client}/static/js/47.57672172.chunk.js +0 -0
  100. /package/{client → node-build/client}/static/js/48.3bfd34d7.chunk.js +0 -0
  101. /package/{client → node-build/client}/static/js/49.c657ccf4.chunk.js +0 -0
  102. /package/{client → node-build/client}/static/js/5.f7811373.chunk.js +0 -0
  103. /package/{client → node-build/client}/static/js/50.36421e1d.chunk.js +0 -0
  104. /package/{client → node-build/client}/static/js/51.cd3bd891.chunk.js +0 -0
  105. /package/{client → node-build/client}/static/js/52.ddd90678.chunk.js +0 -0
  106. /package/{client → node-build/client}/static/js/53.8933ff1d.chunk.js +0 -0
  107. /package/{client → node-build/client}/static/js/54.1d25d19c.chunk.js +0 -0
  108. /package/{client → node-build/client}/static/js/55.f0195607.chunk.js +0 -0
  109. /package/{client → node-build/client}/static/js/56.931338e0.chunk.js +0 -0
  110. /package/{client → node-build/client}/static/js/57.8304da63.chunk.js +0 -0
  111. /package/{client → node-build/client}/static/js/58.3dbe9d9e.chunk.js +0 -0
  112. /package/{client → node-build/client}/static/js/59.d8dd3c13.chunk.js +0 -0
  113. /package/{client → node-build/client}/static/js/6.b8cf2c81.chunk.js +0 -0
  114. /package/{client → node-build/client}/static/js/60.e8ba53a7.chunk.js +0 -0
  115. /package/{client → node-build/client}/static/js/61.41f7057e.chunk.js +0 -0
  116. /package/{client → node-build/client}/static/js/62.8312dcd3.chunk.js +0 -0
  117. /package/{client → node-build/client}/static/js/63.ceff6f5a.chunk.js +0 -0
  118. /package/{client → node-build/client}/static/js/64.2b51a3a2.chunk.js +0 -0
  119. /package/{client → node-build/client}/static/js/65.5b662f09.chunk.js +0 -0
  120. /package/{client → node-build/client}/static/js/66.aed0e545.chunk.js +0 -0
  121. /package/{client → node-build/client}/static/js/67.c68e472b.chunk.js +0 -0
  122. /package/{client → node-build/client}/static/js/68.482d5776.chunk.js +0 -0
  123. /package/{client → node-build/client}/static/js/69.adf6efab.chunk.js +0 -0
  124. /package/{client → node-build/client}/static/js/7.5575eef7.chunk.js +0 -0
  125. /package/{client → node-build/client}/static/js/70.54d4c087.chunk.js +0 -0
  126. /package/{client → node-build/client}/static/js/71.e02a4ef4.chunk.js +0 -0
  127. /package/{client → node-build/client}/static/js/72.cdabbbd2.chunk.js +0 -0
  128. /package/{client → node-build/client}/static/js/73.b58eb627.chunk.js +0 -0
  129. /package/{client → node-build/client}/static/js/74.a7b0defd.chunk.js +0 -0
  130. /package/{client → node-build/client}/static/js/75.7ee75f2a.chunk.js +0 -0
  131. /package/{client → node-build/client}/static/js/76.88cf92c8.chunk.js +0 -0
  132. /package/{client → node-build/client}/static/js/77.64a32f3b.chunk.js +0 -0
  133. /package/{client → node-build/client}/static/js/78.e19d46e1.chunk.js +0 -0
  134. /package/{client → node-build/client}/static/js/79.2daf87c6.chunk.js +0 -0
  135. /package/{client → node-build/client}/static/js/8.977d1a5d.chunk.js +0 -0
  136. /package/{client → node-build/client}/static/js/80.2591cada.chunk.js +0 -0
  137. /package/{client → node-build/client}/static/js/81.4a8cdda6.chunk.js +0 -0
  138. /package/{client → node-build/client}/static/js/82.285db5b4.chunk.js +0 -0
  139. /package/{client → node-build/client}/static/js/83.c3ae3b75.chunk.js +0 -0
  140. /package/{client → node-build/client}/static/js/84.0316e16e.chunk.js +0 -0
  141. /package/{client → node-build/client}/static/js/85.da21c20c.chunk.js +0 -0
  142. /package/{client → node-build/client}/static/js/86.54af0d45.chunk.js +0 -0
  143. /package/{client → node-build/client}/static/js/87.c3e1d4bb.chunk.js +0 -0
  144. /package/{client → node-build/client}/static/js/88.6f1f304d.chunk.js +0 -0
  145. /package/{client → node-build/client}/static/js/89.9bf1904b.chunk.js +0 -0
  146. /package/{client → node-build/client}/static/js/9.3b7d0e8d.chunk.js +0 -0
  147. /package/{client → node-build/client}/static/js/90.f4f97bc7.chunk.js +0 -0
  148. /package/{client → node-build/client}/static/js/91.06e2ef0f.chunk.js +0 -0
  149. /package/{client → node-build/client}/static/js/92.05d93a9c.chunk.js +0 -0
  150. /package/{client → node-build/client}/static/js/93.84099dca.chunk.js +0 -0
  151. /package/{client → node-build/client}/static/js/94.c20443c3.chunk.js +0 -0
  152. /package/{client → node-build/client}/static/js/95.eef2f092.chunk.js +0 -0
  153. /package/{client → node-build/client}/static/js/96.1f09d3f2.chunk.js +0 -0
  154. /package/{client → node-build/client}/static/js/97.e7cce996.chunk.js +0 -0
  155. /package/{client → node-build/client}/static/js/98.ed47f20f.chunk.js +0 -0
  156. /package/{client → node-build/client}/static/js/99.038f33b0.chunk.js +0 -0
  157. /package/{client → node-build/client}/static/js/runtime-main.bbeed8c8.js +0 -0
  158. /package/{client → node-build/client}/static/media/book-solid.87f5b737.svg +0 -0
  159. /package/{client → node-build/client}/static/media/compact-disc-solid.55b6e50c.svg +0 -0
  160. /package/{client → node-build/client}/static/media/deco-bg-map.7ca9103b.png +0 -0
  161. /package/{client → node-build/client}/static/media/fa-brands-400.150de8ea.ttf +0 -0
  162. /package/{client → node-build/client}/static/media/fa-brands-400.e033a13e.woff2 +0 -0
  163. /package/{client → node-build/client}/static/media/fa-regular-400.3223dc79.woff2 +0 -0
  164. /package/{client → node-build/client}/static/media/fa-regular-400.d8747423.ttf +0 -0
  165. /package/{client → node-build/client}/static/media/fa-solid-900.4a2cd718.ttf +0 -0
  166. /package/{client → node-build/client}/static/media/fa-solid-900.bb975c96.woff2 +0 -0
  167. /package/{client → node-build/client}/static/media/fa-v4compatibility.0e3a648b.ttf +0 -0
  168. /package/{client → node-build/client}/static/media/fa-v4compatibility.68577e40.woff2 +0 -0
  169. /package/{client → node-build/client}/static/media/file-audio-solid.a76f99f0.svg +0 -0
  170. /package/{client → node-build/client}/static/media/file-code-solid.62b467ac.svg +0 -0
  171. /package/{client → node-build/client}/static/media/file-excel-solid.217d73db.svg +0 -0
  172. /package/{client → node-build/client}/static/media/file-pdf-solid.0a9d75fe.svg +0 -0
  173. /package/{client → node-build/client}/static/media/file-powerpoint-solid.4d969453.svg +0 -0
  174. /package/{client → node-build/client}/static/media/file-solid.6415173e.svg +0 -0
  175. /package/{client → node-build/client}/static/media/file-video-solid.312288cf.svg +0 -0
  176. /package/{client → node-build/client}/static/media/file-word-solid.9228e1ff.svg +0 -0
  177. /package/{client → node-build/client}/static/media/file-zipper-solid.7db57917.svg +0 -0
  178. /package/{client → node-build/client}/static/media/globe-africa-solid.0ad34146.svg +0 -0
  179. /package/{client → node-build/client}/static/media/link-solid.7b689dbd.svg +0 -0
  180. /package/{client → node-build/client}/static/media/open-sans-all-400-normal.cb2542fc.woff +0 -0
  181. /package/{client → node-build/client}/static/media/open-sans-all-700-normal.105e4309.woff +0 -0
  182. /package/{client → node-build/client}/static/media/open-sans-all-800-normal.86e783c7.woff +0 -0
  183. /package/{client → node-build/client}/static/media/open-sans-cyrillic-400-normal.5a546777.woff2 +0 -0
  184. /package/{client → node-build/client}/static/media/open-sans-cyrillic-700-normal.2cf6253f.woff2 +0 -0
  185. /package/{client → node-build/client}/static/media/open-sans-cyrillic-800-normal.41902933.woff2 +0 -0
  186. /package/{client → node-build/client}/static/media/open-sans-cyrillic-ext-400-normal.01b11c56.woff2 +0 -0
  187. /package/{client → node-build/client}/static/media/open-sans-cyrillic-ext-700-normal.00b4dd17.woff2 +0 -0
  188. /package/{client → node-build/client}/static/media/open-sans-cyrillic-ext-800-normal.2c1c4cc5.woff2 +0 -0
  189. /package/{client → node-build/client}/static/media/open-sans-greek-400-normal.3064bf7e.woff2 +0 -0
  190. /package/{client → node-build/client}/static/media/open-sans-greek-700-normal.a0312547.woff2 +0 -0
  191. /package/{client → node-build/client}/static/media/open-sans-greek-800-normal.d60c6496.woff2 +0 -0
  192. /package/{client → node-build/client}/static/media/open-sans-greek-ext-400-normal.1ed998a4.woff2 +0 -0
  193. /package/{client → node-build/client}/static/media/open-sans-greek-ext-700-normal.8850c90c.woff2 +0 -0
  194. /package/{client → node-build/client}/static/media/open-sans-greek-ext-800-normal.fe3583f2.woff2 +0 -0
  195. /package/{client → node-build/client}/static/media/open-sans-hebrew-400-normal.daafcec8.woff2 +0 -0
  196. /package/{client → node-build/client}/static/media/open-sans-hebrew-700-normal.3befb44d.woff2 +0 -0
  197. /package/{client → node-build/client}/static/media/open-sans-hebrew-800-normal.bfe88fed.woff2 +0 -0
  198. /package/{client → node-build/client}/static/media/open-sans-latin-400-normal.a1535f45.woff2 +0 -0
  199. /package/{client → node-build/client}/static/media/open-sans-latin-700-normal.b245bc85.woff2 +0 -0
  200. /package/{client → node-build/client}/static/media/open-sans-latin-800-normal.185f6b03.woff2 +0 -0
  201. /package/{client → node-build/client}/static/media/open-sans-latin-ext-400-normal.ccfa20f8.woff2 +0 -0
  202. /package/{client → node-build/client}/static/media/open-sans-latin-ext-700-normal.64471a17.woff2 +0 -0
  203. /package/{client → node-build/client}/static/media/open-sans-latin-ext-800-normal.988eae1a.woff2 +0 -0
  204. /package/{client → node-build/client}/static/media/open-sans-vietnamese-400-normal.473f6b09.woff2 +0 -0
  205. /package/{client → node-build/client}/static/media/open-sans-vietnamese-700-normal.b4c5968d.woff2 +0 -0
  206. /package/{client → node-build/client}/static/media/open-sans-vietnamese-800-normal.27b69d87.woff2 +0 -0
  207. /package/{client → node-build/client}/static/media/search-solid.cc51b702.svg +0 -0
  208. /package/{client → node-build/client}/tiro-local.crt +0 -0
  209. /package/{server → node-build/server}/ssl/tiro-local.crt +0 -0
  210. /package/{server → node-build/server}/ssl/tiro-local.key +0 -0
  211. /package/{server → node-build/server}/tiro-server.js.LICENSE.txt +0 -0
  212. /package/{shared.helpers.build.js → node-build/shared.helpers.build.js} +0 -0
  213. /package/{v6 copy.ino → node-build/v6 copy.ino} +0 -0
  214. /package/{v6.ino → node-build/v6.ino} +0 -0
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env node
2
+
3
+ // const isDev = false
4
+ const isDev = process.env.ISDEV
5
+ const tHelpers = isDev ? require('../shared.helpers.js') : require(`./shared.helpers.build.js`);
6
+ const pathServerJs = isDev ? `${__dirname}/node-build/server/tiro-server.js` : `${__dirname}/server/tiro-server.js`
7
+
8
+
9
+ // CLI HELP MANUAL
10
+ const outputHelp = () => {
11
+ var p = require('./package.json');
12
+ const tiroHelpString = `
13
+ VERSION:
14
+ ===
15
+ ${p.name.toUpperCase()} v.${p.version} ${isDev ? '(**dev**)' : ''}
16
+
17
+ DESCRIPTION:
18
+ ===
19
+ ${p.description}
20
+
21
+ ====
22
+
23
+ --https/-s : enable https ssl with self signed certificate (boolean, false by default)
24
+ --port/-p : port to use (number, 3023 by default)
25
+ --no-open/-no : do not open Tiro in browser when starting
26
+ --verbose/-v : control logs verbosity [0/1/2/3] (0:none, 1: critical, 2: all, 3: performance monitoring)
27
+
28
+ --tunnel/-t : [require autossh to be installed first!] uses autossh to "publish" the app on the web, requires a server you can access with ssh and autossh installed on that device. (ex:npx tiro-notes@latest -t REMOTE_USER@REMOTE_URL:REMOTE_PORT)
29
+ --tunnel-timeout/-tt : [require autossh to be installed first!] autokill tunnel after x hours (default: -1)
30
+
31
+ --backup/-b : [t/n/now/force/f] [require tar to be installed first!] will incrementally backup changes in archives like tiro.0.xz.tar, tiro.1.xz.tar... every day in a specific folder.
32
+ You can then execute commands after that process in a post backup script (useful for syncing these archives to clouds, think rsync, rclone etc.)
33
+ All folders will be backed up with the exception of folders ending by _NOBAK_ (ex: "my_folder_NOBAK_").
34
+
35
+ --backup-folder : modify backup folder destination. (default: "your/path/to/tiro/data_folder"+_backup
36
+ --backup-post-script : modify script to be executed after a backup finishes. Should be a ".txt" file with your OS commands. (default: "your/path/to/tiro/data_folder"+_backup/post_backup_script.txt
37
+
38
+ --help/-h : help
39
+
40
+ EXAMPLES:
41
+ ====
42
+ - npx tiro-notes
43
+ - npx tiro-notes --tunnel ubuntu@myserver.com:3023 --port 3033 --https true
44
+ - npx tiro-notes -t ubuntu@myserver.com:3023 -p 3033 -s true
45
+ `;
46
+ console.log(tiroHelpString);
47
+
48
+ }
49
+
50
+ // open frontend on default browser
51
+ const openInBrowser = (url) => {
52
+ var start = (process.platform == 'darwin'? 'open': process.platform == 'win32'? 'start': 'xdg-open');
53
+ require('child_process').exec(start + ' ' + url);
54
+ }
55
+
56
+
57
+ function getCliArgs () {
58
+ var args = process.argv;
59
+ var argsObj = {
60
+ port: 3023,
61
+ https: false,
62
+ help: false,
63
+ open: true,
64
+ verbose: false,
65
+ backup: {
66
+ enabled: false,
67
+ now: false,
68
+ location: "default",
69
+ scriptLocation: "default"
70
+ },
71
+ tunnel: {
72
+ enabled: false,
73
+ timeout: -1,
74
+ },
75
+ }
76
+ for (var i = 0; i < args.length; i++) {
77
+ if (i % 2 !== 0) continue
78
+ var argName = args[i];
79
+ var argVal = args[i+1];
80
+ argName = argName.replace('--', '').replace('-','')
81
+ if (argName === 'p' || argName === 'port') argsObj.port = parseInt(argVal);
82
+ if (argName === 's' || argName === 'https') argsObj.https = true
83
+ if (argName === 'h' || argName === 'help') argsObj.help = true
84
+ if (argName === 'no-open' || argName === 'no') argsObj.open = false
85
+ if (argName === 'v' || argName === 'verbose') argsObj.verbose = parseInt(argVal)
86
+
87
+ if (argName === 'b' || argName === 'backup') argsObj.backup.enabled = true
88
+ if (argName === 'b' || argName === 'backup') argsObj.backup.now = (argVal === "now" || argVal === "n" || argVal === "force" || argVal === "f") ? true : false
89
+ if (argName === 'backup-location') argsObj.backup.location = argVal
90
+ if (argName === 'backup-post-script') argsObj.backup.scriptLocation = argVal
91
+
92
+ if (argName === 'tt' || argName === 'tunnel-timeout') argsObj.tunnel.timeout = parseInt(argVal)
93
+ if (argName === 't' || argName === 'tunnel') {
94
+ const argsArr = argVal.split(':')
95
+ if (argsArr.length > 1) {
96
+ argsObj.tunnel.enabled = true
97
+ argsObj.tunnel.remoteUrl = argsArr[0]
98
+ argsObj.tunnel.remotePort = parseInt(argsArr[1])
99
+ }
100
+ }
101
+ }
102
+ return argsObj;
103
+ }
104
+
105
+ function startTiroServer (argsObj, cb) {
106
+ console.log(`Starting Tiro-Notes from CLI with following arguments : ${JSON.stringify(argsObj)}`);
107
+
108
+ // kill all possible remaining servers of tiro
109
+ tHelpers.killPreviousInstances(() => {
110
+
111
+ // start tiro server, detect success message and get server params
112
+ tHelpers.execCmd('node', [pathServerJs], {
113
+ logLevel: argsObj.verbose,
114
+ env: {
115
+ TIRO_PORT: argsObj.port,
116
+ TIRO_HTTPS: argsObj.https,
117
+ TIRO_PERFORMANCE_MONITORING_BACKEND: argsObj.verbose === 3
118
+ },
119
+ logName: 'tiroServer',
120
+ onLog: str => {
121
+ // we get params like dataFolder from server.js directly
122
+ tHelpers.checkAndGetTiroConfig(str, {platform: 'cli', cb})
123
+ }
124
+ })
125
+ });
126
+ }
127
+
128
+ const startBackupScript = async (argsObj, dataFolder) => {
129
+ if (!argsObj.backup.enabled) return;
130
+ if (!dataFolder) return console.warn ("[BACKUP] no dataFolder detected!");
131
+
132
+ // get BACKUP_FOLDER path
133
+ const defaultBackupFolder = dataFolder + "_backup/"
134
+ const backupFolder = argsObj.backup.location !== "default" ? argsObj.backup.location : defaultBackupFolder
135
+ // if does not exists, create it
136
+ if (!tHelpers.fileExists(backupFolder)) await tHelpers.createDir(backupFolder)
137
+
138
+
139
+ // get POST_BACKUP_SCRIPT
140
+ const defaultPostBackupScript = backupFolder + "post_backup_script.txt"
141
+ const postBackupScriptFile = argsObj.backup.scriptLocation !== "default" ? argsObj.backup.scriptLocation : defaultPostBackupScript
142
+ // if does not exists, create it, empty
143
+ if (!tHelpers.fileExists(postBackupScriptFile)) await tHelpers.saveFile(postBackupScriptFile, "")
144
+ let postBackupScript = await tHelpers.openFile(postBackupScriptFile)
145
+ if (postBackupScript) postBackupScript += ";"
146
+
147
+
148
+ // get LAST_BACKUP_TIMESTAMP
149
+ const timestampFile = backupFolder + "last_backup_timestamp.txt"
150
+ const now = () => new Date().getTime()
151
+ // if does not exists, create it, then give a timestamp of 0
152
+ if (!tHelpers.fileExists(timestampFile)) await tHelpers.saveFile(timestampFile, "0")
153
+ const getLastTimestamp = async () => {
154
+ let lastBackupTimestampRaw = await tHelpers.openFile(timestampFile);
155
+ let lastBackupTimestamp = parseInt(lastBackupTimestampRaw)
156
+ return lastBackupTimestamp
157
+ }
158
+ let replaceTimestampCli = () => `echo ${now()} > '${timestampFile}'`
159
+
160
+ // START INTERVAL
161
+ // const timeInterval = 1000 * 60 * 60 // one hour
162
+ const timeInterval = 1000 * 60 * 10 // one hour
163
+ const backupInterval = 1000 * 60 * 60 * 24 // one day
164
+
165
+ const tarExec = process.platform === "darwin" ? "gtar" : "tar"
166
+
167
+
168
+ console.log ("[BACKUP] starting backup logic!");
169
+
170
+ let debugBackupNow = isDev ? false : false
171
+ if (argsObj.backup.now) debugBackupNow = true
172
+ const processBackupEveryDay = async () => {
173
+ // if > 1 day
174
+ const lastTimestamp = await getLastTimestamp()
175
+ const diff = backupInterval + lastTimestamp - new Date().getTime()
176
+ const diffMin = Math.round(diff / (1000 * 60))
177
+ // are we between 1am-5am ?
178
+ const isBetween1am5am = new Date().getHours() >= 1 && new Date().getHours() <= 5
179
+ if ((diff < 0 && isBetween1am5am) || debugBackupNow) {
180
+ debugBackupNow = false
181
+ console.log(`[BACKUP] time has come, BACKUP! (debugBackupNow:${debugBackupNow}) ==> LOGS in log_backup.txt`);
182
+
183
+ // automatically generate a cli.sh from command below and post backup script, then exec it
184
+ let backupCli = `
185
+ ${replaceTimestampCli()};
186
+ mkdir '${backupFolder}';
187
+ mkdir '${backupFolder}/backups';
188
+ cd '${backupFolder}';
189
+ echo '====== [${new Date().toLocaleString()}] -> new backup started' >> log_backups.txt;
190
+ ${tarExec} --xz --verbose --create --file="backups/tiro.$(ls backups/ | wc -l | sed 's/^ *//;s/ *$//').tar.xz" '${dataFolder}' --listed-incremental='${backupFolder}metadata.snar' --exclude=\'*_NOBAK_';
191
+ echo ' [${new Date().toLocaleString()}] -> compression archive finished' >> log_backups.txt; ${postBackupScript};
192
+ echo ' [${new Date().toLocaleString()}] -> upload finished' >> log_backups.txt;`
193
+ // append to backup CLI current timestamp to last_backup_timestamp
194
+ // remove \n from backupCli
195
+ backupCli = backupCli.replace(/\n/g, ' ')
196
+ // replace all ;; by ;
197
+ backupCli = backupCli.replace(/;;/g, ';')
198
+
199
+ // execute cli
200
+ tHelpers.execCmdInFile(backupCli, backupFolder+"cli.sh", {
201
+ logLevel: argsObj.verbose
202
+ // logLevel: 2 // log level always 2 for backup to see whats happening
203
+ })
204
+
205
+ const debugObj = {backupFolder, postBackupScriptFile, lastTimestamp, postBackupScript, timeInterval, backupCli}
206
+
207
+ console.log (debugObj);
208
+ } else {
209
+ const logTime = new Date().toLocaleString()
210
+ console.log(`[BACKUP] ${logTime} => not yet. Waiting for ${diffMin} mins < 0 AND between 1am-5am ${JSON.stringify({isBetween1am5am, currHour: new Date().getHours()})}}`);
211
+ }
212
+ }
213
+
214
+ // every hour
215
+ processBackupEveryDay();
216
+ let int = setInterval(() => {
217
+ processBackupEveryDay()
218
+ }, timeInterval)
219
+
220
+ }
221
+
222
+ const startSshTunnel = (argsObj) => {
223
+ if (argsObj.tunnel.enabled) {
224
+ // kill previous autossh processes
225
+ let cb2 = true
226
+ let cb1 = true
227
+ tHelpers.execCmd('killall', [`autossh`], {
228
+ logName:'tunnel 1/3',
229
+ onLog: () => {
230
+ if (!cb2) return
231
+ cb2 = false
232
+ // check if autossh is working
233
+ tHelpers.execCmd('autossh', [`-V`], {
234
+ logName:'tunnel 2/3',
235
+ onLog: str => {
236
+ if (!cb1) return
237
+ cb1 = false
238
+ // start autossh finally
239
+ tHelpers.execCmd('autossh',['-M',`2${argsObj.tunnel.remotePort}`,'-N', argsObj.tunnel.remoteUrl,'-R', `${argsObj.tunnel.remotePort}:localhost:${argsObj.port}`,'-C'], {
240
+ logName:'tunnel 3/3'
241
+ })
242
+
243
+ // if tunnel.timeout != 1
244
+ if (argsObj.tunnel.timeout != 1) {
245
+ console.log(`Tunnel timeout set to ${argsObj.tunnel.timeout}h.`)
246
+ setTimeout(() => {
247
+ console.log(`Tunnel timeout reached (${argsObj.tunnel.timeout}h). Closing tunnel.`, str)
248
+ tHelpers.execCmd('killall', [`autossh`], {
249
+ logName:'tunnel 4/3',
250
+ onLog: str => {
251
+ console.log(`Tunnel timeout reached (${argsObj.tunnel.timeout}h). Closing tunnel.`, str)
252
+ }
253
+ })
254
+ }, argsObj.tunnel.timeout * 1000 * 60 * 60)
255
+ let countHours = 0
256
+ setTimeout(() => {
257
+ countHours++
258
+ console.log(`Tunnel timeout in ${argsObj.tunnel.timeout - countHours}h`)
259
+ }, argsObj.tunnel.timeout * 1000 * 60 )
260
+ }
261
+ }
262
+ })
263
+ }
264
+ })
265
+ }
266
+ }
267
+
268
+ // Main script
269
+ function main () {
270
+
271
+ var argsObj = getCliArgs();
272
+
273
+ if (argsObj.help) {
274
+
275
+ outputHelp();
276
+
277
+ } else {
278
+
279
+ startTiroServer(argsObj, (configServerObj) => {
280
+
281
+ const c = configServerObj
282
+ const protocol = c.https ? 'https' : 'http'
283
+ const port = c.port
284
+ const dataFolder = c.dataFolder
285
+
286
+ // open in browser
287
+ if (argsObj.open) openInBrowser(`${protocol}://localhost:${port}`);
288
+
289
+ // start tunnel with autossh if asked
290
+ startSshTunnel(argsObj);
291
+
292
+ // start backup script
293
+ startBackupScript(argsObj, dataFolder);
294
+
295
+ })
296
+ }
297
+ }
298
+
299
+ const test = () => {
300
+ var argsObj = getCliArgs();
301
+ // startBackupScript(argsObj, "/Users/gregoirethiebault/Desktop/your markdown notes")
302
+ startBackupScript(argsObj, "/Users/gregoirethiebault/Desktop/nodal_ex")
303
+ }
304
+
305
+
306
+ // start everything
307
+ // isDev ? test() : main();
308
+ isDev ? main() : main();
309
+
@@ -10,7 +10,7 @@
10
10
  "static/js/7.5575eef7.chunk.js": "/static/js/7.5575eef7.chunk.js",
11
11
  "static/js/8.977d1a5d.chunk.js": "/static/js/8.977d1a5d.chunk.js",
12
12
  "static/js/9.3b7d0e8d.chunk.js": "/static/js/9.3b7d0e8d.chunk.js",
13
- "main.js": "/static/js/main.27398ae3.chunk.js",
13
+ "main.js": "/static/js/main.1a719093.chunk.js",
14
14
  "runtime-main.js": "/static/js/runtime-main.bbeed8c8.js",
15
15
  "static/css/12.394917b1.chunk.css": "/static/css/12.394917b1.chunk.css",
16
16
  "static/js/12.6d6dc9bb.chunk.js": "/static/js/12.6d6dc9bb.chunk.js",
@@ -138,6 +138,6 @@
138
138
  "static/js/runtime-main.bbeed8c8.js",
139
139
  "static/css/12.394917b1.chunk.css",
140
140
  "static/js/12.6d6dc9bb.chunk.js",
141
- "static/js/main.27398ae3.chunk.js"
141
+ "static/js/main.1a719093.chunk.js"
142
142
  ]
143
143
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><meta name="theme-color" content="#000000"/><title>Tiro</title><link href="/static/css/12.394917b1.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var c,f,d=t[0],o=t[1],b=t[2],i=0,l=[];i<d.length;i++)f=d[i],Object.prototype.hasOwnProperty.call(a,f)&&a[f]&&l.push(a[f][0]),a[f]=0;for(c in o)Object.prototype.hasOwnProperty.call(o,c)&&(e[c]=o[c]);for(u&&u(t);l.length;)l.shift()();return n.push.apply(n,b||[]),r()}function r(){for(var e,t=0;t<n.length;t++){for(var r=n[t],c=!0,d=1;d<r.length;d++){var o=r[d];0!==a[o]&&(c=!1)}c&&(n.splice(t--,1),e=f(f.s=r[0]))}return e}var c={},a={11:0},n=[];function f(t){if(c[t])return c[t].exports;var r=c[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.e=function(e){var t=[],r=a[e];if(0!==r)if(r)t.push(r[2]);else{var c=new Promise((function(t,c){r=a[e]=[t,c]}));t.push(r[2]=c);var n,d=document.createElement("script");d.charset="utf-8",d.timeout=120,f.nc&&d.setAttribute("nonce",f.nc),d.src=function(e){return f.p+"static/js/"+({}[e]||e)+"."+{0:"b890b1cb",1:"24c0d2eb",2:"b4b18203",3:"303b3d58",4:"5e26b40b",5:"f7811373",6:"b8cf2c81",7:"5575eef7",8:"977d1a5d",9:"3b7d0e8d",13:"9e34d8ba",14:"a886302f",15:"01bf8225",16:"67051f41",17:"82cdd47c",18:"ddb404ef",19:"7dd55448",20:"59f5165d",21:"79c4b0e8",22:"007e32b0",23:"f61a9d2c",24:"e0d7947e",25:"e8450ff4",26:"ea917da6",27:"40c86fd7",28:"36540711",29:"90bee6cc",30:"41fd826a",31:"ceec3129",32:"f164128c",33:"0aa32cf1",34:"a7b2b96c",35:"d6fc00c0",36:"2c384957",37:"a4733489",38:"151ab2a6",39:"79ebafd7",40:"f3d995a0",41:"e90a9137",42:"bd656ca1",43:"8074805b",44:"8da981a2",45:"1a2b3b01",46:"2e55aca9",47:"57672172",48:"3bfd34d7",49:"c657ccf4",50:"36421e1d",51:"cd3bd891",52:"ddd90678",53:"8933ff1d",54:"1d25d19c",55:"f0195607",56:"931338e0",57:"8304da63",58:"3dbe9d9e",59:"d8dd3c13",60:"e8ba53a7",61:"41f7057e",62:"8312dcd3",63:"ceff6f5a",64:"2b51a3a2",65:"5b662f09",66:"aed0e545",67:"c68e472b",68:"482d5776",69:"adf6efab",70:"54d4c087",71:"e02a4ef4",72:"cdabbbd2",73:"b58eb627",74:"a7b0defd",75:"7ee75f2a",76:"88cf92c8",77:"64a32f3b",78:"e19d46e1",79:"2daf87c6",80:"2591cada",81:"4a8cdda6",82:"285db5b4",83:"c3ae3b75",84:"0316e16e",85:"da21c20c",86:"54af0d45",87:"c3e1d4bb",88:"6f1f304d",89:"9bf1904b",90:"f4f97bc7",91:"06e2ef0f",92:"05d93a9c",93:"84099dca",94:"c20443c3",95:"eef2f092",96:"1f09d3f2",97:"e7cce996",98:"ed47f20f",99:"038f33b0",100:"4020f20c",101:"21c27e18",102:"e3f94c8e",103:"18e92661",104:"cd956379",105:"1e2e5889",106:"5c24ba4b",107:"80b988bf",108:"fff04134",109:"ec78f8d9",110:"44788eb1"}[e]+".chunk.js"}(e);var o=new Error;n=function(t){d.onerror=d.onload=null,clearTimeout(b);var r=a[e];if(0!==r){if(r){var c=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+c+": "+n+")",o.name="ChunkLoadError",o.type=c,o.request=n,r[1](o)}a[e]=void 0}};var b=setTimeout((function(){n({type:"timeout",target:d})}),12e4);d.onerror=d.onload=n,document.head.appendChild(d)}return Promise.all(t)},f.m=e,f.c=c,f.d=function(e,t,r){f.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,t){if(1&t&&(e=f(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(f.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var c in e)f.d(r,c,function(t){return e[t]}.bind(null,c));return r},f.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(t,"a",t),t},f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f.p="/",f.oe=function(e){throw console.error(e),e};var d=this["webpackJsonptiro-notes-client"]=this["webpackJsonptiro-notes-client"]||[],o=d.push.bind(d);d.push=t,d=d.slice();for(var b=0;b<d.length;b++)t(d[b]);var u=o;r()}([])</script><script src="/static/js/12.6d6dc9bb.chunk.js"></script><script src="/static/js/main.27398ae3.chunk.js"></script></body><style>html{position:fixed}body>iframe{display:none!important}</style><script>setTimeout(()=>{console.info("[DEV NOTICE] Live Reload Has Been Disabled"),window.webpackHotUpdate=()=>{}},1e3);{var WS=window.WebSocket;function DevWebSocket(e){return"ws://localhost:3000/sockjs-node"===e?(console.info("[DEV NOTICE] Live Reload Has Been Disabled"),{}):new WS(e)}window.WebSocket=DevWebSocket}</script></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><meta name="theme-color" content="#000000"/><title>Tiro</title><link href="/static/css/12.394917b1.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var c,f,d=t[0],o=t[1],b=t[2],i=0,l=[];i<d.length;i++)f=d[i],Object.prototype.hasOwnProperty.call(a,f)&&a[f]&&l.push(a[f][0]),a[f]=0;for(c in o)Object.prototype.hasOwnProperty.call(o,c)&&(e[c]=o[c]);for(u&&u(t);l.length;)l.shift()();return n.push.apply(n,b||[]),r()}function r(){for(var e,t=0;t<n.length;t++){for(var r=n[t],c=!0,d=1;d<r.length;d++){var o=r[d];0!==a[o]&&(c=!1)}c&&(n.splice(t--,1),e=f(f.s=r[0]))}return e}var c={},a={11:0},n=[];function f(t){if(c[t])return c[t].exports;var r=c[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.e=function(e){var t=[],r=a[e];if(0!==r)if(r)t.push(r[2]);else{var c=new Promise((function(t,c){r=a[e]=[t,c]}));t.push(r[2]=c);var n,d=document.createElement("script");d.charset="utf-8",d.timeout=120,f.nc&&d.setAttribute("nonce",f.nc),d.src=function(e){return f.p+"static/js/"+({}[e]||e)+"."+{0:"b890b1cb",1:"24c0d2eb",2:"b4b18203",3:"303b3d58",4:"5e26b40b",5:"f7811373",6:"b8cf2c81",7:"5575eef7",8:"977d1a5d",9:"3b7d0e8d",13:"9e34d8ba",14:"a886302f",15:"01bf8225",16:"67051f41",17:"82cdd47c",18:"ddb404ef",19:"7dd55448",20:"59f5165d",21:"79c4b0e8",22:"007e32b0",23:"f61a9d2c",24:"e0d7947e",25:"e8450ff4",26:"ea917da6",27:"40c86fd7",28:"36540711",29:"90bee6cc",30:"41fd826a",31:"ceec3129",32:"f164128c",33:"0aa32cf1",34:"a7b2b96c",35:"d6fc00c0",36:"2c384957",37:"a4733489",38:"151ab2a6",39:"79ebafd7",40:"f3d995a0",41:"e90a9137",42:"bd656ca1",43:"8074805b",44:"8da981a2",45:"1a2b3b01",46:"2e55aca9",47:"57672172",48:"3bfd34d7",49:"c657ccf4",50:"36421e1d",51:"cd3bd891",52:"ddd90678",53:"8933ff1d",54:"1d25d19c",55:"f0195607",56:"931338e0",57:"8304da63",58:"3dbe9d9e",59:"d8dd3c13",60:"e8ba53a7",61:"41f7057e",62:"8312dcd3",63:"ceff6f5a",64:"2b51a3a2",65:"5b662f09",66:"aed0e545",67:"c68e472b",68:"482d5776",69:"adf6efab",70:"54d4c087",71:"e02a4ef4",72:"cdabbbd2",73:"b58eb627",74:"a7b0defd",75:"7ee75f2a",76:"88cf92c8",77:"64a32f3b",78:"e19d46e1",79:"2daf87c6",80:"2591cada",81:"4a8cdda6",82:"285db5b4",83:"c3ae3b75",84:"0316e16e",85:"da21c20c",86:"54af0d45",87:"c3e1d4bb",88:"6f1f304d",89:"9bf1904b",90:"f4f97bc7",91:"06e2ef0f",92:"05d93a9c",93:"84099dca",94:"c20443c3",95:"eef2f092",96:"1f09d3f2",97:"e7cce996",98:"ed47f20f",99:"038f33b0",100:"4020f20c",101:"21c27e18",102:"e3f94c8e",103:"18e92661",104:"cd956379",105:"1e2e5889",106:"5c24ba4b",107:"80b988bf",108:"fff04134",109:"ec78f8d9",110:"44788eb1"}[e]+".chunk.js"}(e);var o=new Error;n=function(t){d.onerror=d.onload=null,clearTimeout(b);var r=a[e];if(0!==r){if(r){var c=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+c+": "+n+")",o.name="ChunkLoadError",o.type=c,o.request=n,r[1](o)}a[e]=void 0}};var b=setTimeout((function(){n({type:"timeout",target:d})}),12e4);d.onerror=d.onload=n,document.head.appendChild(d)}return Promise.all(t)},f.m=e,f.c=c,f.d=function(e,t,r){f.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,t){if(1&t&&(e=f(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(f.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var c in e)f.d(r,c,function(t){return e[t]}.bind(null,c));return r},f.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(t,"a",t),t},f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f.p="/",f.oe=function(e){throw console.error(e),e};var d=this["webpackJsonptiro-notes-client"]=this["webpackJsonptiro-notes-client"]||[],o=d.push.bind(d);d.push=t,d=d.slice();for(var b=0;b<d.length;b++)t(d[b]);var u=o;r()}([])</script><script src="/static/js/12.6d6dc9bb.chunk.js"></script><script src="/static/js/main.1a719093.chunk.js"></script></body><style>html{position:fixed}body>iframe{display:none!important}</style><script>setTimeout(()=>{console.info("[DEV NOTICE] Live Reload Has Been Disabled"),window.webpackHotUpdate=()=>{}},1e3);{var WS=window.WebSocket;function DevWebSocket(e){return"ws://localhost:3000/sockjs-node"===e?(console.info("[DEV NOTICE] Live Reload Has Been Disabled"),{}):new WS(e)}window.WebSocket=DevWebSocket}</script></html>