index.html 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  6. <meta name="apple-mobile-web-app-capable" content="yes" />
  7. <link rel="stylesheet" href="/bootstrap.css">
  8. <link rel="stylesheet" href="res/test/bootstrap.min.css"> <!-- TODO delete -->
  9. <link rel="stylesheet" href="/style.css">
  10. <script src="/jquery.js"></script>
  11. <script src="/popper.js"></script>
  12. <script src="/bootstrap.js"></script>
  13. <script src="res/test/jquery.min.js"></script> <!-- TODO delete -->
  14. <script src="res/test/popper.min.js"></script> <!-- TODO delete -->
  15. <script src="res/test/bootstrap.min.js"></script> <!-- TODO delete -->
  16. <script src="/code.js"></script>
  17. <title>esp32-wifi-manager</title>
  18. </head>
  19. <body>
  20. <div id="info">
  21. <svg xmlns="http://www.w3.org/2000/svg" id="jack" width="24" height="24" viewBox="0 0 24 24">
  22. <g id="o_jack" display="none">
  23. <path d="m 16.074253,15.636738 v -1.05413 h 5.893274 c 1.16249,0 2.108261,-0.855111 2.108261,-1.906183 0,-1.051073 -0.945771,-1.906236 -2.108261,-1.906236 H 16.074253 V 9.7160604 c 0,-0.5812492 -0.472879,-1.0541321 -1.054131,-1.0541321 H 6.7847349 c -1.256731,0 -2.301908,0.9212057 -2.496867,2.1237027 h -0.451896 c -0.540407,0 -1.001317,0.349129 -1.173459,0.835611 H 0.47312787 c -0.23285,0 -0.42164599,0.188794 -0.42164599,0.421651 v 1.251779 c 0,0.232857 0.18879599,0.421652 0.42164599,0.421652 H 2.6550809 c 0.165919,0.497866 0.632365,0.857588 1.180831,0.857588 h 0.45312 c 0.19781,1.199177 1.241345,2.116956 2.495659,2.116956 h 8.2353861 c 0.581297,0 1.054176,-0.472883 1.054176,-1.05413 z m 5.060935,-4.023245 v 2.125811 h -0.844935 v -2.125811 z m 2.097293,1.062932 c 0,0.582933 -0.561524,1.057661 -1.253986,1.062668 v -2.125337 c 0.692462,0.0049 1.253986,0.47963 1.253986,1.062669 z m -3.785535,-1.062932 v 2.125811 h -3.372693 v -2.125811 z m -18.55215712,0.851 H 2.5901939 v 0.408475 H 0.89478888 Z m 2.94118302,1.266114 c -0.221897,0 -0.40247,-0.185737 -0.40247,-0.414062 v -1.273547 c 0,-0.228271 0.180573,-0.41401 0.40247,-0.41401 h 0.418855 v 2.101671 h -0.418855 z m 2.948763,2.116956 c -0.929997,0 -1.6866,-0.756601 -1.6866,-1.686608 v -0.0087 -2.944976 -0.01545 c 0,-0.930006 0.756603,-1.6866072 1.6866,-1.6866072 h 8.2353871 c 0.114313,0 0.210838,0.096554 0.210838,0.2108266 v 5.9206786 c 0,0.114268 -0.09656,0.210824 -0.210838,0.210824 z" />
  24. </g>
  25. </svg>
  26. <svg xmlns="http://www.w3.org/2000/svg" id="output" width="24" height="24" viewBox="0 0 24 24">
  27. <g id="o_i2s" display="none">
  28. <path d="M2 7L2 8L2 9L2 10L2 11L2 12L2 13L2 14L2 15L2 16L2 17L3 17L3 16L3 15L3 14L3 13L3 12L3 11L3 10L3 9L3 8L2 7M6 7L6 8L6 9L7 9L7 8L8 8L9 8L10 8L10 9L11 9L11 10L11 11L10 11L10 12L9 12L9 13L8 13L8 14L7 14L7 15L6 15L6 16L6 17L7 17L8 17L9 17L10 17L11 17L12 17L12 16L11 16L10 16L9 16L8 16L8 15L9 15L9 14L10 14L10 13L11 13L11 12L12 12L12 11L12 10L12 9L12 8L11 8L11 7L10 7L9 7L8 7L6 7M16 7L16 8L15 8L15 9L15 10L15 11L16 11L16 12L17 12L18 12L18 13L19 13L20 13L21 13L21 14L21 15L20 15L20 16L19 16L18 16L17 16L16 16L16 15L15 15L15 16L15 17L16 17L17 17L18 17L19 17L20 17L21 17L21 16L22 16L22 15L22 14L22 13L21 13L21 12L20 12L20 11L19 11L18 11L17 11L16 11L16 10L16 9L17 9L17 8L18 8L19 8L20 8L21 8L21 9L22 9L22 8L22 7L21 7L20 7L19 7L18 7L16 7z"/>
  29. </g>
  30. <g id="o_bt" display="none">
  31. <path d="M3 7L3 8L3 9L3 10L3 11L3 12L3 13L3 14L3 15L3 16L3 17L4 17L5 17L6 17L7 17L8 17L9 17L9 16L10 16L10 15L10 14L10 13L10 12L9 12L9 11L10 11L10 10L10 9L10 8L9 8L9 7L8 7L7 7L6 7L5 7L3 7M12 7L12 8L13 8L14 8L15 8L16 8L16 9L16 10L16 11L16 12L16 13L16 14L16 15L16 16L16 17L17 17L17 16L17 15L17 14L17 13L17 12L17 11L17 10L17 9L17 8L18 8L19 8L20 8L21 8L21 7L20 7L19 7L18 7L17 7L16 7L15 7L14 7L12 7z"/>
  32. <path style="fill:#272B30;" d="M4 8L4 9L4 10L4 11L5 11L6 11L7 11L8 11L8 10L9 10L9 9L9 8L8 8L7 8L6 8L4 8M4 12L4 13L4 14L4 15L4 16L5 16L6 16L7 16L8 16L8 15L9 15L9 14L9 13L8 13L8 12L7 12L6 12L4 12z"/>
  33. </g>
  34. <g id="o_spdif" display="none">
  35. <path d="M3 1L3 2L2 2L2 3L2 4L2 5L3 5L3 6L4 6L5 6L5 7L6 7L7 7L8 7L8 8L8 9L7 9L7 10L6 10L5 10L4 10L3 10L3 9L2 9L2 10L2 11L3 11L4 11L5 11L6 11L7 11L8 11L8 10L9 10L9 9L9 8L9 7L8 7L8 6L7 6L7 5L6 5L5 5L4 5L3 5L3 4L3 3L4 3L4 2L5 2L6 2L7 2L8 2L8 3L9 3L9 2L9 1L8 1L7 1L6 1L5 1L3 1M13 1L13 2L13 3L13 4L12 4L12 5L12 6L12 7L12 8L11 8L11 9L11 10L11 11L10 11L10 12L10 13L11 13L11 12L11 11L12 11L12 10L12 9L12 8L13 8L13 7L13 6L13 5L14 5L14 4L14 3L14 2L15 2L15 1L13 1M16 1L16 2L16 3L16 4L16 5L16 6L16 7L16 8L16 9L16 10L16 11L17 11L17 10L17 9L17 8L17 7L18 7L19 7L20 7L21 7L21 6L22 6L22 5L22 4L22 3L22 2L21 2L21 1L20 1L19 1L18 1L16 1z"/>
  36. <path style="fill:#272B30;" d="M17 2L17 3L17 4L17 5L17 6L18 6L19 6L20 6L20 5L21 5L21 4L21 3L20 3L20 2L19 2L17 2z"/>
  37. <path d="M2 13L2 14L2 15L2 16L2 17L2 18L2 19L2 20L2 21L2 22L2 23L3 23L4 23L5 23L6 23L7 23L8 23L8 22L9 22L9 21L10 21L10 20L10 19L10 18L10 17L10 16L10 15L9 15L9 14L8 14L7 14L7 13L6 13L5 13L4 13L2 13M13 13L13 14L13 15L13 16L13 17L13 18L13 19L13 20L13 21L13 22L13 23L14 23L14 22L14 21L14 20L14 19L14 18L14 17L14 16L14 15L14 14L13 13M17 13L17 14L17 15L17 16L17 17L17 18L17 19L17 20L17 21L17 22L17 23L18 23L18 22L18 21L18 20L18 19L18 18L19 18L20 18L21 18L22 18L22 17L21 17L20 17L19 17L18 17L18 16L18 15L18 14L19 14L20 14L21 14L22 14L22 13L21 13L20 13L19 13L17 13z"/>
  38. <path style="fill:#272B30;" d="M3 14L3 15L3 16L3 17L3 18L3 19L3 20L3 21L3 22L4 22L5 22L6 22L7 22L7 21L8 21L8 20L9 20L9 19L9 18L9 17L9 16L8 16L8 15L7 15L7 14L6 14L5 14L3 14z"/>
  39. </g>
  40. </svg>
  41. <svg xmlns="http://www.w3.org/2000/svg" id="battery" width="24" height="24" viewBox="0 0 24 24">
  42. <g id="bat0" display="none">
  43. <path d="M19 8v8h-17v-8h17zm2-2h-21v12h21v-12zm1 9h.75c.69 0 1.25-.56 1.25-1.25v-3.5c0-.69-.56-1.25-1.25-1.25h-.75v6z"/>
  44. </g>
  45. <g id="bat1" display="none">
  46. <path d="M19 8v8h-17v-8h17zm2-2h-21v12h21v-12zm1 9h.75c.69 0 1.25-.56 1.25-1.25v-3.5c0-.69-.56-1.25-1.25-1.25h-.75v6zm-16-6h-3v6h3v-6z"/>
  47. </g>
  48. <g id="bat2" display="none">
  49. <path d="M19 8v8h-17v-8h17zm2-2h-21v12h21v-12zm1 9h.75c.69 0 1.25-.56 1.25-1.25v-3.5c0-.69-.56-1.25-1.25-1.25h-.75v6zm-16-6h-3v6h3v-6zm4 0h-3v6h3v-6z"/>
  50. </g>
  51. <g id="bat3" display="none">
  52. <path d="M19 8v8h-17v-8h17zm2-2h-21v12h21v-12zm1 9h.75c.69 0 1.25-.56 1.25-1.25v-3.5c0-.69-.56-1.25-1.25-1.25h-.75v6zm-16-6h-3v6h3v-6zm4 0h-3v6h3v-6zm4 0h-3v6h3v-6z"/>
  53. </g>
  54. <g id="bat4" display="none">
  55. <path d="M19 8v8h-17v-8h17zm2-2h-21v12h21v-12zm1 9h.75c.69 0 1.25-.56 1.25-1.25v-3.5c0-.69-.56-1.25-1.25-1.25h-.75v6zm-16-6h-3v6h3v-6zm4 0h-3v6h3v-6zm4 0h-3v6h3v-6zm4 0h-3v6h3v-6z"/>
  56. </g>
  57. </svg>
  58. </div>
  59. <ul id="navbar" class="nav nav-tabs">
  60. <li class="nav-item">
  61. <a class="nav-link active" data-toggle="tab" href="#tab-wifi">WiFi</a>
  62. </li>
  63. <li class="nav-item">
  64. <a class="nav-link" data-toggle="tab" href="#tab-audio">Audio + LMS</a>
  65. </li>
  66. <li class="nav-item">
  67. <a class="nav-link" data-toggle="tab" href="#tab-firmware">Firmware</a>
  68. </li>
  69. <li class="nav-item">
  70. <a class="nav-link" data-toggle="tab" href="#tab-gpio">GPIO</a>
  71. </li>
  72. <li class="nav-item">
  73. <a class="nav-link" data-toggle="tab" href="#tab-nvs">NVS editor</a>
  74. </li>
  75. <li class="nav-item">
  76. <a class="nav-link" data-toggle="tab" href="#tab-credits">Credits</a>
  77. </li>
  78. </ul>
  79. <div id="message"></div>
  80. <div id="content">
  81. <div id="myTabContent" class="tab-content">
  82. <div class="tab-pane fade active show" id="tab-wifi">
  83. <div id="wifi">
  84. <div id="wifi-status">
  85. <h2>Connected to:</h2>
  86. <section id="connected-to">
  87. <div class="ape"><div class="w0"><div class="pw"><span></span></div></div></div>
  88. </section>
  89. </div>
  90. <h2>Manual connect</h2>
  91. <section id="manual_add">
  92. <div class="ape">ADD (HIDDEN) SSID</div>
  93. </section>
  94. <h2>or choose a network...
  95. <button type="button" id="updateAP" class="btn btn-info btn-sm">Update</button>
  96. </h2>
  97. <section id="wifi-list">
  98. </section>
  99. </div>
  100. <div id="connect_manual">
  101. <header>
  102. <h1>Enter Details</h1>
  103. </header>
  104. <h2>DHCP host name</h2>
  105. <section id="wifi-list">
  106. <input id="dhcp-name2" type="text" placeholder="" value="squeezeamp">
  107. </section>
  108. <h2>Manual Connection</h2>
  109. <section>
  110. <input id="manual_ssid" type="text" placeholder="SSID" value="">
  111. <input id="manual_pwd" type="password" placeholder="Password" value="">
  112. </section>
  113. <div class="buttons">
  114. <input id="manual_join" type="button" class="btn btn-success" value="Join" data-connect="manual" />
  115. <input id="manual_cancel" type="button" class="btn btn-danger" value="Cancel"/>
  116. </div>
  117. </div>
  118. <div id="connect">
  119. <header>
  120. <h1>Connect to network</h1>
  121. </header>
  122. <h2>DHCP host name</h2>
  123. <section id="wifi-list">
  124. <input id="dhcp-name1" type="text" placeholder="" value="squeezeamp">
  125. </section>
  126. <h2>Password for <span id="ssid-pwd"></span></h2>
  127. <section>
  128. <input id="pwd" type="password" placeholder="Password" value="">
  129. </section>
  130. <div class="buttons">
  131. <input id="join" type="button" class="btn btn-success" value="Join" />
  132. <input id="cancel" type="button" class="btn btn-danger" value="Cancel"/>
  133. </div>
  134. </div>
  135. <div id="connect-wait">
  136. <header>
  137. <h1>Please wait...</h1>
  138. </header>
  139. <h2>Connecting to <span id="ssid-wait"></span></h2>
  140. <section>
  141. <div id="loading">
  142. <div class="spinner"><div class="double-bounce1"></div><div class="double-bounce2"></div></div>
  143. <p class="tctr">You may lose wifi access while the esp32 recalibrates its radio. Please wait until your device automatically reconnects. This can take up to 30s.</p>
  144. </div>
  145. <div id="connect-success">
  146. <h3 class="gr">Success!</h3>
  147. </div>
  148. <div id="connect-fail">
  149. <h3 class="rd">Connection failed</h3>
  150. <p class="tctr">Please double-check wifi password if any and make sure the access point has good signal.</p>
  151. </div>
  152. </section>
  153. <div class="buttons">
  154. <input id="ok-connect" type="button" value="OK" class="btn btn-success" />
  155. </div>
  156. </div>
  157. <div id="connect-details">
  158. <div id="connect-details-wrap">
  159. <header>
  160. <h1></h1>
  161. </header>
  162. <h2></h2>
  163. <section>
  164. <div class="buttons">
  165. <input id="disconnect" type="button" value="Disconnect" class="btn btn-danger"/>
  166. </div>
  167. </section>
  168. <h2>IP Address</h2>
  169. <section>
  170. <div class="ape brdb">IP Address:<div id="ip" class="fr"></div></div>
  171. <div class="ape brdb">Subnet Mask:<div id="netmask" class="fr"></div></div>
  172. <div class="ape">Default Gateway:<div id="gw" class="fr"></div></div>
  173. </section>
  174. <div class="buttons">
  175. <input id="ok-details" type="button" value="Back" class="btn btn-success" />
  176. </div>
  177. </div>
  178. <div id="diag-disconnect" class="diag-box">
  179. <div class="diag-box-win">
  180. <p>Are you sure you would like to disconnect from this wifi?</p>
  181. <div class="buttons">
  182. <input id="no-disconnect" type="button" value="No" class="btn btn-success" />
  183. <input id="yes-disconnect" type="button" value="Yes" class="btn btn-danger" />
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <div class="tab-pane fade" id="tab-audio">
  190. <div id="audioout">
  191. <h1>Audio output</h1>
  192. <div class="form-group">
  193. <div class="custom-control custom-radio">
  194. <input type="radio" id="i2s" name="audio" class="custom-control-input" checked='checked' />
  195. <label for="i2s" class="custom-control-label">I2S</label>
  196. </div>
  197. <div class="custom-control custom-radio">
  198. <input type="radio" id="spdif" name="audio" class="custom-control-input" />
  199. <label for="spdif" class="custom-control-label">SPDIF</label>
  200. </div>
  201. <div class="custom-control custom-radio">
  202. <input type="radio" id="bt" name="audio" class="custom-control-input" />
  203. <label for="bt" class="custom-control-label">Bluetooth</label>
  204. </div>
  205. </div>
  206. </div>
  207. <div id="btsinkdiv">
  208. <input id="btsink" type="text" value="BT sink name" />
  209. </div>
  210. <div>
  211. <h1>Player name</h1>
  212. <input id="player" type="text" value="squeezelite" />
  213. </div>
  214. <div>
  215. <h1>Optional setting (e.g. for LMS IP address)</h1>
  216. <input id="optional" type="text" value="" placeholder="-s 192.168.0.1" />
  217. </div>
  218. <div class="buttons">
  219. <input id="generate-command" type="button" class="btn btn-success" value="Generate" />
  220. </div>
  221. <h1>Squeezelite command to run</h1>
  222. <section id="command-list">
  223. <textarea id="autoexec1" maxlength="120">squeezelite -o I2S -b 500:2000 -d all=info -C 30 -W</textarea>
  224. </section>
  225. <div class="buttons">
  226. <input id="save-autoexec1" type="button" class="btn btn-success" value="Save" />
  227. </div>
  228. <h1>Start Squeezelite (toggle to activate changes)</h1>
  229. <div class="custom-control custom-switch">
  230. <input type="checkbox" class="custom-control-input" id="autoexec-cb" checked="checked">
  231. <label class="custom-control-label" for="autoexec-cb"></label>
  232. </div>
  233. <br />
  234. </div>
  235. <div class="tab-pane fade" id="tab-gpio">
  236. <table class="table table-hover">
  237. <thead>
  238. <tr>
  239. <th scope="col">Signal</th>
  240. <th scope="col">I2S pin</th>
  241. <th scope="col">SPDIF pin</th>
  242. </tr>
  243. </thead>
  244. <tbody id="gpioTable">
  245. <tr>
  246. <td>Bit clock</td>
  247. <td>
  248. <input type="text" class="form-control gpio" id="gpio-i2s-bc" maxlength="2" size="2">
  249. </td>
  250. <td>
  251. <input type="text" class="form-control gpio" id="gpio-spdif-bc" maxlength="2" size="2">
  252. </td>
  253. </tr>
  254. <tr>
  255. <td>Word select</td>
  256. <td>
  257. <input type="text" class="form-control gpio" id="gpio-i2s-ws" maxlength="2" size="2">
  258. </td>
  259. <td>
  260. <input type="text" class="form-control gpio" id="gpio-spdif-ws" maxlength="2" size="2">
  261. </td>
  262. </tr>
  263. <tr>
  264. <td>Data</td>
  265. <td>
  266. <input type="text" class="form-control gpio" id="gpio-i2s-data" maxlength="2" size="2">
  267. </td>
  268. <td>
  269. <input type="text" class="form-control gpio" id="gpio-spdif-data" maxlength="2" size="2">
  270. </td>
  271. </tr>
  272. </tbody>
  273. </table>
  274. <div class="buttons">
  275. <input id="save-gpio" type="button" class="btn btn-success" value="Save" />
  276. </div>
  277. </div>
  278. <div class="tab-pane fade" id="tab-nvs">
  279. <table class="table table-hover">
  280. <thead>
  281. <tr>
  282. <th scope="col">Key</th>
  283. <th scope="col">Value</th>
  284. </tr>
  285. </thead>
  286. <tbody id="nvsTable">
  287. </tbody>
  288. </table>
  289. <div class="buttons">
  290. <div id="boot-div">
  291. <form id="reboot-form" action="/reboot.json" method="post" target="dummyframe">
  292. <button id="reboot-button" type="submit" class="btn btn-primary">Reboot</button>
  293. </form>
  294. </div>
  295. <input id="save-nvs" type="button" class="btn btn-success" value="Save" />
  296. </div>
  297. </div>
  298. <div class="tab-pane fade" id="tab-firmware">
  299. <div id="boot-div">
  300. <form id="boot-form" action="/recovery.json" method="post" target="dummyframe">
  301. <button id="boot-button" type="submit" class="btn btn-primary">Recovery</button>
  302. </form>
  303. </div>
  304. <h1>Check for firmware upgrade</h1>
  305. <div class="buttons">
  306. <input type="button" id="fwcheck" class="btn btn-info" value="Check for updates" />
  307. </div>
  308. <div id="searchfw" class="form-group">
  309. <input class="form-control form-control-sm" id="searchinput" type="text" placeholder="search releases" id="inputSmall">
  310. </div>
  311. <table class="table table-hover">
  312. <thead>
  313. <tr>
  314. <th scope="col">Firmware version</th>
  315. <th scope="col">Release date</th>
  316. <th scope="col">HW platform</th>
  317. <th scope="col">IDF version</th>
  318. <th scope="col">Branch</th>
  319. <th scope="col">Flash this FW</th>
  320. </tr>
  321. </thead>
  322. <tbody id="releaseTable">
  323. </tbody>
  324. </table>
  325. <h2>Firmware URL:</h2>
  326. <textarea id="fwurl" maxlength="350"></textarea>
  327. <!--
  328. <br />OR<br />
  329. <div class="input-group mb-3" id="upload">
  330. <div class="custom-file">
  331. <input type="file" class="custom-file-input" id="inputGroupFile01">
  332. <label class="custom-file-label" for="inputGroupFile01"></label>
  333. </div>
  334. <div class="input-group-append">
  335. <span class="input-group-text" id="fwUpload">Upload</span>
  336. </div>
  337. </div>
  338. -->
  339. <div class="buttons">
  340. <input type="button" id="flash" class="btn btn-danger" value="Flash!" /><span id="flash-status"></span>
  341. </div>
  342. <div id="otadiv">
  343. <div class="progress" id="progress">
  344. <div class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100" style="width:0%">
  345. 0%
  346. </div>
  347. </div>
  348. </div>
  349. </div>
  350. <div class="tab-pane fade" id="tab-credits">
  351. <div class="jumbotron">
  352. <p><strong><a href="https://github.com/sle118/squeezelite-esp32">squeezelite-esp32</a></strong>, &copy; 2019, philippe44, sle118, daduke<br />Licensed under the GPL</p>
  353. <p>
  354. This app would not be possible without the following libraries:
  355. </p>
  356. <ul>
  357. <li>squeezelite, &copy; 2012-2019, Adrian Smith and Ralph Irving. Licensed under the GPL License.</li>
  358. <li>esp32-wifi-manager, &copy; 2017-2019, Tony Pottier. Licensed under the MIT License.</li>
  359. <li>SpinKit, &copy; 2015, Tobias Ahlin. Licensed under the MIT License.</li>
  360. <li>jQuery, The jQuery Foundation. Licensed under the MIT License.</li>
  361. <li>cJSON, &copy; 2009-2017, Dave Gamble and cJSON contributors. Licensed under the MIT License.</li>
  362. <li>esp32-rotary-encoder, &copy; 2011-2019, David Antliff and Ben Buxton. Licensed under the GPL License.</li>
  363. <li>tarablessd1306, &copy; 2017-2018, Tara Keeling. Licensed under the MIT license.</li>
  364. </ul>
  365. </div>
  366. <h2>Show NVS Editor</h2>
  367. <div class="custom-control custom-switch">
  368. <input type="checkbox" class="custom-control-input" id="show-nvs" checked="checked">
  369. <label class="custom-control-label" for="show-nvs"></label>
  370. </div>
  371. </div>
  372. </div>
  373. <footer class="footer"><span id="foot-fw"></span><span id="foot-wifi"></span></footer>
  374. <iframe width="0" height="0" border="0" name="dummyframe" id="dummyframe"></iframe>
  375. </div>
  376. </body>
  377. </html>