@pyric/cli 0.1.0-alpha.17 → 0.1.0-alpha.19

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 (223) hide show
  1. package/README.md +34 -3
  2. package/README.md.orig +5 -1
  3. package/dist/bridge/server/bridge.d.ts.map +1 -1
  4. package/dist/bridge/server/bridge.js +4 -2
  5. package/dist/bridge/server/bridge.js.map +1 -1
  6. package/dist/bridge/server/mcp-contract.d.ts +2 -2
  7. package/dist/bridge/server/mcp-contract.d.ts.map +1 -1
  8. package/dist/bridge/server/mcp-contract.js +3 -0
  9. package/dist/bridge/server/mcp-contract.js.map +1 -1
  10. package/dist/bridge/server/peer.d.ts.map +1 -1
  11. package/dist/bridge/server/peer.js +1 -0
  12. package/dist/bridge/server/peer.js.map +1 -1
  13. package/dist/cli/index.d.ts +1 -0
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +3 -0
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/mcp-proxy.d.ts.map +1 -1
  18. package/dist/cli/mcp-proxy.js.map +1 -1
  19. package/dist/cli/rules.d.ts +1 -0
  20. package/dist/cli/rules.d.ts.map +1 -1
  21. package/dist/cli/rules.js +18 -4
  22. package/dist/cli/rules.js.map +1 -1
  23. package/dist/cli/serve.d.ts.map +1 -1
  24. package/dist/cli/serve.js +1 -0
  25. package/dist/cli/serve.js.map +1 -1
  26. package/dist/cli/service-command-records/storage-rules-resolve.d.ts +4 -0
  27. package/dist/cli/service-command-records/storage-rules-resolve.d.ts.map +1 -0
  28. package/dist/cli/service-command-records/storage-rules-resolve.js +3 -0
  29. package/dist/cli/service-command-records/storage-rules-resolve.js.map +1 -0
  30. package/dist/cli/service-commands.generated.d.ts +3 -0
  31. package/dist/cli/service-commands.generated.d.ts.map +1 -1
  32. package/dist/cli/service-commands.generated.js +2 -0
  33. package/dist/cli/service-commands.generated.js.map +1 -1
  34. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  35. package/dist/conformance/.generated/conformance-docs.js +1 -1
  36. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  37. package/dist/functions-rtdb/child.d.ts +1 -0
  38. package/dist/functions-rtdb/child.d.ts.map +1 -1
  39. package/dist/functions-rtdb/child.js +11 -1
  40. package/dist/functions-rtdb/child.js.map +1 -1
  41. package/dist/functions-rtdb/development-runtime.d.ts +1 -0
  42. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
  43. package/dist/functions-rtdb/development-runtime.js +1 -0
  44. package/dist/functions-rtdb/development-runtime.js.map +1 -1
  45. package/dist/remote/index.d.ts.map +1 -1
  46. package/dist/remote/index.js +5 -3
  47. package/dist/remote/index.js.map +1 -1
  48. package/dist/serve/rules.d.ts +3 -3
  49. package/dist/serve/rules.d.ts.map +1 -1
  50. package/dist/serve/rules.js +13 -5
  51. package/dist/serve/rules.js.map +1 -1
  52. package/dist/serve/runtime/chip.d.ts.map +1 -1
  53. package/dist/serve/runtime/chip.js +24 -3
  54. package/dist/serve/runtime/chip.js.map +1 -1
  55. package/dist/serve/runtime/status.d.ts +1 -0
  56. package/dist/serve/runtime/status.d.ts.map +1 -1
  57. package/dist/serve/runtime/status.js +71 -13
  58. package/dist/serve/runtime/status.js.map +1 -1
  59. package/dist/serve/site-ui/_astro/{RulesCodeEditor.CzwHdCi9.js → RulesCodeEditor.Bl-XMkhD.js} +1 -1
  60. package/dist/serve/site-ui/_astro/_example_.B9DG9HLJ.css +1 -0
  61. package/dist/serve/site-ui/_astro/_slug_.CupVK4TM.css +1 -0
  62. package/dist/serve/site-ui/_astro/_studio_.CfxiQWkk.css +1 -0
  63. package/dist/serve/site-ui/_astro/app.Ce3MTLQm.js +1 -0
  64. package/dist/serve/site-ui/_astro/app.taqzyjD0.js +11 -0
  65. package/dist/serve/site-ui/_astro/chess-showcase.Dh5D8kqe.js +354 -0
  66. package/dist/serve/site-ui/_astro/{example-runtime.D79PnoSk.js → example-runtime.CuyAjjiG.js} +2 -26
  67. package/dist/serve/site-ui/_astro/sandbox-controls.BP4M5f1M.js +1169 -0
  68. package/dist/serve/site-ui/_astro/seed.CSUkloMi.js +20 -0
  69. package/dist/serve/site-ui/_astro/writes.C57paAj2.js +99 -0
  70. package/dist/serve/site-ui/auth/index.html +2 -2
  71. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  72. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +73 -13
  73. package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +77 -11
  74. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  75. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  76. package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
  77. package/dist/serve/site-ui/docs/api-reference/index.html +1 -1
  78. package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
  79. package/dist/serve/site-ui/docs/auth-compat/index.html +1 -1
  80. package/dist/serve/site-ui/docs/build/ai-logic/index.html +19 -2
  81. package/dist/serve/site-ui/docs/build/ai-logic.md +28 -0
  82. package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
  83. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +30 -52
  84. package/dist/serve/site-ui/docs/build/cloud-firestore.md +40 -36
  85. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  86. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
  87. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  88. package/dist/serve/site-ui/docs/conformance-scores/index.html +22 -7
  89. package/dist/serve/site-ui/docs/conformance-scores.md +20 -5
  90. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
  91. package/dist/serve/site-ui/docs/database-compat/index.html +1 -1
  92. package/dist/serve/site-ui/docs/examples/chess/index.html +645 -249
  93. package/dist/serve/site-ui/docs/examples/chess.md +45 -16
  94. package/dist/serve/site-ui/docs/examples/index.html +2 -2
  95. package/dist/serve/site-ui/docs/firestore-compat/index.html +1 -1
  96. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
  97. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  98. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
  99. package/dist/serve/site-ui/docs/get-started/start-building/index.html +43 -5
  100. package/dist/serve/site-ui/docs/get-started/start-building.md +34 -3
  101. package/dist/serve/site-ui/docs/get-started/vite/index.html +1 -1
  102. package/dist/serve/site-ui/docs/index.json +66 -26
  103. package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
  104. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
  105. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  106. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  107. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  108. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
  109. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  110. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
  111. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
  112. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  113. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
  114. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  115. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  116. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  117. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -1
  118. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  119. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  120. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  121. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  122. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  123. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  124. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  125. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  126. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  127. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +1 -1
  128. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +1 -1
  129. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  130. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  131. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +1 -1
  132. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  133. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
  134. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
  135. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +1 -1
  136. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  137. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  138. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +1 -1
  139. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
  140. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  141. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +1 -1
  142. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +1 -1
  143. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  144. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  145. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  146. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  147. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  148. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  149. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  150. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  151. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  152. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  153. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -10
  154. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api.md +0 -9
  155. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  156. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
  157. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  158. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  159. package/dist/serve/site-ui/docs/rules-compat/index.html +1 -1
  160. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  161. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  162. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  163. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  164. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  165. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  166. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
  167. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  168. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
  169. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  170. package/dist/serve/site-ui/docs/storage-compat/index.html +1 -1
  171. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  172. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  173. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
  174. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  175. package/dist/serve/site-ui/docs/tutorial/index.html +2 -1
  176. package/dist/serve/site-ui/docs/tutorial.md +2 -0
  177. package/dist/serve/site-ui/examples/chess/index.html +2 -2
  178. package/dist/serve/site-ui/firestore/index.html +2 -2
  179. package/dist/serve/site-ui/index.html +2 -2
  180. package/dist/serve/site-ui/llms.txt +2 -2
  181. package/dist/serve/site-ui/rtdb/index.html +2 -2
  182. package/dist/serve/site-ui/settings/index.html +2 -2
  183. package/dist/serve/site-ui/storage/index.html +2 -2
  184. package/dist/serve/site-ui/traffic/index.html +2 -2
  185. package/dist/serve/vite-functions-development.d.ts.map +1 -1
  186. package/dist/serve/vite-functions-development.js +1 -0
  187. package/dist/serve/vite-functions-development.js.map +1 -1
  188. package/dist/serve/vite-rules-source.d.ts.map +1 -1
  189. package/dist/serve/vite-rules-source.js +28 -7
  190. package/dist/serve/vite-rules-source.js.map +1 -1
  191. package/package.json +4 -4
  192. package/src/bridge/server/bridge.ts +5 -2
  193. package/src/bridge/server/mcp-contract.ts +3 -0
  194. package/src/bridge/server/peer.ts +2 -1
  195. package/src/cli/index.ts +3 -0
  196. package/src/cli/mcp-proxy.ts +6 -7
  197. package/src/cli/rules.ts +31 -4
  198. package/src/cli/serve.ts +1 -0
  199. package/src/cli/service-command-records/storage-rules-resolve.ts +4 -0
  200. package/src/cli/service-commands.generated.ts +2 -0
  201. package/src/conformance/.generated/conformance-docs.ts +1 -1
  202. package/src/functions-rtdb/child.ts +12 -1
  203. package/src/functions-rtdb/development-runtime.ts +2 -0
  204. package/src/remote/index.ts +7 -5
  205. package/src/serve/rules.ts +15 -5
  206. package/src/serve/runtime/chip.ts +24 -3
  207. package/src/serve/runtime/status.ts +76 -13
  208. package/src/serve/vite-functions-development.ts +1 -0
  209. package/src/serve/vite-rules-source.ts +29 -7
  210. package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +0 -1
  211. package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +0 -1
  212. package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +0 -1
  213. package/dist/serve/site-ui/_astro/app.bnmVTkIY.js +0 -11
  214. package/dist/serve/site-ui/_astro/app.t6u-adB_.js +0 -1
  215. package/dist/serve/site-ui/_astro/chess-showcase.kC8dXLKY.js +0 -1
  216. package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +0 -1
  217. package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +0 -354
  218. package/dist/serve/site-ui/_astro/index.DzVde04M.js +0 -1
  219. package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +0 -9
  220. package/dist/serve/site-ui/_astro/reads.BYBRLbsE.js +0 -1
  221. package/dist/serve/site-ui/_astro/sandbox-controls.C9Aaazt8.js +0 -1252
  222. package/dist/serve/site-ui/_astro/seed.DANAIyRw.js +0 -20
  223. package/dist/serve/site-ui/examples/firestore-first-write/index.html +0 -2
@@ -1,39 +1,83 @@
1
1
  <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Play chess against Security Rules · Pyric Studio</title><meta name="description" content="Play chess against Firestore Security Rules in an isolated Pyric sandbox."><link rel="icon" type="image/svg+xml" href="/__pyric/ui/pyric-logo.svg"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CXh9yTP1.css">
