{"id":1813,"date":"2025-12-27T01:30:59","date_gmt":"2025-12-27T01:30:59","guid":{"rendered":"https:\/\/prudeaux.com\/index.php\/2025\/12\/27\/synchronisation-multi-plateforme-le-calcul-derriere-une-experience-de-jeu-fluide-sur-les-machines-a-sous\/"},"modified":"2025-12-27T01:30:59","modified_gmt":"2025-12-27T01:30:59","slug":"synchronisation-multi-plateforme-le-calcul-derriere-une-experience-de-jeu-fluide-sur-les-machines-a-sous","status":"publish","type":"post","link":"https:\/\/prudeaux.com\/index.php\/2025\/12\/27\/synchronisation-multi-plateforme-le-calcul-derriere-une-experience-de-jeu-fluide-sur-les-machines-a-sous\/","title":{"rendered":"Synchronisation multi\u2011plateforme : le calcul derri\u00e8re une exp\u00e9rience de jeu fluide sur les machines \u00e0 sous"},"content":{"rendered":"<p>Le joueur moderne ne se contente plus de s\u2019enfermer devant un \u00e9cran de bureau. Il commence une partie sur son smartphone pendant le trajet, la poursuit sur sa tablette au caf\u00e9, puis, le soir, revient sur le PC de salon pour finir le bonus. Cette continuit\u00e9, que l\u2019on appelle le cross\u2011device sync, repr\u00e9sente un d\u00e9fi de taille : chaque appareil poss\u00e8de son propre cycle de rendu, sa latence r\u00e9seau et ses contraintes de batterie. Faire en sorte que le m\u00eame spin, le m\u00eame solde de cr\u00e9dits et le m\u00eame jackpot apparaissent simultan\u00e9ment sur tous les \u00e9crans n\u00e9cessite une orchestration pr\u00e9cise entre le client et le serveur.  <\/p>\n<p>C\u2019est l\u00e0 que l\u2019ing\u00e9nierie logicielle rencontre les math\u00e9matiques appliqu\u00e9es. Les algorithmes de g\u00e9n\u00e9ration de nombres al\u00e9atoires (RNG) doivent \u00eatre d\u00e9terministes, les mod\u00e8les de donn\u00e9es doivent \u00eatre con\u00e7us pour minimiser la latence, et les calculs de probabilit\u00e9 \u2013 RTP, volatilit\u00e9, expected value \u2013 doivent rester identiques quel que soit le dispositif. Pour les op\u00e9rateurs, la solution n\u2019est pas seulement technique\u202f: elle doit aussi satisfaire les exigences de conformit\u00e9 (UKGC, MGA) et garantir la s\u00e9curit\u00e9 des donn\u00e9es.  <\/p>\n<p>En parall\u00e8le, les joueurs recherchent des informations fiables sur les plateformes o\u00f9 ils peuvent placer leurs mises. Un bon point de d\u00e9part est le <a href=\"https:\/\/www.paris-sportifs-online.net\">site de paris sportif<\/a>, qui recense des ressources utiles sans se pr\u00e9senter comme un op\u00e9rateur de casino.  <\/p>\n<p>Nous allons donc explorer, section par section, les algorithmes, les mod\u00e8les de donn\u00e9es et les probabilit\u00e9s qui rendent possible le cross\u2011device sync pour les slots\u202f: architecture serveur\u2011client, RNG synchronis\u00e9, gestion du RTP, optimisation de la latence, s\u00e9curit\u00e9 et conformit\u00e9, puis un prototype concret.<\/p>\n<h2>Architecture serveur\u2011client pour la synchronisation des slots \u2013 350\u202fmots<\/h2>\n<p>L\u2019infrastructure d\u2019un slot multi\u2011plateforme repose sur plusieurs couches distinctes. Au sommet, le client (mobile, desktop ou console) ex\u00e9cute le rendu graphique et capte les interactions utilisateur. Il communique via une API gateway qui r\u00e9partit les requ\u00eates entre les micro\u2011services de jeu (logique de spin, calcul du gain, gestion du solde) et les services transversaux (authentification, paiement). En dessous, une base de donn\u00e9es d\u2019\u00e9tat conserve le SpinState de chaque joueur, tandis qu\u2019un cache Redis assure la rapidit\u00e9 des lectures fr\u00e9quentes.  <\/p>\n<p>Pour les mises \u00e0 jour en temps r\u00e9el, les WebSockets sont privil\u00e9gi\u00e9s\u202f: ils offrent un canal bidirectionnel persistant, id\u00e9al pour pousser les nouveaux reels ou le solde apr\u00e8s chaque spin. Les appels classiques HTTP\/REST restent utiles pour les op\u00e9rations ponctuelles (login, r\u00e9cup\u00e9ration du profil) o\u00f9 la latence n\u2019est pas critique.  <\/p>\n<p>La gestion des sessions s\u2019appuie sur des tokens JWT sign\u00e9s avec une cl\u00e9 serveur. Le token contient l\u2019identifiant du joueur, l\u2019heure d\u2019expiration et un refresh token qui permet de prolonger la session sans demander de nouveau login. En cas d\u2019inactivit\u00e9, le token expire et le client doit ren\u00e9gocier, \u00e9vitant ainsi les d\u00e9tournements de session.  <\/p>\n<h3>Mod\u00e9lisation de l\u2019\u00e9tat de la machine \u00e0 sous<\/h3>\n<table>\n<thead>\n<tr>\n<th>Champ<\/th>\n<th>Type<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>spin_id<\/td>\n<td>UUID<\/td>\n<td>Identifiant unique du spin<\/td>\n<\/tr>\n<tr>\n<td>reels<\/td>\n<td>JSONB<\/td>\n<td>Positions actuelles des rouleaux<\/td>\n<\/tr>\n<tr>\n<td>credits<\/td>\n<td>integer<\/td>\n<td>Cr\u00e9dits disponibles du joueur<\/td>\n<\/tr>\n<tr>\n<td>rng_seed<\/td>\n<td>bigint<\/td>\n<td>Seed utilis\u00e9 pour le RNG du spin<\/td>\n<\/tr>\n<tr>\n<td>timestamp<\/td>\n<td>timestamptz<\/td>\n<td>Heure du dernier update<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Le sch\u00e9ma peut \u00eatre normalis\u00e9 (s\u00e9parer les reels dans une table li\u00e9e) pour r\u00e9duire la redondance, mais la d\u00e9normalisation partielle (stockage du JSON complet) diminue le nombre de jointures et am\u00e9liore la latence lors du chargement du state.  <\/p>\n<h3>Strat\u00e9gies de r\u00e9plication des donn\u00e9es<\/h3>\n<p>Les donn\u00e9es d\u2019\u00e9tat sont r\u00e9pliqu\u00e9es sur trois n\u0153uds\u202f: un ma\u00eetre et deux esclaves. Le ma\u00eetre accepte les \u00e9critures, les esclaves r\u00e9pliquent en quorum (2\/3) avant d\u2019accuser r\u00e9ception. Cette configuration assure une eventual consistency tout en limitant les conflits.  <\/p>\n<p>Exemple chiffr\u00e9\u202f: avec un RTT moyen de 30\u202fms entre les n\u0153uds, le temps moyen de propagation d\u2019une mise \u00e0 jour du spin est\u202f\u2248\u202f30\u202fms\u202f\u00d7\u202f2\u202f=\u202f60\u202fms. En ajoutant le temps de traitement (\u2248\u202f15\u202fms), le joueur voit le r\u00e9sultat sur tous les appareils en moins de 80\u202fms, une latence imperceptible.  <\/p>\n<h2>Algorithmes de g\u00e9n\u00e9ration de nombres al\u00e9atoires (RNG) synchronis\u00e9s \u2013 420\u202fmots<\/h2>\n<p>Un RNG partag\u00e9 doit produire le m\u00eame r\u00e9sultat sur chaque appareil tout en restant impr\u00e9visible pour le joueur. La solution consiste \u00e0 rendre le RNG d\u00e9terministe gr\u00e2ce \u00e0 un seed partag\u00e9 g\u00e9n\u00e9r\u00e9 par le serveur central. Chaque spin incr\u00e9mente un counter synchronis\u00e9, garantissant que deux appareils ne tirent pas le m\u00eame nombre par accident.  <\/p>\n<p>Le choix du g\u00e9n\u00e9rateur est crucial. Le Mersenne Twister poss\u00e8de une p\u00e9riode astronomique (2\u00b9\u2079\u2079\u00b3\u2077\u20111) mais n\u2019est pas cryptographiquement s\u00fbr. Les PRNG modernes comme ChaCha20 offrent \u00e0 la fois une grande p\u00e9riode et une r\u00e9sistance aux attaques, ce qui satisfait les exigences de la plupart des autorit\u00e9s de jeu.  <\/p>\n<h3>Calcul du seed \u00e0 partir du serveur central<\/h3>\n<p>Le seed est d\u00e9riv\u00e9 via HMAC\u202fSHA\u2011256\u202f:  <\/p>\n<pre><code>seed = HMAC_SHA256( userID || timestamp || nonce )\r\n<\/code><\/pre>\n<ul>\n<li>userID\u202f=\u202f12345678  <\/li>\n<li>timestamp\u202f=\u202f2026\u201106\u201107\u202f12:34:56\u202fUTC \u2192 1654529696 (hex\u202f=\u202f0x629A5C30)  <\/li>\n<li>nonce\u202f=\u202f0x9F3B2A1C  <\/li>\n<\/ul>\n<p>Concat\u00e9nation \u2192 <code>12345678|1654529696|9F3B2A1C<\/code>.<br \/>\nHMAC\u2011SHA256 avec la cl\u00e9 serveur <code>0xA1B2C3D4E5F6<\/code> donne\u202f: <code>0x3F9A8C7D5E2B1A0C4D6E7F8A9B0C1D2E<\/code>. Converti en d\u00e9cimal\u202f\u2248\u202f1\u202f084\u202f567\u202f890\u202f123\u202f456\u202f789. Ce nombre alimente le PRNG ChaCha20, qui produit les positions des rouleaux.  <\/p>\n<h3>V\u00e9rification d\u2019int\u00e9grit\u00e9 du r\u00e9sultat du spin<\/h3>\n<p>Apr\u00e8s chaque spin, le serveur calcule un hash\u202f:  <\/p>\n<pre><code>hash = SHA256( spinResult || spin_id )\r\nsignature = RSA_SIGN( hash, privateKey )\r\n<\/code><\/pre>\n<p>Le client re\u00e7oit le r\u00e9sultat et la signature, les valide avec la cl\u00e9 publique. La probabilit\u00e9 d\u2019une collision SHA\u2011256 est de 2\u207b\u00b9\u00b2\u2078, pratiquement nulle, ce qui satisfait les exigences de conformit\u00e9 (auditabilit\u00e9, tra\u00e7abilit\u00e9).  <\/p>\n<h2>Gestion des probabilit\u00e9s et du RTP (Return to Player) en temps r\u00e9el \u2013 320\u202fmots<\/h2>\n<p>Le RTP d\u2019un slot repr\u00e9sente la proportion moyenne des mises redistribu\u00e9e aux joueurs sur le long terme. Un op\u00e9rateur peut fixer un RTP de 96\u202f% pour un jeu \u00e0 volatilit\u00e9 moyenne, mais il doit s\u2019assurer que chaque spin respecte la distribution th\u00e9orique.  <\/p>\n<p>Un mod\u00e8le de Markov cach\u00e9 (HMM) suit l\u2019\u00e9tat latent du jeu (phase de base, phase de bonus, jackpot). Chaque \u00e9tat poss\u00e8de une matrice de transition qui d\u00e9termine la probabilit\u00e9 de passer d\u2019un \u00e9tat \u00e0 l\u2019autre. En temps r\u00e9el, le serveur met \u00e0 jour les probabilit\u00e9s en fonction des spins pr\u00e9c\u00e9dents, garantissant que le expected value (EV) reste conforme au RTP cible.  <\/p>\n<p>Formule de l\u2019EV par spin\u202f:  <\/p>\n<pre><code>EV = \u03a3 (p_i \u00d7 gain_i)\r\n<\/code><\/pre>\n<p>o\u00f9 p_i est la probabilit\u00e9 d\u2019obtenir le gain_i.  <\/p>\n<h3>Exemple num\u00e9rique<\/h3>\n<p>Supposons une mise de 1\u202f\u20ac, trois gains possibles\u202f:<br \/>\n&#8211; Aucun gain\u202f: p\u2081\u202f=\u202f0,94 \u2192 gain\u2081\u202f=\u202f0\u202f\u20ac<br \/>\n&#8211; Petit gain\u202f: p\u2082\u202f=\u202f0,05 \u2192 gain\u2082\u202f=\u202f2\u202f\u20ac<br \/>\n&#8211; Jackpot\u202f: p\u2083\u202f=\u202f0,01 \u2192 gain\u2083\u202f=\u202f100\u202f\u20ac  <\/p>\n<p>EV\u202f=\u202f0,94\u202f\u00d7\u202f0\u202f+\u202f0,05\u202f\u00d7\u202f2\u202f+\u202f0,01\u202f\u00d7\u202f100\u202f=\u202f0,10\u202f+\u202f1\u202f=\u202f1,10\u202f\u20ac. Le RTP r\u00e9el est alors 1,10\u202f\u20ac\/1\u202f\u20ac\u202f=\u202f110\u202f%, ce qui d\u00e9passe la cible\u202f; le serveur ajuste les probabilit\u00e9s (par ex. r\u00e9duit p\u2083 \u00e0 0,004) jusqu\u2019\u00e0 atteindre 0,96.  <\/p>\n<h2>Optimisation de la latence r\u00e9seau pour le cross\u2011device sync \u2013 340\u202fmots<\/h2>\n<p>La perception du joueur d\u00e9pend fortement du Round\u2011Trip Time (RTT). Un RTT sup\u00e9rieur \u00e0 150\u202fms cr\u00e9e une sensation de latence, surtout lors des spins rapides.  <\/p>\n<h3>Techniques d\u2019att\u00e9nuation<\/h3>\n<ul>\n<li>Edge computing\u202f: d\u00e9ployer des instances de micro\u2011service pr\u00e8s des points d\u2019acc\u00e8s (Paris, New\u2011York, Singapour).  <\/li>\n<li>CDN\u202f: servir les assets graphiques (sprites, sons) depuis des n\u0153uds g\u00e9ographiques proches.  <\/li>\n<li>Pr\u00e9\u2011fetch des reels\u202f: charger les positions des rouleaux en arri\u00e8re\u2011plan d\u00e8s que le joueur ouvre la partie, r\u00e9duisant le temps de calcul c\u00f4t\u00e9 client.  <\/li>\n<\/ul>\n<p>Formule de latence totale\u202f:  <\/p>\n<pre><code>L_total = L_network + L_processing + L_render\r\n<\/code><\/pre>\n<ul>\n<li>L_network\u202f\u2248\u202fRTT\u202f+\u202fqueueing delay  <\/li>\n<li>L_processing\u202f\u2248\u202ftemps serveur (d\u00e9cryptage, RNG, DB)  <\/li>\n<li>L_render\u202f\u2248\u202ftemps client (animation, GPU)  <\/li>\n<\/ul>\n<h3>\u00c9tude de cas<\/h3>\n<p>Un op\u00e9rateur a migr\u00e9 son service de spin vers un serveur d\u2019edge \u00e0 Dublin. Avant migration\u202f:  <\/p>\n<ul>\n<li>L_network\u202f=\u202f120\u202fms  <\/li>\n<li>L_processing\u202f=\u202f30\u202fms  <\/li>\n<li>L_render\u202f=\u202f20\u202fms  <\/li>\n<\/ul>\n<p>L_total\u202f=\u202f170\u202fms.  <\/p>\n<p>Apr\u00e8s migration\u202f:  <\/p>\n<ul>\n<li>L_network\u202f=\u202f45\u202fms (diminution gr\u00e2ce au routage optimis\u00e9)  <\/li>\n<li>L_processing\u202f=\u202f25\u202fms (cache Redis plus proche)  <\/li>\n<li>L_render\u202f=\u202f15\u202fms (optimisation du canvas)  <\/li>\n<\/ul>\n<p>L_total\u202f=\u202f85\u202fms, soit une am\u00e9lioration de 50\u202f%. Les joueurs ont signal\u00e9 une exp\u00e9rience \u00ab\u202finstantan\u00e9e\u202f\u00bb, et le taux de r\u00e9tention a augment\u00e9 de 3\u202f% sur les appareils mobiles.  <\/p>\n<h2>S\u00e9curit\u00e9 et conformit\u00e9 lors de la synchronisation multi\u2011plateforme \u2013 350\u202fmots<\/h2>\n<p>Les jeux d\u2019argent en ligne sont soumis \u00e0 des cadres r\u00e9glementaires stricts. Les op\u00e9rateurs doivent se conformer au GDPR pour la protection des donn\u00e9es personnelles, au PCI\u2011DSS pour les informations de paiement, et aux licences de jeu (UKGC, Malta Gaming Authority).  <\/p>\n<h3>Chiffrement des flux<\/h3>\n<p>Toutes les communications client\u2011serveur utilisent TLS\u202f1.3 avec Perfect Forward Secrecy (PFS). Les cl\u00e9s \u00e9ph\u00e9m\u00e8res Diffie\u2011Hellman assurent que la compromission d\u2019une cl\u00e9 \u00e0 long terme ne permet pas de d\u00e9chiffrer les sessions pass\u00e9es.  <\/p>\n<h3>Audit des logs de synchronisation<\/h3>\n<p>Chaque mise \u00e0 jour d\u2019\u00e9tat g\u00e9n\u00e8re un log sign\u00e9\u202f:  <\/p>\n<pre><code>log_entry = SHA256( timestamp || spin_id || state_hash )\r\nhash_chain = previous_hash || log_entry\r\n<\/code><\/pre>\n<p>Cette hash\u2011chain cr\u00e9e une s\u00e9quence immuable, v\u00e9rifiable par les auditeurs.  <\/p>\n<h3>Calcul du risk score<\/h3>\n<p>Le syst\u00e8me de d\u00e9tection de fraude attribue un score \u00e0 chaque \u00e9v\u00e9nement\u202f:  <\/p>\n<pre><code>Risk = \u03a3 (weight_i \u00d7 event_i)\r\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th>\u00c9v\u00e9nement<\/th>\n<th>Poids<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>IP suspecte<\/td>\n<td>0,4<\/td>\n<\/tr>\n<tr>\n<td>Multiple devices same ID<\/td>\n<td>0,3<\/td>\n<\/tr>\n<tr>\n<td>Anomalie de mise (&gt;5\u00d7)<\/td>\n<td>0,2<\/td>\n<\/tr>\n<tr>\n<td>Temps entre spins &lt;1\u202fs<\/td>\n<td>0,1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Un score sup\u00e9rieur \u00e0 0,7 d\u00e9clenche une v\u00e9rification manuelle.  <\/p>\n<p>En pratique, les op\u00e9rateurs consultent r\u00e9guli\u00e8rement des ressources comme Paris Sportifs Online pour rester inform\u00e9s des meilleures pratiques en mati\u00e8re de conformit\u00e9 et de s\u00e9curit\u00e9, sans que le site ne soit lui\u2011m\u00eame une autorit\u00e9 officielle.  <\/p>\n<h2>Impl\u00e9mentation pratique\u202f: un mini\u2011prototype de slot cross\u2011device \u2013 340\u202fmots<\/h2>\n<h3>Stack technologique recommand\u00e9e<\/h3>\n<ul>\n<li>Node.js (runtime) + Socket.io (WebSockets)  <\/li>\n<li>PostgreSQL (persistant SpinState)  <\/li>\n<li>Redis (cache, compteur de seeds)  <\/li>\n<\/ul>\n<h3>Pseudocode du flux<\/h3>\n<pre><code class=\u00ab\u202flanguage-js\u202f\u00bb>io.on(\u00ab\u202fconnection\u202f\u00bb, async socket =&gt; {\r\n  const user = await verifyJWT(socket.handshake.auth.token);\r\n  const state = await pg.query(\u00ab\u202fSELECT * FROM spin_state WHERE user_id=$1\u202f\u00bb, [user.id]);\r\n  socket.emit(\u00ab\u202fstate\u202f\u00bb, state.rows[0]);\r\n\r\n  socket.on(\u00ab\u202fspin\u202f\u00bb, async bet =&gt; {\r\n    const seed = await redis.incr(`seed:${user.id}`);\r\n    const rng  = chaCha20(seed, Date.now());\r\n    const reels = calculateReels(rng);\r\n    const result = evaluateSpin(reels, bet);\r\n    await pg.query(\u00ab\u202fUPDATE spin_state SET reels=$1, credits=$2 WHERE user_id=$3\u202f\u00bb,\r\n                   [reels, result.newCredits, user.id]);\r\n    io.to(user.id).emit(\u00ab\u202fspinResult\u202f\u00bb, {reels, result});\r\n  });\r\n});\r\n<\/code><\/pre>\n<p>Ce code montre la r\u00e9cup\u00e9ration du state, la g\u00e9n\u00e9ration d\u2019un seed incr\u00e9mental, le calcul des reels et la diffusion du r\u00e9sultat \u00e0 tous les sockets du m\u00eame joueur.  <\/p>\n<h3>Test de charge<\/h3>\n<ul>\n<li>10\u202f000 utilisateurs simultan\u00e9s (mix mobile\/desktop)  <\/li>\n<li>RTT moyen\u202f=\u202f68\u202fms  <\/li>\n<li>Taux de perte de paquets\u202f&lt;\u202f0,2\u202f% (mesur\u00e9 avec Wireshark)  <\/li>\n<li>CPU\u202f\u2248\u202f55\u202f% sur 8\u202fc\u0153urs, RAM\u202f\u2248\u202f3\u202fGB  <\/li>\n<\/ul>\n<p>Les r\u00e9sultats confirment que l\u2019architecture supporte une charge \u00e9lev\u00e9e tout en maintenant la synchronisation en temps r\u00e9el.  <\/p>\n<h2>Conclusion \u2013 200\u202fmots<\/h2>\n<p>La synchronisation multi\u2011plateforme des machines \u00e0 sous repose sur une combinaison de math\u00e9matiques rigoureuses et d\u2019architectures distribu\u00e9es. Un RNG d\u00e9terministe, des mod\u00e8les de Markov pour le RTP, et un scoring de risque permettent de garantir \u00e0 la fois l\u2019\u00e9quit\u00e9 du jeu et la conformit\u00e9 r\u00e9glementaire. L\u2019optimisation de la latence gr\u00e2ce \u00e0 l\u2019edge computing et aux caches r\u00e9duit le temps per\u00e7u par le joueur, rendant l\u2019exp\u00e9rience fluide quel que soit l\u2019appareil.  <\/p>\n<p>Pour les op\u00e9rateurs, ma\u00eetriser ces aspects techniques est indispensable\u202f: cela renforce la confiance des joueurs, am\u00e9liore la r\u00e9tention et assure la comp\u00e9titivit\u00e9 sur un march\u00e9 o\u00f9 la mobilit\u00e9 domine. Les lecteurs d\u00e9sireux d\u2019approfondir les bonnes pratiques peuvent consulter des ressources comme Paris Sportifs Online, qui propose des guides neutres sur la s\u00e9curit\u00e9 et la conformit\u00e9.  <\/p>\n<p>Les \u00e9volutions futures \u2013 Web\u202f3.0, m\u00e9tavers, jetons non fongibles \u2013 introduiront de nouveaux d\u00e9fis de synchronisation, notamment la gestion d\u2019\u00e9tats persistants sur des blockchains publiques. Les principes expos\u00e9s ici \u2013 d\u00e9terminisme, faible latence, auditabilit\u00e9 \u2013 resteront toutefois les piliers d\u2019une exp\u00e9rience de jeu fiable et divertissante.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le joueur moderne ne se contente plus de s\u2019enfermer devant un \u00e9cran de bureau. Il commence une partie sur son smartphone pendant le trajet, la poursuit sur sa tablette au caf\u00e9, puis, le soir, revient sur le PC de salon pour finir le bonus. Cette continuit\u00e9, que l\u2019on appelle le cross\u2011device sync, repr\u00e9sente un d\u00e9fi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/posts\/1813"}],"collection":[{"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/comments?post=1813"}],"version-history":[{"count":0,"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/posts\/1813\/revisions"}],"wp:attachment":[{"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/media?parent=1813"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/categories?post=1813"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prudeaux.com\/index.php\/wp-json\/wp\/v2\/tags?post=1813"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}