nadesiko3 3.3.55 → 3.3.56

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.
package/batch/command.txt CHANGED
@@ -579,7 +579,7 @@
579
579
  | 関数 | オーディオ再生位置設定 | OBJをVに/Vへ | AudioオブジェクトOBJを指定してオーディの位置を数値Vで設定する | おーでぃおさいせい | https://github.com/kujirahand/nadesiko3/blob/master/src/plugin_browser_audio.mjs#L103
580
580
  ●ホットキー
581
581
  | 関数 | ホットキー登録 | KEYにFNAMEを/KEYで | ホットキーKEYにEVENTを登録する | ほっときーとうろく | https://github.com/kujirahand/nadesiko3/blob/master/src/plugin_browser_hotkey.mjs#L10
582
- | 関数 | ホットキー解除 | KEYを/KEYの | ホットキーKEYを解除する | ほっときーかいじょ | https://github.com/kujirahand/nadesiko3/blob/master/src/plugin_browser_hotkey.mjs#L21
582
+ | 関数 | ホットキー解除 | KEYを/KEYの | ホットキーKEYを解除する | ほっときーかいじょ | https://github.com/kujirahand/nadesiko3/blob/master/src/plugin_browser_hotkey.mjs#L22
583
583
  ●グラフ描画_CHARTJS
584
584
  | 関数 | グラフ描画 | DATAを/DATAで/DATAの | Chart.jsを利用して、DATAのグラフを描画 | ぐらふびょうが | https://github.com/kujirahand/nadesiko3/blob/master/src/plugin_browser_chart.mjs#L8
585
585
  | 定数 | グラフオプション | | {} | ぐらふおぷしょん | https://github.com/kujirahand/nadesiko3/blob/master/src/plugin_browser_chart.mjs#L30
package/core/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nadesiko3core",
3
- "version": "3.3.55",
3
+ "version": "3.3.56",
4
4
  "description": "Japanese Programming Language Nadesiko v3 core",
5
5
  "main": "index.mjs",
6
6
  "type": "module",
@@ -1,8 +1,8 @@
1
1
  // 実際のバージョン定義 (自動生成されるので以下を編集しない)
2
2
  const coreVersion = {
3
- version: '3.3.54',
3
+ version: '3.3.56',
4
4
  major: 3,
5
5
  minor: 3,
6
- patch: 54
6
+ patch: 56
7
7
  };
8
8
  export default coreVersion;
@@ -11,9 +11,9 @@ export interface NakoCoreVersion {
11
11
  }
12
12
  // 実際のバージョン定義 (自動生成されるので以下を編集しない)
13
13
  const coreVersion: NakoCoreVersion = {
14
- version: '3.3.54',
14
+ version: '3.3.56',
15
15
  major: 3,
16
16
  minor: 3,
17
- patch: 54
17
+ patch: 56
18
18
  }
19
19
  export default coreVersion
@@ -1198,6 +1198,8 @@ export class NakoGen {
1198
1198
  }
1199
1199
  return result;
1200
1200
  };
1201
+ // 引数チェックの例外 #1260
1202
+ const noCheckFuncs = { 'TYPEOF': true, '変数型確認': true };
1201
1203
  // 関数呼び出しコードの構築
1202
1204
  let argsCode;