2
- <link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.BoKXYrnu.css"></head> <body> <header class="studio__bar" data-astro-cid-mw7aashj> <div class="studio__bar-inner" data-astro-cid-mw7aashj> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio" data-astro-cid-mw7aashj>Pyric</a> <nav class="studio__nav" aria-label="Studio tabs" data-astro-cid-mw7aashj> <a class="studio__nav-tab" href="/__pyric/ui/" data-astro-cid-mw7aashj> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore" data-astro-cid-mw7aashj> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth" data-astro-cid-mw7aashj> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb" data-astro-cid-mw7aashj> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage" data-astro-cid-mw7aashj> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic" data-astro-cid-mw7aashj> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings" data-astro-cid-mw7aashj> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page" data-astro-cid-mw7aashj> Docs </a> </nav> </div> </header> <div class="docs-shell docs-shell--example" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug" open> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main doc-main--example" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/">Secure &amp; debug</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <a href="#nav-section-secure-debug-examples">Examples</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">Chess showcase</span> </li> </ol> </nav> <div class="example-doc-page" data-astro-cid-ghke3xma> <header class="example-header" data-astro-cid-3f5pqdpq> <p data-astro-cid-3f5pqdpq>Firestore Security Rules · Isolated browser sandbox</p> <h1 data-astro-cid-3f5pqdpq>Play chess against Security Rules</h1> <div data-astro-cid-3f5pqdpq>Move a piece; Pyric commits the new board or denies the write.</div> </header> <div class="example-stage is-showcase" data-astro-cid-xgvwrve7> <iframe title="Play chess against Security Rules" src="/__pyric/ui/examples/chess/" sandbox="allow-scripts allow-same-origin" scrolling="no" data-example-frame data-example-id="chess" data-min-height="560" data-astro-cid-xgvwrve7></iframe> </div> <script type="module">const i=t=>{if(t.dataset.sizingInstalled==="true")return;t.dataset.sizingInstalled="true";let n;const o=()=>{const e=t.contentDocument;if(!e)return;const s=Math.max(Number(t.dataset.minHeight??0),e.documentElement.scrollHeight,e.body?.scrollHeight??0);t.style.height=`${s}px`};t.addEventListener("load",()=>{n?.disconnect();const e=t.contentDocument;e&&(n=new ResizeObserver(o),n.observe(e.documentElement),e.body&&n.observe(e.body),o())})};document.querySelectorAll("[data-example-frame]").forEach(i);</script> <article class="prose example-explanation" data-astro-cid-ghke3xma> <h2 id="try-the-board">Try the board</h2>
3
- <p>Choose a piece and its destination. <code>e2 → e4</code> is allowed; <code>e2 → e5</code> is denied and leaves the board unchanged. Switch the identity to see turn ownership enforced.</p>
4
- <p>Choose a scenario to run a complete sequence through the Rules. Fool’s Mate and Scholar’s Mate end in checkmate; the opening remains in progress; the illegal pawn leap is denied without changing the board.</p>
2
+ <link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CupVK4TM.css"></head> <body> <header class="studio__bar" data-astro-cid-mw7aashj> <div class="studio__bar-inner" data-astro-cid-mw7aashj> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio" data-astro-cid-mw7aashj>Pyric</a> <nav class="studio__nav" aria-label="Studio tabs" data-astro-cid-mw7aashj> <a class="studio__nav-tab" href="/__pyric/ui/" data-astro-cid-mw7aashj> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore" data-astro-cid-mw7aashj> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth" data-astro-cid-mw7aashj> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb" data-astro-cid-mw7aashj> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage" data-astro-cid-mw7aashj> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic" data-astro-cid-mw7aashj> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings" data-astro-cid-mw7aashj> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page" data-astro-cid-mw7aashj> Docs </a> </nav> </div> </header> <div class="docs-shell docs-shell--example" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug" open> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main doc-main--example" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/">Secure &amp; debug</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <a href="#nav-section-secure-debug-examples">Examples</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">Chess showcase</span> </li> </ol> </nav> <div class="example-doc-page" data-astro-cid-ghke3xma> <header class="example-header" data-astro-cid-3f5pqdpq> <p class="example-meta" data-astro-cid-sluz6xkv="true">Firestore Security Rules · Isolated browser sandbox</p> <h1 data-astro-cid-3f5pqdpq>Play chess against Security Rules</h1> <div data-astro-cid-3f5pqdpq>Move a piece; Pyric commits the new board or denies the write.</div> </header> <div class="example-stage is-showcase" data-astro-cid-xgvwrve7> <iframe title="Play chess against Security Rules" src="/__pyric/ui/examples/chess/" sandbox="allow-scripts allow-same-origin" scrolling="no" data-example-frame data-example-id="chess" data-min-height="560" data-astro-cid-xgvwrve7></iframe> </div> <script type="module">const i=t=>{if(t.dataset.sizingInstalled==="true")return;t.dataset.sizingInstalled="true";let n;const o=()=>{const e=t.contentDocument;if(!e)return;const s=Math.max(Number(t.dataset.minHeight??0),e.documentElement.scrollHeight,e.body?.scrollHeight??0);t.style.height=`${s}px`};t.addEventListener("load",()=>{n?.disconnect();const e=t.contentDocument;e&&(n=new ResizeObserver(o),n.observe(e.documentElement),e.body&&n.observe(e.body),o())})};document.querySelectorAll("[data-example-frame]").forEach(i);</script> <article class="prose example-explanation" data-astro-cid-ghke3xma> <h2 id="try-the-board">Try the board</h2>
3
+ <p>Choose a piece and its destination. <code>e2 → e4</code> is allowed. <code>e2 → e5</code> is denied and leaves the board unchanged. Switch the identity to see turn ownership enforced.</p>
4
+ <p>Choose a scenario to run a complete sequence through the Rules. Fool’s Mate and Scholar’s Mate end in checkmate. The opening remains in progress. The illegal pawn leap is denied without changing the board.</p>
5
5
  <h2 id="a-move-is-a-firestore-write">A move is a Firestore write</h2>
6
6
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>move → proposed Firestore document → Security Rules → commit or deny → next board</span></span></code></pre>
7
7
  <p>Each game is one Firestore document. A move proposes its next state: one square is emptied, another receives the piece, the turn changes, and the move count increases.</p>
8
- <p>Pyric evaluates that write against Firestore Security Rules in the browser. An allowed write changes the document and the board. A denied write changes neither.</p>
9
- <h2 id="keep-the-rules-focused-on-chess">Keep the Rules focused on chess</h2>
8
+ <p>Pyric evaluates that write against Firestore Security Rules in the browser. An allowed write changes the document and the board. When the Rules deny a write, the document and board stay unchanged.</p>
9
+ <h2 id="why-the-rules-look-like-this">Why the Rules look like this</h2>
10
+ <p>Firestore Security Rules cannot loop over the pieces on a chessboard. A request also has limits on expressions, function calls, and document reads. These constraints determine how the chess Rules are structured.</p>
11
+ <p>Movement geometry lives in a read-only Firestore document, where the Rules can look up valid destinations and the squares between them. Check detection names each opposing piece explicitly. Each move type starts in a separate branch so unrelated checks can stop early.</p>
12
+ <h2 id="look-up-the-available-helpers">Look up the available helpers</h2>
10
13
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="rules"><code><span class="line"><span style="color:#C678DD">rules_version</span><span style="color:#ABB2BF"> = </span><span style="color:#98C379">'2+modules'</span><span style="color:#ABB2BF">;</span></span>
11
14
  <span class="line"></span>
12
15
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isAuthenticated } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'auth'</span><span style="color:#ABB2BF">;</span></span>
13
16
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { validSimpleMove } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'geometry'</span><span style="color:#ABB2BF">;</span></span>
14
17
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isPlaying, moveIncremented, participantsUnchanged } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'state'</span><span style="color:#ABB2BF">;</span></span>
15
18
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isMyTurn, turnFlipped } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'turns'</span><span style="color:#ABB2BF">;</span></span></code></pre>
16
- <p><code>2+modules</code> is Pyric’s modular Rules format. Pyric resolves its imports into ordinary version 2 Rules before evaluation or deployment.</p>
17
- <p>The Standard Library modules handle checks that are useful beyond chess: authentication, participants, turns, move counts, and movement across a grid. The remaining Rules can concentrate on chess-specific behavior such as blocked paths, captures, castling, and king safety.</p>
18
- <p>The board’s geometry lives in a read-only Firestore document. <code>validSimpleMove(cfg())</code> uses that data to check whether a piece can travel from one square to another. This turns movement into lookups that the Rules language can evaluate.</p>
19
- <h2 id="stop-unrelated-rules-early">Stop unrelated Rules early</h2>
19
+ <p>Before using a helper, an agent can ask <code>firestore_rules_stdlib_list</code> and <code>firestore_rules_stdlib_get</code> for its exact name, arguments, and examples. The imports above come from that library. <code>firestore_resolve_modules</code> then turns them into ordinary version 2 Rules.</p>
20
+ <p>The shared helpers cover authentication, participants, turns, move counts, and movement across a grid. The functions left in this file deal with chess: blocked paths, captures, castling, and king safety.</p>
21
+ <h2 id="route-each-move-to-one-branch">Route each move to one branch</h2>
22
+ <p>Before writing the proposed game document, the board labels each available move from the piece and its destination:</p>
23
+ <div class="table-scroll">
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <table><thead><tr><th>Piece and destination</th><th><code>moveType</code></th></tr></thead><tbody><tr><td>Non-pawn moving to an empty square</td><td><code>normal</code></td></tr><tr><td>Non-pawn moving to an occupied square</td><td><code>capture</code></td></tr><tr><td>Pawn moving one square to an empty square</td><td><code>pawn_forward</code></td></tr><tr><td>Pawn moving two squares to an empty square</td><td><code>double_pawn</code></td></tr><tr><td>Pawn moving to an occupied square</td><td><code>pawn_capture</code></td></tr></tbody></table></div>
53
+ <p>The board stores the label in the proposed <code>/chess-v2/{gameId}</code> document. The matching Rules branch then checks whether the move is legal. In the Rules, <code>resource.data</code> is the current game and <code>request.resource.data</code> is that proposed next game.</p>
54
+ <p>The <code>allow update</code> clauses inside this match block are alternatives. Firestore allows the update when any one of them returns <code>true</code>. Because a proposed document has one <code>moveType</code>, only its matching branch can get past the first comparison.</p>
20
55
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="rules"><code><span class="line"><span style="color:#C678DD">allow</span><span style="color:#61AFEF"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveType == </span><span style="color:#98C379">'normal'</span></span>
21
- <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove() &#x26;&#x26; myKingSafe();</span></span>
56
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.capturedPiece == </span><span style="color:#98C379">''</span></span>
57
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.status == </span><span style="color:#98C379">'playing'</span></span>
58
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove()</span></span>
59
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveTo] == </span><span style="color:#98C379">''</span></span>
60
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; pieceMovedCorrectly() &#x26;&#x26; myKingSafe();</span></span>
22
61
  <span class="line"></span>
23
62
  <span class="line"><span style="color:#C678DD">allow</span><span style="color:#61AFEF"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveType == </span><span style="color:#98C379">'capture'</span></span>
24
- <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove() &#x26;&#x26; captureValid() &#x26;&#x26; myKingSafe();</span></span></code></pre>
25
- <p>Firestore limits how much work a Rules evaluation may perform. Each move type starts with a different value, so only the matching branch continues into the expensive chess checks. Pyric’s linter checks these limits locally instead of waiting for a deployment to expose them.</p>
26
- <h2 id="checkmate-is-a-result-not-a-trusted-claim">Checkmate is a result, not a trusted claim</h2>
63
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.capturedPiece != </span><span style="color:#98C379">''</span></span>
64
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.status == </span><span style="color:#98C379">'playing'</span></span>
65
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove()</span></span>
66
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; captureValid() &#x26;&#x26; pieceMovedCorrectly() &#x26;&#x26; myKingSafe();</span></span></code></pre>
67
+ <p>The <code>normal</code> branch requires an empty destination and no captured piece. The <code>capture</code> branch requires a captured piece, and <code>captureValid()</code> checks that the proposed document removes it. Both branches check the player and turn, the piece’s movement, the changed board fields, and king safety. Pawn moves have separate branches.</p>
68
+ <p>The first comparison in each branch is deliberately cheap. A capture skips the normal-move checks, and a normal move skips the capture checks. <code>firestore_lint_rules</code> warns the agent when branches share a gate and may waste the evaluation budget, as well as when a branch calls too many functions or reads too many documents.</p>
69
+ <h2 id="derive-checkmate-from-the-board">Derive checkmate from the board</h2>
27
70
  <p>Security Rules decide whether a move may be stored. After an allowed move commits, the browser checks the resulting board. It reports checkmate only when the king is attacked and no legal move, capture, block, king escape, or en passant response removes the attack.</p>