1203
1205
  if ((this.warnUndefinedCallingUserFunc === 0 && res.i !== 0) || (this.warnUndefinedCallingSystemFunc === 0 && res.i === 0)) {
@@ -1206,7 +1208,7 @@ export class NakoGen {
1206
1208
  else {
1207
1209
  argsCode = '';
1208
1210
  args.forEach((arg) => {
1209
- if (arg === '__self') {
1211
+ if (arg === '__self' || noCheckFuncs[funcName] === true) { // #1260
1210
1212
  argsCode += `,${arg}`;
1211
1213
  }
1212
1214
  else {
@@ -1270,6 +1270,8 @@ export class NakoGen {
1270
1270
  return result
1271
1271
  }
1272
1272
 
1273
+ // 引数チェックの例外 #1260
1274
+ const noCheckFuncs: {[key: string]: boolean} = { 'TYPEOF': true, '変数型確認': true }
1273
1275
  // 関数呼び出しコードの構築
1274
1276
  let argsCode: string
1275
1277
  if ((this.warnUndefinedCallingUserFunc === 0 && res.i !== 0) || (this.warnUndefinedCallingSystemFunc === 0 && res.i === 0)) {
@@ -1277,7 +1279,7 @@ export class NakoGen {
1277
1279
  } else {
1278
1280
  argsCode = ''
1279
1281
  args.forEach((arg: string) => {
1280
- if (arg === '__self') {
1282
+ if (arg === '__self' || noCheckFuncs[funcName] === true) { // #1260
1281
1283
  argsCode += `,${arg}`
1282
1284
  } else {
1283
1285
  if (res.i === 0) {
@@ -0,0 +1,39 @@
1
+ default export {
2
+ //
3
+ //
4
+ // ...
5
+ //
6
+ 'RPN計算': {
7
+ type: 'func',
8
+ josi: [['を']],
9
+ fn: function (src) {
10
+ return calcRPN(src)
11
+ }
12
+ }
13
+ }
14
+
15
+ function calcRPN(src) {
16
+ // 字句解析 + 構文解析を行う
17
+ const tokens = src.split(/\s+/)
18
+ // スタック操作のためのラッパー関数を定義
19
+ const stack = []
20
+ const pop = () => {
21
+ const v = stack.pop()
22
+ console.log('pop=', v)
23
+ return parseFloat(v)
24
+ }
25
+ const push = (v) => {
26
+ console.log('push=', v)
27
+ stack.push(v)
28
+ }
29
+ // トークンを順に評価する
30
+ for (const t of tokens) {
31
+ if (t === '*') { stack.push(pop() * pop()) }
32
+ else if (t === '/') { stack.push(pop() / pop()) }
33
+ else if (t === '+') { stack.push(pop() + pop()) }
34
+ else if (t === '-') { stack.push(pop() - pop()) }
35
+ else { push(t) }
36
+ }
37
+ // 答えを表示
38
+ return pop()
39
+ }
@@ -14,3 +14,32 @@ default export {
14
14
  }
15
15
  }
16
16
  }
17
+
18
+ function calcRPN() {
19
+ // ソースコードを得る
20
+ const src = document.getElementById("src").value
21
+ .replace(/\s+$/, '')
22
+ // 字句解析 + 構文解析を行う
23
+ const tokens = src.split(/\s+/)
24
+ // スタック操作のためのラッパー関数を定義
25
+ const stack = []
26
+ const pop = () => {
27
+ const v = stack.pop()
28
+ console.log('pop=', v)
29
+ return parseFloat(v)
30
+ }
31
+ const push = (v) => {
32
+ console.log('push=', v)
33
+ stack.push(v)
34
+ }
35
+ // トークンを順に評価する
36
+ for (const t of tokens) {
37
+ if (t === '*') { stack.push(pop() * pop()) }
38
+ else if (t === '/') { stack.push(pop() / pop()) }
39
+ else if (t === '+') { stack.push(pop() + pop()) }
40
+ else if (t === '-') { stack.push(pop() - pop()) }
41
+ else { push(t) }
42
+ }
43
+ // 答えを表示
44
+ return pop()
45
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nadesiko3",
3
- "version": "3.3.55",
3
+ "version": "3.3.56",
4
4
  "description": "Japanese Programming Language",
5
5
  "type": "module",
6
6
  "main": "src/index.mjs",
@@ -156,7 +156,8 @@
156
156
  "mocha": "^10.0.0",
157
157
  "mocha-css": "^1.0.1",
158
158
  "module-alias": "^2.2.2",
159
- "npm-check-updates": "^13.0.3",
159
+ "multer": "^1.4.5-lts.1",
160
+ "npm-check-updates": "^2.2.3",
160
161
  "os-browserify": "^0.3.0",
161
162
  "path-browserify": "^1.0.1",
162
163
  "prettier": "^2.6.2",
@@ -181,8 +182,7 @@
181
182
  "uuid": "^8.3.2",
182
183
  "webpack": "^5.72.1",
183
184
  "webpack-bundle-analyzer": "^4.5.0",
184
- "webpack-cli": "^4.9.2",
185
- "multer": "^1.4.5-lts.1"
185
+ "webpack-cli": "^4.9.2"
186
186
  },
187
187
  "dependencies": {
188
188
  "dayjs": "^1.11.2",
package/release/_hash.txt CHANGED
@@ -9,10 +9,10 @@ editor.js:
9
9
  sha256(base64): mWPVpxYoegeIn6u0PanyI4Z8eRx41UD/kBYns489U04=
10
10
  sha512(base64): q9aYWdo2RiNlmsa4gSoQL70F4RkvG/lAUxOYew1tXdyJre4KSm7EWQp9m9+CgexV+sLcOg3DJ3+0/FW8Uu2DIg==
11
11
  nako_gen_async.js:
12
- md5(hex): a31eb94a2224bab6c251432007705160
13
- sha256(hex): eb6424a3a0ba32e70782f94d9eec10a1c52e0ebfc91c21e28766f20d1f5385a1
14
- sha256(base64): 62Qko6C6MucHgvlNnuwQocUuDr/JHCHih2byDR9ThaE=
15
- sha512(base64): 8d8MklDxryUEfg4JC1UrCGs7DlgF4BFzHicfE6kgOI8LPh2TA1zDfSQFsmemzeeLcMAw/xtKy0SJpAEEW6I9Og==
12
+ md5(hex): c9d168b7212850daa66d3ac177aaa3ce
13
+ sha256(hex): cbf762c87b11f421e1e3dc24cd05e5c018faf5ecc04948b9aab8d0db4086d20b
14
+ sha256(base64): y/diyHsR9CHh49wkzQXlwBj69ezASUi5qrjQ20CG0gs=
15
+ sha512(base64): 1/T3C+jBzt5ILfY3vVcnDzJGeFVA8tWHi+prbLgBWZd6CBD34RP9jundCJkMRKdXB3UnCYio4QHYPkGnAzGebw==
16
16
  plugin_caniuse.js:
17
17
  md5(hex): 95a7a5c98a92a46b6435e577daba3241
18
18
  sha256(hex): 57638b3979be70b45ab8085861f6b2ece43200bd6aa92765d73caf76b9e6fea9
@@ -54,17 +54,17 @@ plugin_weykturtle3d.js:
54
54
  sha256(base64): ND/1JqYrFVGTIPYsbBk+tScnF8RVzgYPM0/E2aE8GRw=
55
55
  sha512(base64): T4B8Cvhn9j5YdMGk4rwPInfqmcXtGEjD2g6X6wSqXvYyIXuSy+t1RVf1viZ2zljHlk3wN6pwKvvg/NIJvfMAzw==
56
56
  version.js:
57
- md5(hex): 17a049c63ef32abdea003ba0ec869ad8
58
- sha256(hex): 0005198cb820a2ddfe45531288e082828dc2f604c6f9fdc9f7fe4634dd7f6c55
59
- sha256(base64): AAUZjLggot3+RVMSiOCCgo3C9gTG+f3J9/5GNN1/bFU=
60
- sha512(base64): 6i4v9RcEuO156wJF5JkMihfGLWvdhy/5y6Q/i0HKYLVNlTkPGWtVKh81ZxPFwokzqT7mjamgqVXu5mxo4c69ZA==
57
+ md5(hex): b679e7197ed35355de9ef7b6a01cd4b5
58
+ sha256(hex): 1a99bb254ebbedea7eb4b9b3497eb30fc1482c1f8c4a85ff6b9311ddcbfa037d
59
+ sha256(base64): Gpm7JU677ep+tLmzSX6zD8FILB+MSoX/a5MR3cv6A30=
60
+ sha512(base64): XrVL0Y966jzgGP6RTcGcfFayY9km0zhJZumkeAeOdNqHxVL3zZhNE+/qUn8AGF2IfyCUOL/ukaFeZpQNFGlT6A==
61
61
  wnako3.js:
62
- md5(hex): 287d6c2ef578c9641bbb84aa0b37a883
63
- sha256(hex): 4a40fdda43bd94b5fdd935ccc1b21e5706cef2e88beb4efe7be448a8ad8e6516
64
- sha256(base64): SkD92kO9lLX92TXMwbIeVwbO8uiL607+e+RIqK2OZRY=
65
- sha512(base64): CyixWNqFF523IZITid+ktmtUEQkJAk92ecad4p5G90K4PwAVvl9thIiIxlvkF1auU49nRvIvOtjGJSyw8UD7Yw==
62
+ md5(hex): 6109855d92b67506017ee3a45bb2b4d9
63
+ sha256(hex): b5c74d76e9b167f45445e4eaf97d72a917fa4d606d61a8dc2a9d2b5a695e67e4
64
+ sha256(base64): tcdNdumxZ/RUReTq+X1yqRf6TWBtYajcKp0rWmleZ+Q=
65
+ sha512(base64): unHPxfskh9sDF8qM8SYUw6q5NJBOBMD20qVNSRqLfR5rOG7BUOrSu+sT7ap6pQ8EEQCxhxesSqmt2xJZiPjHQw==
66
66
  wnako3webworker.js:
67
- md5(hex): 96ebadb79faee82a6705b8c2f490aa1a
68
- sha256(hex): 3360634ad07b687ee08dd1b4ec639b4a3a749cb17cbc90d09a895a5032543afd
69
- sha256(base64): M2BjStB7aH7gjdG07GObSjp0nLF8vJDQmolaUDJUOv0=
70
- sha512(base64): bvBGD2vIEDNileOaIFHF8PaQls0dk6Up76Cb13QQqxGitS+rw1D/PGySL9SfWaZk6x4f3TG7xmL7GNILNczvJw==
67
+ md5(hex): b58632bdc0ac75f4adabe7aa32c6b7f6
68
+ sha256(hex): e7eee0e81e0452cd868d0f2db8d915f69d81de426b2238fdffca84e62282fe10
69
+ sha256(base64): 5+7g6B4EUs2GjQ8tuNkV9p2B3kJrIjj9/8qE5iKC/hA=
70
+ sha512(base64): 7N+L05OJnnuFTeB0pYqRnEcSzBuLrhB3d44WPs5OMvnUIoYjY+Hv/YvokHdMfk7KYJXAZHnQ2u1mYWfWTr1tgA==
@@ -1,14 +1,14 @@
1
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/command.json.js" integrity="sha512-3PHGfRGcyV9VPBflXtm5cP2qT4kGyPgTpCyrFhjUXMHQKRf6+2yGK6VCcAV6KCOkjWIzKVCGeoDo4Pzp+YtckQ==" crossorigin="anonymous"></script>
2
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/editor.js" integrity="sha512-q9aYWdo2RiNlmsa4gSoQL70F4RkvG/lAUxOYew1tXdyJre4KSm7EWQp9m9+CgexV+sLcOg3DJ3+0/FW8Uu2DIg==" crossorigin="anonymous"></script>
3
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/nako_gen_async.js" integrity="sha512-8d8MklDxryUEfg4JC1UrCGs7DlgF4BFzHicfE6kgOI8LPh2TA1zDfSQFsmemzeeLcMAw/xtKy0SJpAEEW6I9Og==" crossorigin="anonymous"></script>
4
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_caniuse.js" integrity="sha512-NbX6BKUNq1J8xwtv5CThQC54Lb/KxaPlimRpsF745nxqjYeuGD7S70j4yOgNm4Uwd7AN5FgezS6NDyhlvoJF2w==" crossorigin="anonymous"></script>
5
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_csv.js" integrity="sha512-mQvmj25L2Nc2L7gN1rTjayHVMMPhc7TCSiBsuKS4JKOQqN+91uj9qpLAOejzR1ib5jIOBdtrhN+secNTU9BJtw==" crossorigin="anonymous"></script>
6
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_datetime.js" integrity="sha512-1ADTZFkcfU6vpEEJZEYmIbqS6G2XViooDFD4198P61n7VKZ0PhEVj9l8ULFGrW7woSbDqfSPZmkZ7yvcRqPKYA==" crossorigin="anonymous"></script>
7
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_kansuji.js" integrity="sha512-tXC9Q6LejwYG+HUbXcwBHFmhwTsqiMHOBohLNcSx8b02hxk3waPUEQRWeNP7QxAFMv5BOAY+Grruf+XKmmU26g==" crossorigin="anonymous"></script>
8
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_markup.js" integrity="sha512-pvb+QYO9LMUH055nPJJ5QaWyEYR3wDkHHilV5LLNyxObs7enlHGiF7Jt3Csd93JTdJ3n9hxFbTqWa1QuzVmTfQ==" crossorigin="anonymous"></script>
9
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_turtle.js" integrity="sha512-3/BlAe3uVDBgJrgFWzLJa3bvNQVhAQuL343Icict5hI3LndcPjV6mAD8KoWRlxmF8A8S6n8eKnmrh6NFWTjyEw==" crossorigin="anonymous"></script>
10
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_webworker.js" integrity="sha512-JLlIg9cW9UgM2AT+qMgEuKvea3t8R+1jihhlN/QGDQe7iCaGEfXfKG5gpvRb0IUyisNfzncUN8AfLn9wyxGGiw==" crossorigin="anonymous"></script>
11
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/plugin_weykturtle3d.js" integrity="sha512-T4B8Cvhn9j5YdMGk4rwPInfqmcXtGEjD2g6X6wSqXvYyIXuSy+t1RVf1viZ2zljHlk3wN6pwKvvg/NIJvfMAzw==" crossorigin="anonymous"></script>
12
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/version.js" integrity="sha512-6i4v9RcEuO156wJF5JkMihfGLWvdhy/5y6Q/i0HKYLVNlTkPGWtVKh81ZxPFwokzqT7mjamgqVXu5mxo4c69ZA==" crossorigin="anonymous"></script>
13
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/wnako3.js" integrity="sha512-CyixWNqFF523IZITid+ktmtUEQkJAk92ecad4p5G90K4PwAVvl9thIiIxlvkF1auU49nRvIvOtjGJSyw8UD7Yw==" crossorigin="anonymous"></script>
14
- <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.55&f=release/wnako3webworker.js" integrity="sha512-bvBGD2vIEDNileOaIFHF8PaQls0dk6Up76Cb13QQqxGitS+rw1D/PGySL9SfWaZk6x4f3TG7xmL7GNILNczvJw==" crossorigin="anonymous"></script>
1
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/command.json.js" integrity="sha512-3PHGfRGcyV9VPBflXtm5cP2qT4kGyPgTpCyrFhjUXMHQKRf6+2yGK6VCcAV6KCOkjWIzKVCGeoDo4Pzp+YtckQ==" crossorigin="anonymous"></script>
2
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/editor.js" integrity="sha512-q9aYWdo2RiNlmsa4gSoQL70F4RkvG/lAUxOYew1tXdyJre4KSm7EWQp9m9+CgexV+sLcOg3DJ3+0/FW8Uu2DIg==" crossorigin="anonymous"></script>
3
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/nako_gen_async.js" integrity="sha512-1/T3C+jBzt5ILfY3vVcnDzJGeFVA8tWHi+prbLgBWZd6CBD34RP9jundCJkMRKdXB3UnCYio4QHYPkGnAzGebw==" crossorigin="anonymous"></script>
4
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_caniuse.js" integrity="sha512-NbX6BKUNq1J8xwtv5CThQC54Lb/KxaPlimRpsF745nxqjYeuGD7S70j4yOgNm4Uwd7AN5FgezS6NDyhlvoJF2w==" crossorigin="anonymous"></script>
5
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_csv.js" integrity="sha512-mQvmj25L2Nc2L7gN1rTjayHVMMPhc7TCSiBsuKS4JKOQqN+91uj9qpLAOejzR1ib5jIOBdtrhN+secNTU9BJtw==" crossorigin="anonymous"></script>
6
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_datetime.js" integrity="sha512-1ADTZFkcfU6vpEEJZEYmIbqS6G2XViooDFD4198P61n7VKZ0PhEVj9l8ULFGrW7woSbDqfSPZmkZ7yvcRqPKYA==" crossorigin="anonymous"></script>
7
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_kansuji.js" integrity="sha512-tXC9Q6LejwYG+HUbXcwBHFmhwTsqiMHOBohLNcSx8b02hxk3waPUEQRWeNP7QxAFMv5BOAY+Grruf+XKmmU26g==" crossorigin="anonymous"></script>
8
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_markup.js" integrity="sha512-pvb+QYO9LMUH055nPJJ5QaWyEYR3wDkHHilV5LLNyxObs7enlHGiF7Jt3Csd93JTdJ3n9hxFbTqWa1QuzVmTfQ==" crossorigin="anonymous"></script>
9
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_turtle.js" integrity="sha512-3/BlAe3uVDBgJrgFWzLJa3bvNQVhAQuL343Icict5hI3LndcPjV6mAD8KoWRlxmF8A8S6n8eKnmrh6NFWTjyEw==" crossorigin="anonymous"></script>
10
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_webworker.js" integrity="sha512-JLlIg9cW9UgM2AT+qMgEuKvea3t8R+1jihhlN/QGDQe7iCaGEfXfKG5gpvRb0IUyisNfzncUN8AfLn9wyxGGiw==" crossorigin="anonymous"></script>
11
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/plugin_weykturtle3d.js" integrity="sha512-T4B8Cvhn9j5YdMGk4rwPInfqmcXtGEjD2g6X6wSqXvYyIXuSy+t1RVf1viZ2zljHlk3wN6pwKvvg/NIJvfMAzw==" crossorigin="anonymous"></script>
12
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/version.js" integrity="sha512-XrVL0Y966jzgGP6RTcGcfFayY9km0zhJZumkeAeOdNqHxVL3zZhNE+/qUn8AGF2IfyCUOL/ukaFeZpQNFGlT6A==" crossorigin="anonymous"></script>
13
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/wnako3.js" integrity="sha512-unHPxfskh9sDF8qM8SYUw6q5NJBOBMD20qVNSRqLfR5rOG7BUOrSu+sT7ap6pQ8EEQCxhxesSqmt2xJZiPjHQw==" crossorigin="anonymous"></script>
14
+ <script defer src="https://nadesi.com/v3/cdn.php?v=3.3.56&f=release/wnako3webworker.js" integrity="sha512-7N+L05OJnnuFTeB0pYqRnEcSzBuLrhB3d44WPs5OMvnUIoYjY+Hv/YvokHdMfk7KYJXAZHnQ2u1mYWfWTr1tgA==" crossorigin="anonymous"></script>