28
- <p>There is no client-authored <code>checkmate</code> move for the Rules to trust. The result is derived from the board that the Rules already accepted.</p>
29
- <h2 id="test-the-same-boundaries-before-production">Test the same boundaries before production</h2>
30
- <p>The local suite covers allowed and denied geometry, blocked paths, captures, pins, check, turn ownership, resignation, and checkmate. It runs against the same resolved Rules as the board.</p>
31
- <p>Pyric is a development mirror, not Firebase production. Before shipping a game or any Rules-heavy application, run its important cases against a Firebase project too.</p> </article> <section class="example-rules" data-astro-cid-ghke3xma> <h2 data-astro-cid-ghke3xma>Security Rules</h2> <p data-astro-cid-ghke3xma>The board uses the modular Rules below. Pyric resolves the Standard Library imports into ordinary version 2 Rules before the sandbox evaluates each move.</p> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value=="object"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event("astro:visible"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="Z2rxbNJ" prefix="r1" component-url="/__pyric/ui/_astro/chess-source-explorer.C5k9c5yK.js" component-export="ChessSourceExplorer" renderer-url="/__pyric/ui/_astro/client.D2ORs4B-.js" props="{&quot;data-astro-cid-ghke3xma&quot;:[0,true]}" ssr client="visible" opts="{&quot;name&quot;:&quot;ChessSourceExplorer&quot;,&quot;value&quot;:true}" await-children><section class="source-explorer" aria-label="Chess Security Rules"><div class="source-toolbar"><strong>Security Rules</strong><button type="button" class="copy-source">Copy source</button></div><pre><code>rules_version = &#x27;2+modules&#x27;;
71
+ <p>The write contains the move and the next board state. After it commits, the browser derives checkmate from that board.</p>
72
+ <h2 id="test-specific-moves">Test specific moves</h2>
73
+ <p>After changing the Rules, the agent uses <code>firestore_simulate_rules</code> to try specific moves with a player and a board state. Stateful sandbox sessions run longer sequences. If a move is denied unexpectedly, <code>sandbox_inspect</code> shows the request, identity, active Rules, and denial.</p>
74
+ <p>The local suite covers allowed and denied geometry, blocked paths, captures, pins, check, turn ownership, resignation, and checkmate. It also checks that a rejected move leaves the Firestore document unchanged.</p>
75
+ <p>These checks happen in Pyric’s local development mirror. Important cases also run against a Firebase project before shipping.</p> </article> <section class="example-rules" data-astro-cid-ghke3xma> <h2 data-astro-cid-ghke3xma>Full Security Rules</h2> <p data-astro-cid-ghke3xma>These are the Rules running the board above. Look for the imports at the top, the separate <code data-astro-cid-ghke3xma>moveType</code> gates, and the explicit king-safety checks.</p> <section class="source-explorer" aria-label="Chess Security Rules" data-source="rules_version = '2+modules';
32
76
 
33
- import { isAuthenticated } from &#x27;auth&#x27;;
34
- import { validSimpleMove } from &#x27;geometry&#x27;;
35
- import { isPlaying, moveIncremented, participantsUnchanged } from &#x27;state&#x27;;
36
- import { isMyTurn, turnFlipped } from &#x27;turns&#x27;;
77
+ import { isAuthenticated } from 'auth';
78
+ import { validSimpleMove } from 'geometry';
79
+ import { isPlaying, moveIncremented, participantsUnchanged } from 'state';
80
+ import { isMyTurn, turnFlipped } from 'turns';
37
81
 
38
82
  service cloud.firestore {
39
83
  match /databases/{database}/documents {
@@ -44,15 +88,15 @@ service cloud.firestore {
44
88
 
45
89
  function isOwnPiece() {
46
90
  let piece = resource.data[request.resource.data.moveFrom];
47
- return (resource.data.currentTurn == &#x27;host&#x27;
48
- &amp;&amp; (piece == &#x27;K&#x27; || piece == &#x27;Q&#x27; || piece == &#x27;R&#x27; || piece == &#x27;B&#x27; || piece == &#x27;N&#x27; || piece == &#x27;P&#x27;))
49
- || (resource.data.currentTurn == &#x27;guest&#x27;
50
- &amp;&amp; (piece == &#x27;k&#x27; || piece == &#x27;q&#x27; || piece == &#x27;r&#x27; || piece == &#x27;b&#x27; || piece == &#x27;n&#x27; || piece == &#x27;p&#x27;));
91
+ return (resource.data.currentTurn == 'host'
92
+ &#38;&#38; (piece == 'K' || piece == 'Q' || piece == 'R' || piece == 'B' || piece == 'N' || piece == 'P'))
93
+ || (resource.data.currentTurn == 'guest'
94
+ &#38;&#38; (piece == 'k' || piece == 'q' || piece == 'r' || piece == 'b' || piece == 'n' || piece == 'p'));
51
95
  }
52
96
  function baseMoveChecks() {
53
- return isAuthenticated() &amp;&amp; isPlaying()
54
- &amp;&amp; isMyTurn() &amp;&amp; turnFlipped() &amp;&amp; isOwnPiece()
55
- &amp;&amp; moveIncremented() &amp;&amp; participantsUnchanged();
97
+ return isAuthenticated() &#38;&#38; isPlaying()
98
+ &#38;&#38; isMyTurn() &#38;&#38; turnFlipped() &#38;&#38; isOwnPiece()
99
+ &#38;&#38; moveIncremented() &#38;&#38; participantsUnchanged();
56
100
  }
57
101
 
58
102
  function validPieceMove() {
@@ -61,324 +105,676 @@ service cloud.firestore {
61
105
  let piece = resource.data[mf];
62
106
  let p = cfg().paths[mf][mt];
63
107
  return validSimpleMove(cfg())
64
- &amp;&amp; (cfg().pieceCategory[piece] == &#x27;jump&#x27;
65
- || ((p.len &lt; 1 || resource.data[p.c0] == &#x27;&#x27;)
66
- &amp;&amp; (p.len &lt; 2 || resource.data[p.c1] == &#x27;&#x27;)
67
- &amp;&amp; (p.len &lt; 3 || resource.data[p.c2] == &#x27;&#x27;)
68
- &amp;&amp; (p.len &lt; 4 || resource.data[p.c3] == &#x27;&#x27;)
69
- &amp;&amp; (p.len &lt; 5 || resource.data[p.c4] == &#x27;&#x27;)
70
- &amp;&amp; (p.len &lt; 6 || resource.data[p.c5] == &#x27;&#x27;)));
108
+ &#38;&#38; (cfg().pieceCategory[piece] == 'jump'
109
+ || ((p.len < 1 || resource.data[p.c0] == '')
110
+ &#38;&#38; (p.len < 2 || resource.data[p.c1] == '')
111
+ &#38;&#38; (p.len < 3 || resource.data[p.c2] == '')
112
+ &#38;&#38; (p.len < 4 || resource.data[p.c3] == '')
113
+ &#38;&#38; (p.len < 5 || resource.data[p.c4] == '')
114
+ &#38;&#38; (p.len < 6 || resource.data[p.c5] == '')));
71
115
  }
72
116
  function validPawnForward() {
73
117
  let mf = request.resource.data.moveFrom;
74
118
  let mt = request.resource.data.moveTo;
75
119
  let piece = resource.data[mf];
76
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;) &amp;&amp; mt in cfg().pawnForward[piece][mf] &amp;&amp; resource.data[mt] == &#x27;&#x27;;
120
+ return (piece == 'P' || piece == 'p') &#38;&#38; mt in cfg().pawnForward[piece][mf] &#38;&#38; resource.data[mt] == '';
77
121
  }
78
122
  function validPawnDouble() {
79
123
  let mf = request.resource.data.moveFrom;
80
124
  let mt = request.resource.data.moveTo;
81
125
  let piece = resource.data[mf];
82
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;)
83
- &amp;&amp; mf in cfg().pawnDouble[piece]
84
- &amp;&amp; cfg().pawnDouble[piece][mf].to == mt
85
- &amp;&amp; resource.data[mt] == &#x27;&#x27;
86
- &amp;&amp; resource.data[cfg().pawnDouble[piece][mf].between] == &#x27;&#x27;;
126
+ return (piece == 'P' || piece == 'p')
127
+ &#38;&#38; mf in cfg().pawnDouble[piece]
128
+ &#38;&#38; cfg().pawnDouble[piece][mf].to == mt
129
+ &#38;&#38; resource.data[mt] == ''
130
+ &#38;&#38; resource.data[cfg().pawnDouble[piece][mf].between] == '';
87
131
  }
88
132
  function validPawnCapture() {
89
133
  let mf = request.resource.data.moveFrom;
90
134
  let mt = request.resource.data.moveTo;
91
135
  let piece = resource.data[mf];
92
136
  let target = resource.data[mt];
93
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;)
94
- &amp;&amp; mt in cfg().pawnAttacks[piece][mf]
95
- &amp;&amp; target != &#x27;&#x27;
96
- &amp;&amp; ((piece == &#x27;P&#x27; &amp;&amp; (target == &#x27;k&#x27; || target == &#x27;q&#x27; || target == &#x27;r&#x27; || target == &#x27;b&#x27; || target == &#x27;n&#x27; || target == &#x27;p&#x27;))
97
- || (piece == &#x27;p&#x27; &amp;&amp; (target == &#x27;K&#x27; || target == &#x27;Q&#x27; || target == &#x27;R&#x27; || target == &#x27;B&#x27; || target == &#x27;N&#x27; || target == &#x27;P&#x27;)));
137
+ return (piece == 'P' || piece == 'p')
138
+ &#38;&#38; mt in cfg().pawnAttacks[piece][mf]
139
+ &#38;&#38; target != ''
140
+ &#38;&#38; ((piece == 'P' &#38;&#38; (target == 'k' || target == 'q' || target == 'r' || target == 'b' || target == 'n' || target == 'p'))
141
+ || (piece == 'p' &#38;&#38; (target == 'K' || target == 'Q' || target == 'R' || target == 'B' || target == 'N' || target == 'P')));
98
142
  }
99
143
  function validPromotion() {
100
144
  let mt = request.resource.data.moveTo;
101
145
  let piece = resource.data[request.resource.data.moveFrom];
102
146
  let pt = request.resource.data.promotedTo;
103
- return request.resource.data.moveType == &#x27;promotion&#x27;
104
- &amp;&amp; ((piece == &#x27;P&#x27; &amp;&amp; mt &gt;= &#x27;a8&#x27; &amp;&amp; mt &lt;= &#x27;h8&#x27; &amp;&amp; (pt == &#x27;Q&#x27; || pt == &#x27;R&#x27; || pt == &#x27;B&#x27; || pt == &#x27;N&#x27;))
105
- || (piece == &#x27;p&#x27; &amp;&amp; mt &gt;= &#x27;a1&#x27; &amp;&amp; mt &lt;= &#x27;h1&#x27; &amp;&amp; (pt == &#x27;q&#x27; || pt == &#x27;r&#x27; || pt == &#x27;b&#x27; || pt == &#x27;n&#x27;)));
147
+ return request.resource.data.moveType == 'promotion'
148
+ &#38;&#38; ((piece == 'P' &#38;&#38; mt >= 'a8' &#38;&#38; mt <= 'h8' &#38;&#38; (pt == 'Q' || pt == 'R' || pt == 'B' || pt == 'N'))
149
+ || (piece == 'p' &#38;&#38; mt >= 'a1' &#38;&#38; mt <= 'h1' &#38;&#38; (pt == 'q' || pt == 'r' || pt == 'b' || pt == 'n')));
106
150
  }
107
151
  function pieceMovedCorrectly() {
108
152
  let mf = request.resource.data.moveFrom;
109
153
  let mt = request.resource.data.moveTo;
110
154
  let piece = resource.data[mf];
111
- return request.resource.data[mf] == &#x27;&#x27;
112
- &amp;&amp; (request.resource.data.moveType != &#x27;promotion&#x27;
155
+ return request.resource.data[mf] == ''
156
+ &#38;&#38; (request.resource.data.moveType != 'promotion'
113
157
  ? request.resource.data[mt] == piece
114
158
  : request.resource.data[mt] == request.resource.data.promotedTo)
115
- &amp;&amp; resource.data[request.resource.data.movedPiece] == mf
116
- &amp;&amp; request.resource.data[request.resource.data.movedPiece] == mt;
159
+ &#38;&#38; resource.data[request.resource.data.movedPiece] == mf
160
+ &#38;&#38; request.resource.data[request.resource.data.movedPiece] == mt;
117
161
  }
118
162
  function captureValid() {
119
163
  let cp = request.resource.data.capturedPiece;
120
- return cp != &#x27;&#x27;
121
- &amp;&amp; resource.data[cp] == request.resource.data.moveTo
122
- &amp;&amp; request.resource.data[cp] == &#x27;&#x27;;
164
+ return cp != ''
165
+ &#38;&#38; resource.data[cp] == request.resource.data.moveTo
166
+ &#38;&#38; request.resource.data[cp] == '';
123
167
  }
124
168
  function validEnPassant() {
125
169
  let mf = request.resource.data.moveFrom;
126
170
  let mt = request.resource.data.moveTo;
127
171
  let piece = resource.data[mf];
128
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;)
129
- &amp;&amp; mt in cfg().pawnAttacks[piece][mf]
130
- &amp;&amp; resource.data[mt] == &#x27;&#x27;
131
- &amp;&amp; resource.data.lastDoublePawn == mt;
172
+ return (piece == 'P' || piece == 'p')
173
+ &#38;&#38; mt in cfg().pawnAttacks[piece][mf]
174
+ &#38;&#38; resource.data[mt] == ''
175
+ &#38;&#38; resource.data.lastDoublePawn == mt;
132
176
  }
133
177
  function validCastleKingside() {
134
178
  let turn = resource.data.currentTurn;
135
179
  let c = cfg().castling;
136
- let castle = turn == &#x27;host&#x27; ? c.wk : c.bk;
137
- let kingMoved = turn == &#x27;host&#x27; ? resource.data.hp_K_moved : resource.data.gp_k_moved;
138
- let rookMoved = turn == &#x27;host&#x27; ? resource.data.hp_R2_moved : resource.data.gp_r2_moved;
139
- return !kingMoved &amp;&amp; !rookMoved
140
- &amp;&amp; request.resource.data.moveFrom == castle.kingFrom
141
- &amp;&amp; request.resource.data.moveTo == castle.kingTo
142
- &amp;&amp; resource.data[castle.between[0]] == &#x27;&#x27;
143
- &amp;&amp; resource.data[castle.between[1]] == &#x27;&#x27;;
180
+ let castle = turn == 'host' ? c.wk : c.bk;
181
+ let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
182
+ let rookMoved = turn == 'host' ? resource.data.hp_R2_moved : resource.data.gp_r2_moved;
183
+ return !kingMoved &#38;&#38; !rookMoved
184
+ &#38;&#38; request.resource.data.moveFrom == castle.kingFrom
185
+ &#38;&#38; request.resource.data.moveTo == castle.kingTo
186
+ &#38;&#38; resource.data[castle.between[0]] == ''
187
+ &#38;&#38; resource.data[castle.between[1]] == '';
144
188
  }
145
189
  function validCastleQueenside() {
146
190
  let turn = resource.data.currentTurn;
147
191
  let c = cfg().castling;
148
- let castle = turn == &#x27;host&#x27; ? c.wq : c.bq;
149
- let kingMoved = turn == &#x27;host&#x27; ? resource.data.hp_K_moved : resource.data.gp_k_moved;
150
- let rookMoved = turn == &#x27;host&#x27; ? resource.data.hp_R1_moved : resource.data.gp_r1_moved;
151
- return !kingMoved &amp;&amp; !rookMoved
152
- &amp;&amp; request.resource.data.moveFrom == castle.kingFrom
153
- &amp;&amp; request.resource.data.moveTo == castle.kingTo
154
- &amp;&amp; resource.data[castle.between[0]] == &#x27;&#x27;
155
- &amp;&amp; resource.data[castle.between[1]] == &#x27;&#x27;
156
- &amp;&amp; resource.data[castle.between[2]] == &#x27;&#x27;;
192
+ let castle = turn == 'host' ? c.wq : c.bq;
193
+ let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
194
+ let rookMoved = turn == 'host' ? resource.data.hp_R1_moved : resource.data.gp_r1_moved;
195
+ return !kingMoved &#38;&#38; !rookMoved
196
+ &#38;&#38; request.resource.data.moveFrom == castle.kingFrom
197
+ &#38;&#38; request.resource.data.moveTo == castle.kingTo
198
+ &#38;&#38; resource.data[castle.between[0]] == ''
199
+ &#38;&#38; resource.data[castle.between[1]] == ''
200
+ &#38;&#38; resource.data[castle.between[2]] == '';
157
201
  }
158
202
 
159
203
  function hPC(cfg) {
160
204
  let b = request.resource.data;
161
205
  let ks = b.hp_K;
162
- return (b.gp_p1 != &#x27;&#x27; &amp;&amp; b[b.gp_p1] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p1]][b.gp_p1])
163
- || (b.gp_p2 != &#x27;&#x27; &amp;&amp; b[b.gp_p2] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p2]][b.gp_p2])
164
- || (b.gp_p3 != &#x27;&#x27; &amp;&amp; b[b.gp_p3] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p3]][b.gp_p3])
165
- || (b.gp_p4 != &#x27;&#x27; &amp;&amp; b[b.gp_p4] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p4]][b.gp_p4])
166
- || (b.gp_p5 != &#x27;&#x27; &amp;&amp; b[b.gp_p5] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p5]][b.gp_p5])
167
- || (b.gp_p6 != &#x27;&#x27; &amp;&amp; b[b.gp_p6] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p6]][b.gp_p6])
168
- || (b.gp_p7 != &#x27;&#x27; &amp;&amp; b[b.gp_p7] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p7]][b.gp_p7])
169
- || (b.gp_p8 != &#x27;&#x27; &amp;&amp; b[b.gp_p8] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p8]][b.gp_p8]);
206
+ return (b.gp_p1 != '' &#38;&#38; b[b.gp_p1] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p1]][b.gp_p1])
207
+ || (b.gp_p2 != '' &#38;&#38; b[b.gp_p2] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p2]][b.gp_p2])
208
+ || (b.gp_p3 != '' &#38;&#38; b[b.gp_p3] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p3]][b.gp_p3])
209
+ || (b.gp_p4 != '' &#38;&#38; b[b.gp_p4] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p4]][b.gp_p4])
210
+ || (b.gp_p5 != '' &#38;&#38; b[b.gp_p5] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p5]][b.gp_p5])
211
+ || (b.gp_p6 != '' &#38;&#38; b[b.gp_p6] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p6]][b.gp_p6])
212
+ || (b.gp_p7 != '' &#38;&#38; b[b.gp_p7] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p7]][b.gp_p7])
213
+ || (b.gp_p8 != '' &#38;&#38; b[b.gp_p8] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p8]][b.gp_p8]);
170
214
  }
171
215
  function hMC(cfg) {
172
216
  let b = request.resource.data;
173
217
  let ks = b.hp_K;
174
- return (b.gp_n1 != &#x27;&#x27; &amp;&amp; b[b.gp_n1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_n1]][b.gp_n1])
175
- || (b.gp_n2 != &#x27;&#x27; &amp;&amp; b[b.gp_n2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_n2]][b.gp_n2])
176
- || (b.gp_k != &#x27;&#x27; &amp;&amp; b[b.gp_k] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_k]][b.gp_k]);
218
+ return (b.gp_n1 != '' &#38;&#38; b[b.gp_n1] != '' &#38;&#38; ks in cfg.moves[b[b.gp_n1]][b.gp_n1])
219
+ || (b.gp_n2 != '' &#38;&#38; b[b.gp_n2] != '' &#38;&#38; ks in cfg.moves[b[b.gp_n2]][b.gp_n2])
220
+ || (b.gp_k != '' &#38;&#38; b[b.gp_k] != '' &#38;&#38; ks in cfg.moves[b[b.gp_k]][b.gp_k]);
177
221
  }
178
222
  function hSC(cfg) {
179
223
  let b = request.resource.data;
180
224
  let ks = b.hp_K;
181
- return (b.gp_q != &#x27;&#x27; &amp;&amp; b[b.gp_q] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_q]][b.gp_q]
182
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 1 || b[cfg.paths[b.gp_q][ks].c0] == &#x27;&#x27;)
183
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 2 || b[cfg.paths[b.gp_q][ks].c1] == &#x27;&#x27;)
184
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 3 || b[cfg.paths[b.gp_q][ks].c2] == &#x27;&#x27;)
185
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 4 || b[cfg.paths[b.gp_q][ks].c3] == &#x27;&#x27;)
186
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 5 || b[cfg.paths[b.gp_q][ks].c4] == &#x27;&#x27;))
187
- || (b.gp_r1 != &#x27;&#x27; &amp;&amp; b[b.gp_r1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_r1]][b.gp_r1]
188
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 1 || b[cfg.paths[b.gp_r1][ks].c0] == &#x27;&#x27;)
189
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 2 || b[cfg.paths[b.gp_r1][ks].c1] == &#x27;&#x27;)
190
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 3 || b[cfg.paths[b.gp_r1][ks].c2] == &#x27;&#x27;)
191
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 4 || b[cfg.paths[b.gp_r1][ks].c3] == &#x27;&#x27;)
192
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 5 || b[cfg.paths[b.gp_r1][ks].c4] == &#x27;&#x27;))
193
- || (b.gp_r2 != &#x27;&#x27; &amp;&amp; b[b.gp_r2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_r2]][b.gp_r2]
194
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 1 || b[cfg.paths[b.gp_r2][ks].c0] == &#x27;&#x27;)
195
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 2 || b[cfg.paths[b.gp_r2][ks].c1] == &#x27;&#x27;)
196
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 3 || b[cfg.paths[b.gp_r2][ks].c2] == &#x27;&#x27;)
197
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 4 || b[cfg.paths[b.gp_r2][ks].c3] == &#x27;&#x27;)
198
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 5 || b[cfg.paths[b.gp_r2][ks].c4] == &#x27;&#x27;))
199
- || (b.gp_b1 != &#x27;&#x27; &amp;&amp; b[b.gp_b1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_b1]][b.gp_b1]
200
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 1 || b[cfg.paths[b.gp_b1][ks].c0] == &#x27;&#x27;)
201
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 2 || b[cfg.paths[b.gp_b1][ks].c1] == &#x27;&#x27;)
202
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 3 || b[cfg.paths[b.gp_b1][ks].c2] == &#x27;&#x27;)
203
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 4 || b[cfg.paths[b.gp_b1][ks].c3] == &#x27;&#x27;)
204
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 5 || b[cfg.paths[b.gp_b1][ks].c4] == &#x27;&#x27;))
205
- || (b.gp_b2 != &#x27;&#x27; &amp;&amp; b[b.gp_b2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_b2]][b.gp_b2]
206
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 1 || b[cfg.paths[b.gp_b2][ks].c0] == &#x27;&#x27;)
207
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 2 || b[cfg.paths[b.gp_b2][ks].c1] == &#x27;&#x27;)
208
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 3 || b[cfg.paths[b.gp_b2][ks].c2] == &#x27;&#x27;)
209
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 4 || b[cfg.paths[b.gp_b2][ks].c3] == &#x27;&#x27;)
210
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 5 || b[cfg.paths[b.gp_b2][ks].c4] == &#x27;&#x27;));
225
+ return (b.gp_q != '' &#38;&#38; b[b.gp_q] != '' &#38;&#38; ks in cfg.moves[b[b.gp_q]][b.gp_q]
226
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 1 || b[cfg.paths[b.gp_q][ks].c0] == '')
227
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 2 || b[cfg.paths[b.gp_q][ks].c1] == '')
228
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 3 || b[cfg.paths[b.gp_q][ks].c2] == '')
229
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 4 || b[cfg.paths[b.gp_q][ks].c3] == '')
230
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 5 || b[cfg.paths[b.gp_q][ks].c4] == ''))
231
+ || (b.gp_r1 != '' &#38;&#38; b[b.gp_r1] != '' &#38;&#38; ks in cfg.moves[b[b.gp_r1]][b.gp_r1]
232
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 1 || b[cfg.paths[b.gp_r1][ks].c0] == '')
233
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 2 || b[cfg.paths[b.gp_r1][ks].c1] == '')
234
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 3 || b[cfg.paths[b.gp_r1][ks].c2] == '')
235
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 4 || b[cfg.paths[b.gp_r1][ks].c3] == '')
236
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 5 || b[cfg.paths[b.gp_r1][ks].c4] == ''))
237
+ || (b.gp_r2 != '' &#38;&#38; b[b.gp_r2] != '' &#38;&#38; ks in cfg.moves[b[b.gp_r2]][b.gp_r2]
238
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 1 || b[cfg.paths[b.gp_r2][ks].c0] == '')
239
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 2 || b[cfg.paths[b.gp_r2][ks].c1] == '')
240
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 3 || b[cfg.paths[b.gp_r2][ks].c2] == '')
241
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 4 || b[cfg.paths[b.gp_r2][ks].c3] == '')
242
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 5 || b[cfg.paths[b.gp_r2][ks].c4] == ''))
243
+ || (b.gp_b1 != '' &#38;&#38; b[b.gp_b1] != '' &#38;&#38; ks in cfg.moves[b[b.gp_b1]][b.gp_b1]
244
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 1 || b[cfg.paths[b.gp_b1][ks].c0] == '')
245
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 2 || b[cfg.paths[b.gp_b1][ks].c1] == '')
246
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 3 || b[cfg.paths[b.gp_b1][ks].c2] == '')
247
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 4 || b[cfg.paths[b.gp_b1][ks].c3] == '')
248
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 5 || b[cfg.paths[b.gp_b1][ks].c4] == ''))
249
+ || (b.gp_b2 != '' &#38;&#38; b[b.gp_b2] != '' &#38;&#38; ks in cfg.moves[b[b.gp_b2]][b.gp_b2]
250
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 1 || b[cfg.paths[b.gp_b2][ks].c0] == '')
251
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 2 || b[cfg.paths[b.gp_b2][ks].c1] == '')
252
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 3 || b[cfg.paths[b.gp_b2][ks].c2] == '')
253
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 4 || b[cfg.paths[b.gp_b2][ks].c3] == '')
254
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 5 || b[cfg.paths[b.gp_b2][ks].c4] == ''));
211
255
  }
212
256
  function gPC(cfg) {
213
257
  let b = request.resource.data;
214
258
  let ks = b.gp_k;
215
- return (b.hp_P1 != &#x27;&#x27; &amp;&amp; b[b.hp_P1] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P1]][b.hp_P1])
216
- || (b.hp_P2 != &#x27;&#x27; &amp;&amp; b[b.hp_P2] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P2]][b.hp_P2])
217
- || (b.hp_P3 != &#x27;&#x27; &amp;&amp; b[b.hp_P3] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P3]][b.hp_P3])
218
- || (b.hp_P4 != &#x27;&#x27; &amp;&amp; b[b.hp_P4] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P4]][b.hp_P4])
219
- || (b.hp_P5 != &#x27;&#x27; &amp;&amp; b[b.hp_P5] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P5]][b.hp_P5])
220
- || (b.hp_P6 != &#x27;&#x27; &amp;&amp; b[b.hp_P6] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P6]][b.hp_P6])
221
- || (b.hp_P7 != &#x27;&#x27; &amp;&amp; b[b.hp_P7] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P7]][b.hp_P7])
222
- || (b.hp_P8 != &#x27;&#x27; &amp;&amp; b[b.hp_P8] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P8]][b.hp_P8]);
259
+ return (b.hp_P1 != '' &#38;&#38; b[b.hp_P1] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P1]][b.hp_P1])
260
+ || (b.hp_P2 != '' &#38;&#38; b[b.hp_P2] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P2]][b.hp_P2])
261
+ || (b.hp_P3 != '' &#38;&#38; b[b.hp_P3] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P3]][b.hp_P3])
262
+ || (b.hp_P4 != '' &#38;&#38; b[b.hp_P4] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P4]][b.hp_P4])
263
+ || (b.hp_P5 != '' &#38;&#38; b[b.hp_P5] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P5]][b.hp_P5])
264
+ || (b.hp_P6 != '' &#38;&#38; b[b.hp_P6] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P6]][b.hp_P6])
265
+ || (b.hp_P7 != '' &#38;&#38; b[b.hp_P7] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P7]][b.hp_P7])
266
+ || (b.hp_P8 != '' &#38;&#38; b[b.hp_P8] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P8]][b.hp_P8]);
223
267
  }
224
268
  function gMC(cfg) {
225
269
  let b = request.resource.data;
226
270
  let ks = b.gp_k;
227
- return (b.hp_N1 != &#x27;&#x27; &amp;&amp; b[b.hp_N1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_N1]][b.hp_N1])
228
- || (b.hp_N2 != &#x27;&#x27; &amp;&amp; b[b.hp_N2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_N2]][b.hp_N2])
229
- || (b.hp_K != &#x27;&#x27; &amp;&amp; b[b.hp_K] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_K]][b.hp_K]);
271
+ return (b.hp_N1 != '' &#38;&#38; b[b.hp_N1] != '' &#38;&#38; ks in cfg.moves[b[b.hp_N1]][b.hp_N1])
272
+ || (b.hp_N2 != '' &#38;&#38; b[b.hp_N2] != '' &#38;&#38; ks in cfg.moves[b[b.hp_N2]][b.hp_N2])
273
+ || (b.hp_K != '' &#38;&#38; b[b.hp_K] != '' &#38;&#38; ks in cfg.moves[b[b.hp_K]][b.hp_K]);
230
274
  }
231
275
  function gSC(cfg) {
232
276
  let b = request.resource.data;
233
277
  let ks = b.gp_k;
234
- return (b.hp_Q != &#x27;&#x27; &amp;&amp; b[b.hp_Q] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_Q]][b.hp_Q]
235
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 1 || b[cfg.paths[b.hp_Q][ks].c0] == &#x27;&#x27;)
236
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 2 || b[cfg.paths[b.hp_Q][ks].c1] == &#x27;&#x27;)
237
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 3 || b[cfg.paths[b.hp_Q][ks].c2] == &#x27;&#x27;)
238
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 4 || b[cfg.paths[b.hp_Q][ks].c3] == &#x27;&#x27;)
239
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 5 || b[cfg.paths[b.hp_Q][ks].c4] == &#x27;&#x27;))
240
- || (b.hp_R1 != &#x27;&#x27; &amp;&amp; b[b.hp_R1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_R1]][b.hp_R1]
241
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 1 || b[cfg.paths[b.hp_R1][ks].c0] == &#x27;&#x27;)
242
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 2 || b[cfg.paths[b.hp_R1][ks].c1] == &#x27;&#x27;)
243
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 3 || b[cfg.paths[b.hp_R1][ks].c2] == &#x27;&#x27;)
244
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 4 || b[cfg.paths[b.hp_R1][ks].c3] == &#x27;&#x27;)
245
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 5 || b[cfg.paths[b.hp_R1][ks].c4] == &#x27;&#x27;))
246
- || (b.hp_R2 != &#x27;&#x27; &amp;&amp; b[b.hp_R2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_R2]][b.hp_R2]
247
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 1 || b[cfg.paths[b.hp_R2][ks].c0] == &#x27;&#x27;)
248
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 2 || b[cfg.paths[b.hp_R2][ks].c1] == &#x27;&#x27;)
249
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 3 || b[cfg.paths[b.hp_R2][ks].c2] == &#x27;&#x27;)
250
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 4 || b[cfg.paths[b.hp_R2][ks].c3] == &#x27;&#x27;)
251
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 5 || b[cfg.paths[b.hp_R2][ks].c4] == &#x27;&#x27;))
252
- || (b.hp_B1 != &#x27;&#x27; &amp;&amp; b[b.hp_B1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_B1]][b.hp_B1]
253
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 1 || b[cfg.paths[b.hp_B1][ks].c0] == &#x27;&#x27;)
254
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 2 || b[cfg.paths[b.hp_B1][ks].c1] == &#x27;&#x27;)
255
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 3 || b[cfg.paths[b.hp_B1][ks].c2] == &#x27;&#x27;)
256
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 4 || b[cfg.paths[b.hp_B1][ks].c3] == &#x27;&#x27;)
257
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 5 || b[cfg.paths[b.hp_B1][ks].c4] == &#x27;&#x27;))
258
- || (b.hp_B2 != &#x27;&#x27; &amp;&amp; b[b.hp_B2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_B2]][b.hp_B2]
259
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 1 || b[cfg.paths[b.hp_B2][ks].c0] == &#x27;&#x27;)
260
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 2 || b[cfg.paths[b.hp_B2][ks].c1] == &#x27;&#x27;)
261
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 3 || b[cfg.paths[b.hp_B2][ks].c2] == &#x27;&#x27;)
262
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 4 || b[cfg.paths[b.hp_B2][ks].c3] == &#x27;&#x27;)
263
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 5 || b[cfg.paths[b.hp_B2][ks].c4] == &#x27;&#x27;));
278
+ return (b.hp_Q != '' &#38;&#38; b[b.hp_Q] != '' &#38;&#38; ks in cfg.moves[b[b.hp_Q]][b.hp_Q]
279
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 1 || b[cfg.paths[b.hp_Q][ks].c0] == '')
280
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 2 || b[cfg.paths[b.hp_Q][ks].c1] == '')
281
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 3 || b[cfg.paths[b.hp_Q][ks].c2] == '')
282
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 4 || b[cfg.paths[b.hp_Q][ks].c3] == '')
283
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 5 || b[cfg.paths[b.hp_Q][ks].c4] == ''))
284
+ || (b.hp_R1 != '' &#38;&#38; b[b.hp_R1] != '' &#38;&#38; ks in cfg.moves[b[b.hp_R1]][b.hp_R1]
285
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 1 || b[cfg.paths[b.hp_R1][ks].c0] == '')
286
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 2 || b[cfg.paths[b.hp_R1][ks].c1] == '')
287
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 3 || b[cfg.paths[b.hp_R1][ks].c2] == '')
288
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 4 || b[cfg.paths[b.hp_R1][ks].c3] == '')
289
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 5 || b[cfg.paths[b.hp_R1][ks].c4] == ''))
290
+ || (b.hp_R2 != '' &#38;&#38; b[b.hp_R2] != '' &#38;&#38; ks in cfg.moves[b[b.hp_R2]][b.hp_R2]
291
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 1 || b[cfg.paths[b.hp_R2][ks].c0] == '')
292
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 2 || b[cfg.paths[b.hp_R2][ks].c1] == '')
293
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 3 || b[cfg.paths[b.hp_R2][ks].c2] == '')
294
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 4 || b[cfg.paths[b.hp_R2][ks].c3] == '')
295
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 5 || b[cfg.paths[b.hp_R2][ks].c4] == ''))
296
+ || (b.hp_B1 != '' &#38;&#38; b[b.hp_B1] != '' &#38;&#38; ks in cfg.moves[b[b.hp_B1]][b.hp_B1]
297
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 1 || b[cfg.paths[b.hp_B1][ks].c0] == '')
298
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 2 || b[cfg.paths[b.hp_B1][ks].c1] == '')
299
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 3 || b[cfg.paths[b.hp_B1][ks].c2] == '')
300
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 4 || b[cfg.paths[b.hp_B1][ks].c3] == '')
301
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 5 || b[cfg.paths[b.hp_B1][ks].c4] == ''))
302
+ || (b.hp_B2 != '' &#38;&#38; b[b.hp_B2] != '' &#38;&#38; ks in cfg.moves[b[b.hp_B2]][b.hp_B2]
303
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 1 || b[cfg.paths[b.hp_B2][ks].c0] == '')
304
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 2 || b[cfg.paths[b.hp_B2][ks].c1] == '')
305
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 3 || b[cfg.paths[b.hp_B2][ks].c2] == '')
306
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 4 || b[cfg.paths[b.hp_B2][ks].c3] == '')
307
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 5 || b[cfg.paths[b.hp_B2][ks].c4] == ''));
264
308
  }
265
309
 
266
310
  function myKingSafe() {
267
311
  let c = cfg();
268
- return (resource.data.currentTurn == &#x27;host&#x27; &amp;&amp; !hPC(c) &amp;&amp; !hMC(c) &amp;&amp; !hSC(c))
269
- || (resource.data.currentTurn == &#x27;guest&#x27; &amp;&amp; !gPC(c) &amp;&amp; !gMC(c) &amp;&amp; !gSC(c));
312
+ return (resource.data.currentTurn == 'host' &#38;&#38; !hPC(c) &#38;&#38; !hMC(c) &#38;&#38; !hSC(c))
313
+ || (resource.data.currentTurn == 'guest' &#38;&#38; !gPC(c) &#38;&#38; !gMC(c) &#38;&#38; !gSC(c));
270
314
  }
271
315
  function opponentInCheck() {
272
316
  let c = cfg();
273
- return (resource.data.currentTurn == &#x27;host&#x27; &amp;&amp; (gPC(c) || gMC(c) || gSC(c)))
274
- || (resource.data.currentTurn == &#x27;guest&#x27; &amp;&amp; (hPC(c) || hMC(c) || hSC(c)));
317
+ return (resource.data.currentTurn == 'host' &#38;&#38; (gPC(c) || gMC(c) || gSC(c)))
318
+ || (resource.data.currentTurn == 'guest' &#38;&#38; (hPC(c) || hMC(c) || hSC(c)));
275
319
  }
276
320
 
277
321
  // ═══ Lobby ═══
278
322
  allow read: if request.auth != null;
279
323
  allow create: if request.auth != null
280
- &amp;&amp; request.resource.data.host == request.auth.uid
281
- &amp;&amp; request.resource.data.status == &#x27;waiting&#x27;
282
- &amp;&amp; d.a1 == &#x27;R&#x27;
283
- &amp;&amp; d.a2 == &#x27;P&#x27;
284
- &amp;&amp; d.a7 == &#x27;p&#x27;
285
- &amp;&amp; d.a8 == &#x27;r&#x27;
286
- &amp;&amp; d.b1 == &#x27;N&#x27;
287
- &amp;&amp; d.b2 == &#x27;P&#x27;
288
- &amp;&amp; d.b7 == &#x27;p&#x27;
289
- &amp;&amp; d.b8 == &#x27;n&#x27;
290
- &amp;&amp; d.c1 == &#x27;B&#x27;
291
- &amp;&amp; d.c2 == &#x27;P&#x27;
292
- &amp;&amp; d.c7 == &#x27;p&#x27;
293
- &amp;&amp; d.c8 == &#x27;b&#x27;
294
- &amp;&amp; d.d1 == &#x27;Q&#x27;
295
- &amp;&amp; d.d2 == &#x27;P&#x27;
296
- &amp;&amp; d.d7 == &#x27;p&#x27;
297
- &amp;&amp; d.d8 == &#x27;q&#x27;
298
- &amp;&amp; d.e1 == &#x27;K&#x27;
299
- &amp;&amp; d.e2 == &#x27;P&#x27;
300
- &amp;&amp; d.e7 == &#x27;p&#x27;
301
- &amp;&amp; d.e8 == &#x27;k&#x27;
302
- &amp;&amp; d.f1 == &#x27;B&#x27;
303
- &amp;&amp; d.f2 == &#x27;P&#x27;
304
- &amp;&amp; d.f7 == &#x27;p&#x27;
305
- &amp;&amp; d.f8 == &#x27;b&#x27;
306
- &amp;&amp; d.g1 == &#x27;N&#x27;
307
- &amp;&amp; d.g2 == &#x27;P&#x27;
308
- &amp;&amp; d.g7 == &#x27;p&#x27;
309
- &amp;&amp; d.g8 == &#x27;n&#x27;
310
- &amp;&amp; d.h1 == &#x27;R&#x27;
311
- &amp;&amp; d.h2 == &#x27;P&#x27;
312
- &amp;&amp; d.h7 == &#x27;p&#x27;
313
- &amp;&amp; d.h8 == &#x27;r&#x27;;
324
+ &#38;&#38; request.resource.data.host == request.auth.uid
325
+ &#38;&#38; request.resource.data.status == 'waiting'
326
+ &#38;&#38; d.a1 == 'R'
327
+ &#38;&#38; d.a2 == 'P'
328
+ &#38;&#38; d.a7 == 'p'
329
+ &#38;&#38; d.a8 == 'r'
330
+ &#38;&#38; d.b1 == 'N'
331
+ &#38;&#38; d.b2 == 'P'
332
+ &#38;&#38; d.b7 == 'p'
333
+ &#38;&#38; d.b8 == 'n'
334
+ &#38;&#38; d.c1 == 'B'
335
+ &#38;&#38; d.c2 == 'P'
336
+ &#38;&#38; d.c7 == 'p'
337
+ &#38;&#38; d.c8 == 'b'
338
+ &#38;&#38; d.d1 == 'Q'
339
+ &#38;&#38; d.d2 == 'P'
340
+ &#38;&#38; d.d7 == 'p'
341
+ &#38;&#38; d.d8 == 'q'
342
+ &#38;&#38; d.e1 == 'K'
343
+ &#38;&#38; d.e2 == 'P'
344
+ &#38;&#38; d.e7 == 'p'
345
+ &#38;&#38; d.e8 == 'k'
346
+ &#38;&#38; d.f1 == 'B'
347
+ &#38;&#38; d.f2 == 'P'
348
+ &#38;&#38; d.f7 == 'p'
349
+ &#38;&#38; d.f8 == 'b'
350
+ &#38;&#38; d.g1 == 'N'
351
+ &#38;&#38; d.g2 == 'P'
352
+ &#38;&#38; d.g7 == 'p'
353
+ &#38;&#38; d.g8 == 'n'
354
+ &#38;&#38; d.h1 == 'R'
355
+ &#38;&#38; d.h2 == 'P'
356
+ &#38;&#38; d.h7 == 'p'
357
+ &#38;&#38; d.h8 == 'r';
314
358
  allow update: if request.auth != null
315
- &amp;&amp; resource.data.status == &#x27;waiting&#x27;
316
- &amp;&amp; resource.data.guest == &#x27;&#x27;
317
- &amp;&amp; request.resource.data.guest == request.auth.uid
318
- &amp;&amp; request.auth.uid != resource.data.host
319
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
320
- &amp;&amp; request.resource.data.diff(resource.data).affectedKeys().hasOnly([&#x27;guest&#x27;, &#x27;status&#x27;]);
359
+ &#38;&#38; resource.data.status == 'waiting'
360
+ &#38;&#38; resource.data.guest == ''
361
+ &#38;&#38; request.resource.data.guest == request.auth.uid
362
+ &#38;&#38; request.auth.uid != resource.data.host
363
+ &#38;&#38; request.resource.data.status == 'playing'
364
+ &#38;&#38; request.resource.data.diff(resource.data).affectedKeys().hasOnly(['guest', 'status']);
321
365
  allow delete: if request.auth != null
322
- &amp;&amp; resource.data.status == &#x27;waiting&#x27;
323
- &amp;&amp; request.auth.uid == resource.data.host;
366
+ &#38;&#38; resource.data.status == 'waiting'
367
+ &#38;&#38; request.auth.uid == resource.data.host;
324
368
 
325
369
  // ═══ UNIQUE moveType gates — each rule category has its own ═══
326
370
  // Pawn forward
327
- allow update: if request.resource.data.moveType == &#x27;pawn_forward&#x27;
328
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
329
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnForward() &amp;&amp; request.resource.data.promotedTo == &#x27;&#x27;
330
- &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
371
+ allow update: if request.resource.data.moveType == 'pawn_forward'
372
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
373
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnForward() &#38;&#38; request.resource.data.promotedTo == ''
374
+ &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
331
375
  // Pawn capture
332
- allow update: if request.resource.data.moveType == &#x27;pawn_capture&#x27;
333
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
334
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnCapture() &amp;&amp; request.resource.data.promotedTo == &#x27;&#x27;
335
- &amp;&amp; captureValid() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
376
+ allow update: if request.resource.data.moveType == 'pawn_capture'
377
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data.status == 'playing'
378
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnCapture() &#38;&#38; request.resource.data.promotedTo == ''
379
+ &#38;&#38; captureValid() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
336
380
  // Pawn double
337
- allow update: if request.resource.data.moveType == &#x27;double_pawn&#x27;
338
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
339
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnDouble() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
381
+ allow update: if request.resource.data.moveType == 'double_pawn'
382
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
383
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnDouble() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
340
384
  // Promotion (forward)
341
- allow update: if request.resource.data.moveType == &#x27;promotion&#x27;
342
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
343
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnForward() &amp;&amp; validPromotion() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
385
+ allow update: if request.resource.data.moveType == 'promotion'
386
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
387
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnForward() &#38;&#38; validPromotion() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
344
388
  // Promotion (capture)
345
- allow update: if request.resource.data.moveType == &#x27;promotion_capture&#x27;
346
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
347
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnCapture() &amp;&amp; validPromotion() &amp;&amp; captureValid() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
389
+ allow update: if request.resource.data.moveType == 'promotion_capture'
390
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data.status == 'playing'
391
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnCapture() &#38;&#38; validPromotion() &#38;&#38; captureValid() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
348
392
  // En passant
349
- allow update: if request.resource.data.moveType == &#x27;en_passant&#x27;
350
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
351
- &amp;&amp; baseMoveChecks() &amp;&amp; validEnPassant()
352
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data[request.resource.data.capturedPiece] == &#x27;&#x27;
353
- &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
393
+ allow update: if request.resource.data.moveType == 'en_passant'
394
+ &#38;&#38; request.resource.data.status == 'playing'
395
+ &#38;&#38; baseMoveChecks() &#38;&#38; validEnPassant()
396
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data[request.resource.data.capturedPiece] == ''
397
+ &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
354
398
  // Standard piece move (non-pawn)
355
- allow update: if request.resource.data.moveType == &#x27;normal&#x27;
356
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
357
- &amp;&amp; baseMoveChecks() &amp;&amp; validPieceMove() &amp;&amp; resource.data[request.resource.data.moveTo] == &#x27;&#x27;
358
- &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
399
+ allow update: if request.resource.data.moveType == 'normal'
400
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
401
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPieceMove() &#38;&#38; resource.data[request.resource.data.moveTo] == ''
402
+ &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
359
403
  // Standard piece capture
360
- allow update: if request.resource.data.moveType == &#x27;capture&#x27;
361
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
362
- &amp;&amp; baseMoveChecks() &amp;&amp; validPieceMove() &amp;&amp; captureValid() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
404
+ allow update: if request.resource.data.moveType == 'capture'
405
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data.status == 'playing'
406
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPieceMove() &#38;&#38; captureValid() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
363
407
  // Castling kingside
364
- allow update: if request.resource.data.moveType == &#x27;castle_k&#x27;
365
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
366
- &amp;&amp; baseMoveChecks() &amp;&amp; validCastleKingside() &amp;&amp; myKingSafe();
408
+ allow update: if request.resource.data.moveType == 'castle_k'
409
+ &#38;&#38; request.resource.data.status == 'playing'
410
+ &#38;&#38; baseMoveChecks() &#38;&#38; validCastleKingside() &#38;&#38; myKingSafe();
367
411
  // Castling queenside
368
- allow update: if request.resource.data.moveType == &#x27;castle_q&#x27;
369
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
370
- &amp;&amp; baseMoveChecks() &amp;&amp; validCastleQueenside() &amp;&amp; myKingSafe();
412
+ allow update: if request.resource.data.moveType == 'castle_q'
413
+ &#38;&#38; request.resource.data.status == 'playing'
414
+ &#38;&#38; baseMoveChecks() &#38;&#38; validCastleQueenside() &#38;&#38; myKingSafe();
371
415
  // Draw
372
- allow update: if request.resource.data.moveType == &#x27;draw&#x27;
373
- &amp;&amp; request.resource.data.status == &#x27;draw&#x27;
374
- &amp;&amp; resource.data.status == &#x27;playing&#x27; &amp;&amp; isMyTurn();
416
+ allow update: if request.resource.data.moveType == 'draw'
417
+ &#38;&#38; request.resource.data.status == 'draw'
418
+ &#38;&#38; resource.data.status == 'playing' &#38;&#38; isMyTurn();
375
419
  // Resign
376
- allow update: if request.resource.data.moveType == &#x27;resign&#x27;
377
- &amp;&amp; request.resource.data.status == &#x27;resigned&#x27;
378
- &amp;&amp; resource.data.status == &#x27;playing&#x27;
379
- &amp;&amp; request.auth != null
380
- &amp;&amp; (request.auth.uid == resource.data.host || request.auth.uid == resource.data.guest);
420
+ allow update: if request.resource.data.moveType == 'resign'
421
+ &#38;&#38; request.resource.data.status == 'resigned'
422
+ &#38;&#38; resource.data.status == 'playing'
423
+ &#38;&#38; request.auth != null
424
+ &#38;&#38; (request.auth.uid == resource.data.host || request.auth.uid == resource.data.guest);
381
425
  }
382
426
  }
383
427
  }
384
- </code></pre></section><!--astro:end--></astro-island> </section> </div> </main> <aside class="doc-toc" aria-label="On this page" data-astro-cid-mw7aashj> <h2 class="doc-toc-heading" data-astro-cid-mw7aashj>On this page</h2> <ul data-astro-cid-mw7aashj> <li data-depth="2" data-astro-cid-mw7aashj> <a href="#try-the-board" data-astro-cid-mw7aashj>Try the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#a-move-is-a-firestore-write" data-astro-cid-mw7aashj>A move is a Firestore write</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#keep-the-rules-focused-on-chess" data-astro-cid-mw7aashj>Keep the Rules focused on chess</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#stop-unrelated-rules-early" data-astro-cid-mw7aashj>Stop unrelated Rules early</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#checkmate-is-a-result-not-a-trusted-claim" data-astro-cid-mw7aashj>Checkmate is a result, not a trusted claim</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#test-the-same-boundaries-before-production" data-astro-cid-mw7aashj>Test the same boundaries before production</a> </li> </ul> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body></html>
428
+ "> <div class="source-toolbar"> <strong>Security Rules</strong> <button type="button" class="copy-source">Copy source</button> </div> <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#E06C75">rules_version</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> '2+modules'</span><span style="color:#ABB2BF">;</span></span>
429
+ <span class="line"></span>
430
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isAuthenticated</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'auth'</span><span style="color:#ABB2BF">;</span></span>
431
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">validSimpleMove</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'geometry'</span><span style="color:#ABB2BF">;</span></span>
432
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isPlaying</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">moveIncremented</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">participantsUnchanged</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'state'</span><span style="color:#ABB2BF">;</span></span>
433
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isMyTurn</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">turnFlipped</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'turns'</span><span style="color:#ABB2BF">;</span></span>
434
+ <span class="line"></span>
435
+ <span class="line"><span style="color:#E06C75">service</span><span style="color:#E5C07B"> cloud</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">firestore</span><span style="color:#ABB2BF"> {</span></span>
436
+ <span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">databases</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">database</span><span style="color:#ABB2BF">}</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">documents</span><span style="color:#ABB2BF"> {</span></span>
437
+ <span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">gameConfig</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">id</span><span style="color:#ABB2BF">} { </span><span style="color:#E06C75">allow</span><span style="color:#E06C75"> read</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#D19A66"> true</span><span style="color:#ABB2BF">; </span><span style="color:#E06C75">allow</span><span style="color:#E06C75"> write</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#D19A66"> false</span><span style="color:#ABB2BF">; }</span></span>
438
+ <span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">chess</span><span style="color:#56B6C2">-</span><span style="color:#E06C75">v2</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">gameId</span><span style="color:#ABB2BF">} {</span></span>
439
+ <span class="line"></span>
440
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">() { </span><span style="color:#C678DD">return</span><span style="color:#61AFEF"> get</span><span style="color:#ABB2BF">(</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">databases</span><span style="color:#56B6C2">/</span><span style="color:#61AFEF">$</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">database</span><span style="color:#ABB2BF">)</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">documents</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">gameConfig</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">chessv2</span><span style="color:#ABB2BF">).</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">; }</span></span>
441
+ <span class="line"></span>
442
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">() {</span></span>
443
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">];</span></span>
444
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span></span>
445
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#ABB2BF">))</span></span>
446
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span></span>
447
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">));</span></span>
448
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
449
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() {</span></span>
450
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#61AFEF"> isAuthenticated</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> isPlaying</span><span style="color:#ABB2BF">()</span></span>
451
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> isMyTurn</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> turnFlipped</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">()</span></span>
452
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> moveIncremented</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> participantsUnchanged</span><span style="color:#ABB2BF">();</span></span>
453
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
454
+ <span class="line"></span>
455
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() {</span></span>
456
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
457
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
458
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
459
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> p</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">];</span></span>
460
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#61AFEF"> validSimpleMove</span><span style="color:#ABB2BF">(</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">())</span></span>
461
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pieceCategory</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> 'jump'</span></span>
462
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> ((</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
463
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
464
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
465
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
466
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
467
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 6</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)));</span></span>
468
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
469
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() {</span></span>
470
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
471
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
472
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
473
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnForward</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
474
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
475
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() {</span></span>
476
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
477
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
478
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
479
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
480
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mf</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">]</span></span>
481
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">to</span><span style="color:#56B6C2"> ==</span><span style="color:#E06C75"> mt</span></span>
482
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
483
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
484
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
485
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() {</span></span>
486
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
487
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
488
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
489
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">];</span></span>
490
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
491
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">]</span></span>
492
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span></span>
493
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> ((</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">))</span></span>
494
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#ABB2BF">)));</span></span>
495
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
496
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() {</span></span>
497
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
498
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">];</span></span>
499
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#ABB2BF">;</span></span>
500
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion'</span></span>
501
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> ((</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> >=</span><span style="color:#98C379"> 'a8'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> &#x3C;=</span><span style="color:#98C379"> 'h8'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#ABB2BF">))</span></span>
502
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> >=</span><span style="color:#98C379"> 'a1'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> &#x3C;=</span><span style="color:#98C379"> 'h1'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#ABB2BF">)));</span></span>
503
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
504
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() {</span></span>
505
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
506
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
507
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
508
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
509
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> 'promotion'</span></span>
510
+ <span class="line"><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> piece</span></span>
511
+ <span class="line"><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#ABB2BF">)</span></span>
512
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">movedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> mf</span></span>
513
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">movedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> mt</span><span style="color:#ABB2BF">;</span></span>
514
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
515
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() {</span></span>
516
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> cp</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#ABB2BF">;</span></span>
517
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#E06C75"> cp</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span></span>
518
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">cp</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span></span>
519
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">cp</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
520
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
521
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">() {</span></span>
522
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
523
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
524
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
525
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
526
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">]</span></span>
527
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
528
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">lastDoublePawn</span><span style="color:#56B6C2"> ==</span><span style="color:#E06C75"> mt</span><span style="color:#ABB2BF">;</span></span>
529
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
530
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() {</span></span>
531
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#ABB2BF">;</span></span>
532
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">castling</span><span style="color:#ABB2BF">;</span></span>
533
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> castle</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">wk</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">bk</span><span style="color:#ABB2BF">;</span></span>
534
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> kingMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k_moved</span><span style="color:#ABB2BF">;</span></span>
535
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> rookMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2_moved</span><span style="color:#ABB2BF">;</span></span>
536
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">kingMoved</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">rookMoved</span></span>
537
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingFrom</span></span>
538
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingTo</span></span>
539
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">0</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
540
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">1</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
541
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
542
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() {</span></span>
543
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#ABB2BF">;</span></span>
544
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">castling</span><span style="color:#ABB2BF">;</span></span>
545
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> castle</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">wq</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">bq</span><span style="color:#ABB2BF">;</span></span>
546
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> kingMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k_moved</span><span style="color:#ABB2BF">;</span></span>
547
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> rookMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1_moved</span><span style="color:#ABB2BF">;</span></span>
548
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">kingMoved</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">rookMoved</span></span>
549
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingFrom</span></span>
550
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingTo</span></span>
551
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">0</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
552
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">1</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
553
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">2</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
554
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
555
+ <span class="line"></span>
556
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
557
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
558
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
559
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">])</span></span>
560
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">])</span></span>
561
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">])</span></span>
562
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">])</span></span>
563
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">])</span></span>
564
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">])</span></span>
565
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">])</span></span>
566
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">]);</span></span>
567
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
568
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
569
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
570
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
571
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">])</span></span>
572
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">])</span></span>
573
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">]);</span></span>
574
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
575
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
576
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
577
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
578
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">]</span></span>
579
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
580
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
581
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
582
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
583
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
584
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">]</span></span>
585
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
586
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
587
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
588
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
589
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
590
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">]</span></span>
591
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
592
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
593
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
594
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
595
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
596
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">]</span></span>
597
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
598
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
599
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
600
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
601
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
602
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">]</span></span>
603
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
604
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
605
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
606
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
607
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">));</span></span>
608
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
609
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
610
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
611
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
612
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">])</span></span>
613
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">])</span></span>
614
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">])</span></span>
615
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">])</span></span>
616
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">])</span></span>
617
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">])</span></span>
618
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">])</span></span>
619
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">]);</span></span>
620
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
621
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
622
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
623
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
624
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">])</span></span>
625
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">])</span></span>
626
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">]);</span></span>
627
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
628
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
629
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
630
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
631
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">]</span></span>
632
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
633
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
634
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
635
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
636
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
637
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">]</span></span>
638
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
639
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
640
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
641
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
642
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
643
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">]</span></span>
644
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
645
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
646
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
647
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
648
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
649
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">]</span></span>
650
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
651
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
652
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
653
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
654
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
655
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">]</span></span>
656
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
657
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
658
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
659
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
660
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">));</span></span>
661
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
662
+ <span class="line"></span>
663
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">() {</span></span>
664
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">();</span></span>
665
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">))</span></span>
666
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">));</span></span>
667
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
668
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> opponentInCheck</span><span style="color:#ABB2BF">() {</span></span>
669
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">();</span></span>
670
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">)))</span></span>
671
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">)));</span></span>
672
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
673
+ <span class="line"></span>
674
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ Lobby ═══</span></span>
675
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> read</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span><span style="color:#ABB2BF">;</span></span>
676
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> create</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
677
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span></span>
678
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
679
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span></span>
680
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
681
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
682
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span></span>
683
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span></span>
684
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
685
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
686
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span></span>
687
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span></span>
688
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
689
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
690
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span></span>
691
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span></span>
692
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
693
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
694
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span></span>
695
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span></span>
696
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
697
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
698
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span></span>
699
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span></span>
700
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
701
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
702
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span></span>
703
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span></span>
704
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
705
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
706
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span></span>
707
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span></span>
708
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
709
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
710
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#ABB2BF">;</span></span>
711
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
712
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
713
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
714
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span></span>
715
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> !=</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span></span>
716
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
717
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#61AFEF">diff</span><span style="color:#ABB2BF">(</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">).</span><span style="color:#61AFEF">affectedKeys</span><span style="color:#ABB2BF">().</span><span style="color:#61AFEF">hasOnly</span><span style="color:#ABB2BF">([</span><span style="color:#98C379">'guest'</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">'status'</span><span style="color:#ABB2BF">]);</span></span>
718
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> delete</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
719
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
720
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#ABB2BF">;</span></span>
721
+ <span class="line"></span>
722
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ UNIQUE moveType gates — each rule category has its own ═══</span></span>
723
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn forward</span></span>
724
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'pawn_forward'</span></span>
725
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
726
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
727
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
728
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn capture</span></span>
729
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'pawn_capture'</span></span>
730
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
731
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
732
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
733
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn double</span></span>
734
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'double_pawn'</span></span>
735
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
736
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
737
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (forward)</span></span>
738
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion'</span></span>
739
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
740
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
741
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (capture)</span></span>
742
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion_capture'</span></span>
743
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
744
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
745
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // En passant</span></span>
746
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'en_passant'</span></span>
747
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
748
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">()</span></span>
749
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
750
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
751
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece move (non-pawn)</span></span>
752
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'normal'</span></span>
753
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
754
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
755
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
756
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece capture</span></span>
757
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'capture'</span></span>
758
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
759
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
760
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Castling kingside</span></span>
761
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'castle_k'</span></span>
762
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
763
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
764
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Castling queenside</span></span>
765
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'castle_q'</span></span>
766
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
767
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
768
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Draw</span></span>
769
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'draw'</span></span>
770
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'draw'</span></span>
771
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> isMyTurn</span><span style="color:#ABB2BF">();</span></span>
772
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Resign</span></span>
773
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'resign'</span></span>
774
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'resigned'</span></span>
775
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
776
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
777
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#ABB2BF">);</span></span>
778
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
779
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
780
+ <span class="line"><span style="color:#ABB2BF">}</span></span></code></pre> </section> <script type="module">document.querySelectorAll(".source-explorer").forEach(e=>{const t=e.querySelector(".copy-source");!t||t.dataset.copyInstalled==="true"||(t.dataset.copyInstalled="true",t.addEventListener("click",async()=>{await navigator.clipboard.writeText(e.dataset.source??""),t.textContent="Copied",window.setTimeout(()=>{t.textContent="Copy source"},1500)}))});</script> </section> </div> </main> <aside class="doc-toc" aria-label="On this page" data-astro-cid-mw7aashj> <h2 class="doc-toc-heading" data-astro-cid-mw7aashj>On this page</h2> <ul data-astro-cid-mw7aashj> <li data-depth="2" data-astro-cid-mw7aashj> <a href="#try-the-board" data-astro-cid-mw7aashj>Try the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#a-move-is-a-firestore-write" data-astro-cid-mw7aashj>A move is a Firestore write</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#why-the-rules-look-like-this" data-astro-cid-mw7aashj>Why the Rules look like this</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#look-up-the-available-helpers" data-astro-cid-mw7aashj>Look up the available helpers</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#route-each-move-to-one-branch" data-astro-cid-mw7aashj>Route each move to one branch</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#derive-checkmate-from-the-board" data-astro-cid-mw7aashj>Derive checkmate from the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#test-specific-moves" data-astro-cid-mw7aashj>Test specific moves</a> </li> </ul> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body></html>