HEX
Server: Apache
System: Linux vps.mmtprep.com 4.18.0-477.21.1.el8_8.x86_64 #1 SMP Thu Aug 10 13:51:50 EDT 2023 x86_64
User: mmtprep (1001)
PHP: 8.1.34
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/mmtprep/public_html/mathzen.mmtprep.com/assets/Labyrinthe-eU0rXINW.js.map
{"version":3,"file":"Labyrinthe-eU0rXINW.js","sources":["../../src/modules/Labyrinthe.js"],"sourcesContent":["import { point } from '../lib/2d/points.js'\nimport { segment } from '../lib/2d/segmentsVecteurs.js'\nimport { latexParCoordonnees, texteParPoint, texteParPointEchelle, texteParPositionEchelle } from '../lib/2d/textes.js'\nimport { combinaisonListesSansChangerOrdre, enleveElement } from '../lib/outils/arrayOutils'\nimport { nombreAvecEspace } from '../lib/outils/texNombre'\nimport { randint } from './outils.js'\n\n/**  Crée un ensemble de chemins possibles dans un labyrinthe. Cette fonction est à associer aux méthodes conçues pour.\n * @param {Object} parametres À saisir entre accolades\n * @param {number} [parametres.nbLignes = 3]\n * @param {number} [parametres.nbColonnes = 6]\n * @author Jean-Claude Lhote & Eric Elter (améliorée par EE pour choisir le nombre de lignes et de colonnes)\n * Publié le 6/12/2020 (Modifié le 05/10/2022)\n * @class\n */\n// JSDOC Validee par EE Septembre 2022\nexport function Labyrinthe ({ nbLignes = 3, nbColonnes = 6, scaleFigure = 1 } = {}) {\n  // Fonction qui permet de copier des tableaux\n  function arrayCopy (arr) {\n    return JSON.parse(JSON.stringify(arr))\n  }\n\n  // Permet de tester si un tableau est contenu dans un autre.\n  // tableauDansTableau([0, 1, 0, 0, 1, 1, 1, 0],[1, 1]) Permet de tester si [1, 1] est contenu dans [[0, 1], [0, 0], [1, 1], [1, 0]]\n  function tableauDansTableau (gdTableau, petitTableau) {\n    let test = false\n    let k = 0\n    do {\n      if (gdTableau[k] === petitTableau[0] && gdTableau[k + 1] === petitTableau[1]) test = true\n      k++\n      k++\n    } while (!test && k < gdTableau.length)\n    return test\n  }\n\n  let cheminsEE = [[1, 0]] // [[colonne,ligne]]\n  const casesVoisinesTableau = [[-1, 0], [0, 1], [1, 0], [0, -1]] // Nord ; Est ; Sud ; Ouest\n\n  // Fonction récursive qui recherche tous les chemins possibles à partir du point de départ caseActuelle, des points déjà parcourus et avec l'indice du chemin actuel dans le tableau actuel\n  function rechercheCheminsPossibles (caseActuelle, indiceCheminActuel, dejaParcourus) {\n    const casesPossibles = []\n    let prochaineCasePossible = []\n\n    for (const element of Visitables) {\n      prochaineCasePossible = [caseActuelle[0] + element[0], caseActuelle[1] + element[1]] // Test de l'ouest\n      if (prochaineCasePossible[0] === nbColonnes) { // On est arrivé\n        return [nbColonnes, prochaineCasePossible[1]]\n      } else if (!tableauDansTableau(dejaParcourus, prochaineCasePossible)) {\n        if (prochaineCasePossible[0] < nbColonnes + 1 && prochaineCasePossible[0] > 0 && prochaineCasePossible[1] < nbLignes && prochaineCasePossible[1] > -1) {\n          const casesVoisines = []\n          const elementPrecedent = [-1 * element[0], -1 * element[1]] // D'où vient la case actuelle ?\n          for (let k = 0; k < 4; k++) {\n            if (!(casesVoisinesTableau[k][0] === elementPrecedent[0] && casesVoisinesTableau[k][1] === elementPrecedent[1])) casesVoisines.push(casesVoisinesTableau[k])\n          }\n\n          let nonVoisin = true // Les cases voisines sont accessibles\n          for (const element2 of casesVoisines) { // Recherche si les cases voisines à la prochaine case possible n'ont pas déjà été parcourues.\n            nonVoisin = nonVoisin && !tableauDansTableau(dejaParcourus, [prochaineCasePossible[0] + element2[0], prochaineCasePossible[1] + element2[1]])\n          }\n          if (nonVoisin) casesPossibles.push(prochaineCasePossible) // Cette prochaine case possible est validée.\n        }\n      }\n    }\n    if (casesPossibles.length === 0) {\n      return [0, 0] // Case impossible, retour en arriere\n    } else {\n      let cheminAVenir\n      const tableauIndiceFuturChemin = []\n      for (let ee = casesPossibles.length - 1; ee > 0; ee--) { // Préparation à la création d'un nouveau chemin\n        cheminsEE.push([])\n        tableauIndiceFuturChemin[ee] = cheminsEE.length - 1\n      }\n      for (let ee = casesPossibles.length - 1; ee > 0; ee--) {\n        cheminsEE[tableauIndiceFuturChemin[ee]] = cheminsEE[indiceCheminActuel].concat(casesPossibles[ee]) // Le début du nouveau chemin correspond au chemin déjà en cours\n        cheminAVenir = rechercheCheminsPossibles(casesPossibles[ee], tableauIndiceFuturChemin[ee], dejaParcourus.concat(casesPossibles[ee]))\n        if (cheminAVenir !== undefined) {\n          cheminsEE[tableauIndiceFuturChemin[ee]].push(cheminAVenir[0])\n          cheminsEE[tableauIndiceFuturChemin[ee]].push(cheminAVenir[1])\n        }\n      }\n      cheminsEE[indiceCheminActuel].push(casesPossibles[0][0])\n      cheminsEE[indiceCheminActuel].push(casesPossibles[0][1])\n      const prochainChemin = rechercheCheminsPossibles(casesPossibles[0], indiceCheminActuel, dejaParcourus.concat(casesPossibles[0]))\n      if (prochainChemin !== undefined) {\n        cheminsEE[indiceCheminActuel].push(prochainChemin[0])\n        cheminsEE[indiceCheminActuel].push(prochainChemin[1])\n      }\n    }\n  }\n\n  // Fin de construction récursive de chemin\n\n  let cheminDejaParcouru = [1, 0]\n  const Visitables = [[1, 0], [0, -1], [-1, 0], [0, 1]] // Nord ; Est ; Sud ; Ouest\n  cheminsEE[0].push(rechercheCheminsPossibles([1, 0], 0, cheminDejaParcouru))\n  enleveElement(cheminsEE[0], undefined) // Obligé d'enlever un undefined qui traine sans savoir pourquoi.\n  let cheminTableauSimple = [[]]\n  cheminTableauSimple = arrayCopy(cheminsEE)\n\n  for (let k = 1; k < nbLignes; k++) {\n    cheminsEE = [[1, k]]\n    cheminDejaParcouru = [1, k]\n    cheminsEE[0].push(rechercheCheminsPossibles([1, k], 0, cheminDejaParcouru))\n    enleveElement(cheminsEE[0], undefined) // Obligé d'enlever un undefined qui traine sans savoir pourquoi.\n    cheminTableauSimple = cheminTableauSimple.concat(cheminsEE)\n  }\n\n  for (let k = cheminTableauSimple.length - 1; k >= 0; k--) { // On élimine les voies sans issues, celles se terminant par 0, 0\n    if (cheminTableauSimple[k][cheminTableauSimple[k].length - 2] === 0) cheminTableauSimple.splice(k, 1)\n  }\n  cheminTableauSimple.sort((a, b) => b.length - a.length) // On trie les chemins du plus court au plus long...\n\n  const chemins = []\n  let elementchemin = []\n\n  // Le passage ci-dessous est obligatoire pour passer d'un tableau 2d à un tableau 3d\n  // afin d'être en adéquation avec la fonction Labyrinthe() Version 1\n\n  for (let i = 0; i < cheminTableauSimple.length; i++) { // on double le nombre de chemins par Symétrie.\n    elementchemin = []\n    for (let j = 0; j < cheminTableauSimple[i].length / 2; j++) {\n      elementchemin.push([cheminTableauSimple[i][2 * j], cheminTableauSimple[i][2 * j + 1]])\n    }\n    chemins.push(elementchemin)\n  }\n  // Fin de construction de chemin (qui contient tous les chemins du labyrinthe)\n\n  // Gestion des vitesses : Escargot, ..., Guépard\n  let tableauDeVitesses = [] // Plus la vitesse est grande, moins le trajet est long\n  const vitessePetite = cheminTableauSimple[0].length\n  const vitesseGrande = cheminTableauSimple[cheminTableauSimple.length - 1].length\n  const ecartVitesse = (vitessePetite - vitesseGrande) / 4\n  for (let k = 0; k < 4; k++) {\n    tableauDeVitesses.push(cheminTableauSimple.findIndex((element) => element.length < vitessePetite - k * ecartVitesse))\n  }\n  tableauDeVitesses[4] = cheminTableauSimple.length\n  tableauDeVitesses = tableauDeVitesses.map(element => element - 1)\n\n  // Fin de la fonction Labytinthe()\n\n  // Mise en place des méthodes de cette fonction\n\n  /**\n   * Retourne un chemin en fonction du niveau de rapidité\n   * @memberof Labyrinthe\n   * @param {number} niveau Niveau de résolution du labyrinthe entre 1 (le plus lent) et 6 (le plus rapide).\n   * @example monCheminChoisi = laby.traceChemin(3) // Renvoie un chemin parmi tous ceux possibles, du labyrinthe laby, dont le niveau de rapidité est 3\n   * @author Jean-Claude Lhote (et EE pour la partie \"choix du nombre de lignes et de colonnes\")\n   * @return {Array.number[]}\n   */\n  // JSDOC Validee par EE Octobre 2022\n  this.choisitChemin = function (niveau) {\n    let choixchemin\n    switch (niveau) {\n      case 1:\n        choixchemin = randint(0, tableauDeVitesses[0])\n        break\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n        choixchemin = randint(tableauDeVitesses[niveau - 2] + 1, tableauDeVitesses[niveau - 1])\n        break\n      case 6:\n        choixchemin = randint(0, cheminTableauSimple.length - 1)\n        break\n    }\n    return chemins[choixchemin]\n  }\n\n  /**\n   * Retourne un ensemble d'objets correspondant aux murs du labyrinthe, par rapport à un chemin choisi\n   * @memberof Labyrinthe\n   * @param {Array.number[]} chemin Un chemin choisi parmi tous les chemins possibles.\n   * @param {number} [taille = 1] Taille des éléments de départ et de sortie\n   * @example lesMursDeMonLabyrinthe = laby.construitMurs(monCheminChoisi)\n   * // Renvoie les murs du labyrinthe laby correspondants au chemin monCheminChoisi.\n   * // Penser à faire mathalea2d(param, lesMursDeMonLabyrinthe) ensuite\n   * @author Jean-Claude Lhote (et EE pour la partie \"choix du nombre de lignes et de colonnes\")\n   * @return {ObjecMathalea2d[]}\n   */\n  // JSDOC Validee par EE Octobre 2022\n  this.construitMurs = function (chemin, taille) {\n    const objets = []\n    let s1\n    let s2\n    const choix = chemin[0][1]\n    for (let i = 0; i < nbColonnes; i++) { // Construction des T supérieurs et inférieurs\n      // T inférieurs\n      s1 = segment(point(i * 3, 1), point(i * 3, 2))\n      s1.epaisseur = 2\n      objets.push(s1)\n      // T supérieurs\n      s2 = segment(point(i * 3, 1 + 3 * nbLignes), point(i * 3, 3 * nbLignes))\n      s2.epaisseur = 2\n      objets.push(s2)\n    }\n\n    // Construction du bord gauche entre le départ et le labyrinthe\n    s1 = segment(point(0, 1 + 3 * nbLignes), point(0, 3 + choix * 3))\n    s1.epaisseur = 3\n    objets.push(s1)\n    s1 = segment(point(0, 1), point(0, 2 + choix * 3))\n    s1.epaisseur = 3\n    objets.push(s1)\n\n    // Construction case départ\n    s1 = segment(point(-3, 1 + choix * 3), point(0, 1 + choix * 3), 'green')\n    s1.epaisseur = 3\n    objets.push(s1)\n    s1 = segment(point(-3, 1 + choix * 3), point(-3, 4 + choix * 3), 'green')\n    s1.epaisseur = 3\n    objets.push(s1)\n    s1 = segment(point(-3, 4 + choix * 3), point(0, 4 + choix * 3), 'green')\n    s1.epaisseur = 3\n    objets.push(s1)\n    objets.push(texteParPoint('Start', point(-1.5, 2.5 + choix * 3), 'milieu', 'blue', taille, 0, false))\n\n    // les croix centrales communes à A et B\n    for (let i = 1; i < nbColonnes; i++) {\n      for (let k = 0; k < nbLignes - 1; k++) {\n        s1 = segment(point(i * 3, 5 + 3 * k), point(i * 3, 3 + 3 * k), 'black')\n        s1.epaisseur = 2\n        s2 = segment(point(i * 3 - 0.5, 4 + 3 * k), point(i * 3 + 0.5, 4 + 3 * k), 'black')\n        s2.epaisseur = 2\n        objets.push(s2, s1)\n      }\n    }\n    // le pourtour commun\n    s1 = segment(point(0, 1 + 3 * nbLignes), point(3 * nbColonnes, 1 + 3 * nbLignes))\n    s1.epaisseur = 3\n    objets.push(s1)\n    s1 = segment(point(3 * nbColonnes, 1 + 3 * nbLignes - 1), point(3 * nbColonnes, 1 + 3 * nbLignes))\n    s1.epaisseur = 3\n    objets.push(s1)\n    s1 = segment(point(3 * nbColonnes, 1), point(3 * nbColonnes, 2))\n    s1.epaisseur = 3\n    objets.push(s1)\n    s1 = segment(point(0, 1), point(3 * nbColonnes, 1))\n    s1.epaisseur = 3\n    objets.push(s1)\n\n    // les sorties\n    // La partie verticale\n    for (let i = 0; i < nbLignes - 1; i++) {\n      s1 = segment(point(3 * nbColonnes, 3 + i * 3), point(3 * nbColonnes, 5 + i * 3))\n      s1.epaisseur = 3\n      objets.push(s1)\n    }\n    // La partie horizontale\n    for (let i = 0; i < nbLignes; i++) {\n      s1 = segment(point(3 * nbColonnes, 2 + i * 3), point(3 * nbColonnes + 2, 2 + i * 3))\n      s1.epaisseur = 3\n      s2 = segment(point(3 * nbColonnes, 3 + i * 3), point(3 * nbColonnes + 2, 3 + i * 3))\n      s2.epaisseur = 3\n      objets.push(s1, s2)\n    }\n    // Le texte\n    for (let i = 1; i <= nbLignes; i++) {\n      objets.push(texteParPoint(`Exit ${i}`, point(3 * nbColonnes + 1.5, 2.5 + 3 * nbLignes - 3 * i), 'milieu', 'blue', taille, 0, false))\n    }\n    return objets\n  }\n\n  /**\n   * Retourne les traits signifiant le chemin correction\n   * @memberof Labyrinthe\n   * @param {Array.number[]} monchemin Un chemin choisi parmi tous les chemins possibles.\n   * @param {string} [color = 'brown'] Couleur du tracé de la correction : du type 'blue' ou du type '#f15929'\n   * @example laCorrectionDeMonLabyrinthe = laby.traceChemin(monCheminChoisi) // Renvoie les traits signifiant le chemin correction du labyrinthe laby correspondant au chemin monCheminChoisi\n   * @author Jean-Claude Lhote (et EE pour la partie \"choix du nombre de lignes et de colonnes\")\n   * @return {ObjecMathalea2d[]}\n   */\n  // JSDOC Validee par EE Octobre 2022\n  this.traceChemin = function (monchemin, color = 'brown') {\n    let y = monchemin[0][1]\n    let x = 0\n    const chemin2d = []\n    let s1\n    for (let j = 0; j < monchemin.length; j++) {\n      s1 = segment(point(x * 3 - 1.5, y * 3 + 2.5), point(monchemin[j][0] * 3 - 1.5, monchemin[j][1] * 3 + 2.5), color)\n      s1.pointilles = 5\n      s1.stylePointilles = 2\n      s1.epaisseur = 5\n      s1.opacite = 0.3\n      chemin2d.push(s1)\n      x = monchemin[j][0]\n      y = monchemin[j][1]\n    }\n    s1 = segment(point(x * 3 - 1.5, y * 3 + 2.5), point(x * 3 + 1.5, y * 3 + 2.5), color)\n    s1.pointilles = 5\n    s1.stylePointilles = 2\n    s1.epaisseur = 5\n    s1.opacite = 0.3\n    chemin2d.push(s1)\n    return chemin2d\n  }\n\n  /**\n   * Retourne la position convenable de tous les éléments (bons ou faux) du labyrinthe (nombre, texte, fraction)\n   * @memberof Labyrinthe\n   * @param {Array.number[]} monchemin Un chemin choisi parmi tous les chemins possibles.\n   * @param {number[]|string[]|Fraction[]} bonnesReponses Tableau de bonnes réponses\n   * @param {number[]|string[]|Fraction[]} mauvaisesReponses Tableau de mauvaises réponses\n   * @param {number} taille Taille des écritures dans les cases du labyrinthe\n   * @example aVotrePlace = laby.placeNombres(monCheminChoisi,reponsesOK,reponsesPasOK,1)\n   * // Place les bonnes (reponsesOK) et les mauvaises (reponsesPasOK) réponses dans les cases adéquates du labyrinthe laby correspondant au chemin monCheminChoisi\n   * @author Jean-Claude Lhote (et EE pour la partie \"choix du nombre de lignes et de colonnes\")\n   * @return {ObjecMathalea2d[]}\n   */\n  // JSDOC Validee par EE Octobre 2022\n  this.placeNombres = function (monChemin, bonnesReponses, mauvaisesReponses, taille) {\n    bonnesReponses = combinaisonListesSansChangerOrdre(bonnesReponses, monChemin.length)\n    mauvaisesReponses = combinaisonListesSansChangerOrdre(mauvaisesReponses, nbColonnes * nbLignes - monChemin.length)\n    const objets = []\n    const nombres = []\n    let trouve\n    let indexBonnesRep = 0\n    let indexMauvaisesRep = 0\n\n    for (let a = 0; a < nbColonnes; a++) {\n      nombres.push([0, 0])\n    }\n    for (let a = 1; a < nbColonnes + 1; a++) {\n      for (let b = 0; b < nbLignes; b++) {\n        trouve = false\n        for (let k = 0; k < monChemin.length; k++) {\n          if (monChemin[k][0] === a && monChemin[k][1] === b) trouve = true\n        }\n        if (!trouve) {\n          nombres[a - 1][b] = mauvaisesReponses[indexMauvaisesRep]\n          indexMauvaisesRep++\n        } else {\n          nombres[a - 1][b] = bonnesReponses[indexBonnesRep]\n          indexBonnesRep++\n        }\n      }\n    }\n    for (let a = 1; a < nbColonnes + 1; a++) {\n      for (let b = 0; b < nbLignes; b++) {\n        if (typeof (nombres[a - 1][b]) === 'number') {\n          objets.push(texteParPointEchelle(nombreAvecEspace(nombres[a - 1][b]), point(-1.5 + a * 3, 2.5 + b * 3), 'milieu', 'black', taille, 0, true, scaleFigure))\n        } else if (typeof (nombres[a - 1][b]) === 'string') { // écriture mode Maths\n          objets.push(texteParPositionEchelle(nombres[a - 1][b], -1.5 + a * 3, 2.5 + b * 3, 'milieu', 'black', taille, 0, true, scaleFigure))\n        } else {\n          objets.push(latexParCoordonnees(nombres[a - 1][b].texFraction, -1.5 + a * 3, 2.5 + b * 3, 'black', 20, 20, 'white', Math.max(6, 9 * taille)))\n        }\n      }\n    }\n    return objets\n  }\n}\n\n/**  Crée un ensemble de chemins possibles dans un labyrinthe. Cette fonction est à associer aux méthodes conçues pour.\n * @param {Object} parametres À saisir entre accolades\n * @param {number} [parametres.nbLignes = 3]\n * @param {number} [parametres.nbColonnes = 6]\n * @example laby = labyrinthe ({ nbLignes: 4, nbColonnes: 5 })\n * // Crée l'ensemble de chemins possibles dans un labyrinthe à 4 lignes et 5 colonnes\n * @author Jean-Claude Lhote & Eric Elter (améliorée par EE pour choisir le nombre de lignes et de colonnes)\n * @return {Labyrinthe}\n */\n// JSDOC Validee par EE Septembre 2022\nexport function labyrinthe ({ nbLignes = 3, nbColonnes = 6, scaleFigure = 1 } = {}) {\n  return new Labyrinthe({ nbLignes, nbColonnes, scaleFigure })\n}\n"],"names":["Labyrinthe","nbLignes","nbColonnes","scaleFigure","arrayCopy","arr","tableauDansTableau","gdTableau","petitTableau","test","k","cheminsEE","casesVoisinesTableau","rechercheCheminsPossibles","caseActuelle","indiceCheminActuel","dejaParcourus","casesPossibles","prochaineCasePossible","element","Visitables","casesVoisines","elementPrecedent","nonVoisin","element2","cheminAVenir","tableauIndiceFuturChemin","ee","prochainChemin","cheminDejaParcouru","enleveElement","cheminTableauSimple","a","b","chemins","elementchemin","i","j","tableauDeVitesses","vitessePetite","vitesseGrande","ecartVitesse","niveau","choixchemin","randint","chemin","taille","objets","s1","s2","choix","segment","point","texteParPoint","monchemin","color","y","x","chemin2d","monChemin","bonnesReponses","mauvaisesReponses","combinaisonListesSansChangerOrdre","nombres","trouve","indexBonnesRep","indexMauvaisesRep","texteParPointEchelle","nombreAvecEspace","texteParPositionEchelle","latexParCoordonnees","labyrinthe"],"mappings":"2GAgBO,SAASA,EAAY,CAAE,SAAAC,EAAW,EAAG,WAAAC,EAAa,EAAG,YAAAC,EAAc,CAAG,EAAG,GAAI,CAElF,SAASC,EAAWC,EAAK,CACvB,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAG,CAAC,CACtC,CAID,SAASC,EAAoBC,EAAWC,EAAc,CACpD,IAAIC,EAAO,GACPC,EAAI,EACR,GACMH,EAAUG,CAAC,IAAMF,EAAa,CAAC,GAAKD,EAAUG,EAAI,CAAC,IAAMF,EAAa,CAAC,IAAGC,EAAO,IACrFC,IACAA,UACO,CAACD,GAAQC,EAAIH,EAAU,QAChC,OAAOE,CACR,CAED,IAAIE,EAAY,CAAC,CAAC,EAAG,CAAC,CAAC,EACvB,MAAMC,EAAuB,CAAC,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,CAAC,EAG9D,SAASC,EAA2BC,EAAcC,EAAoBC,EAAe,CACnF,MAAMC,EAAiB,CAAE,EACzB,IAAIC,EAAwB,CAAE,EAE9B,UAAWC,KAAWC,EAAY,CAEhC,GADAF,EAAwB,CAACJ,EAAa,CAAC,EAAIK,EAAQ,CAAC,EAAGL,EAAa,CAAC,EAAIK,EAAQ,CAAC,CAAC,EAC/ED,EAAsB,CAAC,IAAMhB,EAC/B,MAAO,CAACA,EAAYgB,EAAsB,CAAC,CAAC,EACvC,GAAI,CAACZ,EAAmBU,EAAeE,CAAqB,GAC7DA,EAAsB,CAAC,EAAIhB,EAAa,GAAKgB,EAAsB,CAAC,EAAI,GAAKA,EAAsB,CAAC,EAAIjB,GAAYiB,EAAsB,CAAC,EAAI,GAAI,CACrJ,MAAMG,EAAgB,CAAE,EAClBC,EAAmB,CAAC,GAAKH,EAAQ,CAAC,EAAG,GAAKA,EAAQ,CAAC,CAAC,EAC1D,QAAST,EAAI,EAAGA,EAAI,EAAGA,IACfE,EAAqBF,CAAC,EAAE,CAAC,IAAMY,EAAiB,CAAC,GAAKV,EAAqBF,CAAC,EAAE,CAAC,IAAMY,EAAiB,CAAC,GAAID,EAAc,KAAKT,EAAqBF,CAAC,CAAC,EAG7J,IAAIa,EAAY,GAChB,UAAWC,KAAYH,EACrBE,EAAYA,GAAa,CAACjB,EAAmBU,EAAe,CAACE,EAAsB,CAAC,EAAIM,EAAS,CAAC,EAAGN,EAAsB,CAAC,EAAIM,EAAS,CAAC,CAAC,CAAC,EAE1ID,GAAWN,EAAe,KAAKC,CAAqB,CACzD,CAEJ,CACD,GAAID,EAAe,SAAW,EAC5B,MAAO,CAAC,EAAG,CAAC,EACP,CACL,IAAIQ,EACJ,MAAMC,EAA2B,CAAE,EACnC,QAASC,EAAKV,EAAe,OAAS,EAAGU,EAAK,EAAGA,IAC/ChB,EAAU,KAAK,EAAE,EACjBe,EAAyBC,CAAE,EAAIhB,EAAU,OAAS,EAEpD,QAASgB,EAAKV,EAAe,OAAS,EAAGU,EAAK,EAAGA,IAC/ChB,EAAUe,EAAyBC,CAAE,CAAC,EAAIhB,EAAUI,CAAkB,EAAE,OAAOE,EAAeU,CAAE,CAAC,EACjGF,EAAeZ,EAA0BI,EAAeU,CAAE,EAAGD,EAAyBC,CAAE,EAAGX,EAAc,OAAOC,EAAeU,CAAE,CAAC,CAAC,EAC/HF,IAAiB,SACnBd,EAAUe,EAAyBC,CAAE,CAAC,EAAE,KAAKF,EAAa,CAAC,CAAC,EAC5Dd,EAAUe,EAAyBC,CAAE,CAAC,EAAE,KAAKF,EAAa,CAAC,CAAC,GAGhEd,EAAUI,CAAkB,EAAE,KAAKE,EAAe,CAAC,EAAE,CAAC,CAAC,EACvDN,EAAUI,CAAkB,EAAE,KAAKE,EAAe,CAAC,EAAE,CAAC,CAAC,EACvD,MAAMW,EAAiBf,EAA0BI,EAAe,CAAC,EAAGF,EAAoBC,EAAc,OAAOC,EAAe,CAAC,CAAC,CAAC,EAC3HW,IAAmB,SACrBjB,EAAUI,CAAkB,EAAE,KAAKa,EAAe,CAAC,CAAC,EACpDjB,EAAUI,CAAkB,EAAE,KAAKa,EAAe,CAAC,CAAC,EAEvD,CACF,CAID,IAAIC,EAAqB,CAAC,EAAG,CAAC,EAC9B,MAAMT,EAAa,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EACpDT,EAAU,CAAC,EAAE,KAAKE,EAA0B,CAAC,EAAG,CAAC,EAAG,EAAGgB,CAAkB,CAAC,EAC1EC,EAAcnB,EAAU,CAAC,EAAG,MAAS,EACrC,IAAIoB,EAAsB,CAAC,EAAE,EAC7BA,EAAsB3B,EAAUO,CAAS,EAEzC,QAASD,EAAI,EAAGA,EAAIT,EAAUS,IAC5BC,EAAY,CAAC,CAAC,EAAGD,CAAC,CAAC,EACnBmB,EAAqB,CAAC,EAAGnB,CAAC,EAC1BC,EAAU,CAAC,EAAE,KAAKE,EAA0B,CAAC,EAAGH,CAAC,EAAG,EAAGmB,CAAkB,CAAC,EAC1EC,EAAcnB,EAAU,CAAC,EAAG,MAAS,EACrCoB,EAAsBA,EAAoB,OAAOpB,CAAS,EAG5D,QAASD,EAAIqB,EAAoB,OAAS,EAAGrB,GAAK,EAAGA,IAC/CqB,EAAoBrB,CAAC,EAAEqB,EAAoBrB,CAAC,EAAE,OAAS,CAAC,IAAM,GAAGqB,EAAoB,OAAOrB,EAAG,CAAC,EAEtGqB,EAAoB,KAAK,CAACC,EAAGC,IAAMA,EAAE,OAASD,EAAE,MAAM,EAEtD,MAAME,EAAU,CAAE,EAClB,IAAIC,EAAgB,CAAE,EAKtB,QAASC,EAAI,EAAGA,EAAIL,EAAoB,OAAQK,IAAK,CACnDD,EAAgB,CAAE,EAClB,QAASE,EAAI,EAAGA,EAAIN,EAAoBK,CAAC,EAAE,OAAS,EAAGC,IACrDF,EAAc,KAAK,CAACJ,EAAoBK,CAAC,EAAE,EAAIC,CAAC,EAAGN,EAAoBK,CAAC,EAAE,EAAIC,EAAI,CAAC,CAAC,CAAC,EAEvFH,EAAQ,KAAKC,CAAa,CAC3B,CAID,IAAIG,EAAoB,CAAE,EAC1B,MAAMC,EAAgBR,EAAoB,CAAC,EAAE,OACvCS,EAAgBT,EAAoBA,EAAoB,OAAS,CAAC,EAAE,OACpEU,GAAgBF,EAAgBC,GAAiB,EACvD,QAAS9B,EAAI,EAAGA,EAAI,EAAGA,IACrB4B,EAAkB,KAAKP,EAAoB,UAAWZ,GAAYA,EAAQ,OAASoB,EAAgB7B,EAAI+B,CAAY,CAAC,EAEtHH,EAAkB,CAAC,EAAIP,EAAoB,OAC3CO,EAAoBA,EAAkB,IAAInB,GAAWA,EAAU,CAAC,EAehE,KAAK,cAAgB,SAAUuB,EAAQ,CACrC,IAAIC,EACJ,OAAQD,EAAM,CACZ,IAAK,GACHC,EAAcC,EAAQ,EAAGN,EAAkB,CAAC,CAAC,EAC7C,MACF,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACHK,EAAcC,EAAQN,EAAkBI,EAAS,CAAC,EAAI,EAAGJ,EAAkBI,EAAS,CAAC,CAAC,EACtF,MACF,IAAK,GACHC,EAAcC,EAAQ,EAAGb,EAAoB,OAAS,CAAC,EACvD,KACH,CACD,OAAOG,EAAQS,CAAW,CAC3B,EAcD,KAAK,cAAgB,SAAUE,EAAQC,EAAQ,CAC7C,MAAMC,EAAS,CAAE,EACjB,IAAIC,EACAC,EACJ,MAAMC,EAAQL,EAAO,CAAC,EAAE,CAAC,EACzB,QAAST,EAAI,EAAGA,EAAIlC,EAAYkC,IAE9BY,EAAKG,EAAQC,EAAMhB,EAAI,EAAG,CAAC,EAAGgB,EAAMhB,EAAI,EAAG,CAAC,CAAC,EAC7CY,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EAEdC,EAAKE,EAAQC,EAAMhB,EAAI,EAAG,EAAI,EAAInC,CAAQ,EAAGmD,EAAMhB,EAAI,EAAG,EAAInC,CAAQ,CAAC,EACvEgD,EAAG,UAAY,EACfF,EAAO,KAAKE,CAAE,EAIhBD,EAAKG,EAAQC,EAAM,EAAG,EAAI,EAAInD,CAAQ,EAAGmD,EAAM,EAAG,EAAIF,EAAQ,CAAC,CAAC,EAChEF,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdA,EAAKG,EAAQC,EAAM,EAAG,CAAC,EAAGA,EAAM,EAAG,EAAIF,EAAQ,CAAC,CAAC,EACjDF,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EAGdA,EAAKG,EAAQC,EAAM,GAAI,EAAIF,EAAQ,CAAC,EAAGE,EAAM,EAAG,EAAIF,EAAQ,CAAC,EAAG,OAAO,EACvEF,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdA,EAAKG,EAAQC,EAAM,GAAI,EAAIF,EAAQ,CAAC,EAAGE,EAAM,GAAI,EAAIF,EAAQ,CAAC,EAAG,OAAO,EACxEF,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdA,EAAKG,EAAQC,EAAM,GAAI,EAAIF,EAAQ,CAAC,EAAGE,EAAM,EAAG,EAAIF,EAAQ,CAAC,EAAG,OAAO,EACvEF,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdD,EAAO,KAAKM,EAAc,QAASD,EAAM,KAAM,IAAMF,EAAQ,CAAC,EAAG,SAAU,OAAQJ,EAAQ,EAAG,EAAK,CAAC,EAGpG,QAASV,EAAI,EAAGA,EAAIlC,EAAYkC,IAC9B,QAAS1B,EAAI,EAAGA,EAAIT,EAAW,EAAGS,IAChCsC,EAAKG,EAAQC,EAAMhB,EAAI,EAAG,EAAI,EAAI1B,CAAC,EAAG0C,EAAMhB,EAAI,EAAG,EAAI,EAAI1B,CAAC,EAAG,OAAO,EACtEsC,EAAG,UAAY,EACfC,EAAKE,EAAQC,EAAMhB,EAAI,EAAI,GAAK,EAAI,EAAI1B,CAAC,EAAG0C,EAAMhB,EAAI,EAAI,GAAK,EAAI,EAAI1B,CAAC,EAAG,OAAO,EAClFuC,EAAG,UAAY,EACfF,EAAO,KAAKE,EAAID,CAAE,EAItBA,EAAKG,EAAQC,EAAM,EAAG,EAAI,EAAInD,CAAQ,EAAGmD,EAAM,EAAIlD,EAAY,EAAI,EAAID,CAAQ,CAAC,EAChF+C,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdA,EAAKG,EAAQC,EAAM,EAAIlD,EAAY,EAAI,EAAID,EAAW,CAAC,EAAGmD,EAAM,EAAIlD,EAAY,EAAI,EAAID,CAAQ,CAAC,EACjG+C,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdA,EAAKG,EAAQC,EAAM,EAAIlD,EAAY,CAAC,EAAGkD,EAAM,EAAIlD,EAAY,CAAC,CAAC,EAC/D8C,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EACdA,EAAKG,EAAQC,EAAM,EAAG,CAAC,EAAGA,EAAM,EAAIlD,EAAY,CAAC,CAAC,EAClD8C,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EAId,QAASZ,EAAI,EAAGA,EAAInC,EAAW,EAAGmC,IAChCY,EAAKG,EAAQC,EAAM,EAAIlD,EAAY,EAAIkC,EAAI,CAAC,EAAGgB,EAAM,EAAIlD,EAAY,EAAIkC,EAAI,CAAC,CAAC,EAC/EY,EAAG,UAAY,EACfD,EAAO,KAAKC,CAAE,EAGhB,QAASZ,EAAI,EAAGA,EAAInC,EAAUmC,IAC5BY,EAAKG,EAAQC,EAAM,EAAIlD,EAAY,EAAIkC,EAAI,CAAC,EAAGgB,EAAM,EAAIlD,EAAa,EAAG,EAAIkC,EAAI,CAAC,CAAC,EACnFY,EAAG,UAAY,EACfC,EAAKE,EAAQC,EAAM,EAAIlD,EAAY,EAAIkC,EAAI,CAAC,EAAGgB,EAAM,EAAIlD,EAAa,EAAG,EAAIkC,EAAI,CAAC,CAAC,EACnFa,EAAG,UAAY,EACfF,EAAO,KAAKC,EAAIC,CAAE,EAGpB,QAASb,EAAI,EAAGA,GAAKnC,EAAUmC,IAC7BW,EAAO,KAAKM,EAAc,QAAQjB,CAAC,GAAIgB,EAAM,EAAIlD,EAAa,IAAK,IAAM,EAAID,EAAW,EAAImC,CAAC,EAAG,SAAU,OAAQU,EAAQ,EAAG,EAAK,CAAC,EAErI,OAAOC,CACR,EAYD,KAAK,YAAc,SAAUO,EAAWC,EAAQ,QAAS,CACvD,IAAIC,EAAIF,EAAU,CAAC,EAAE,CAAC,EAClBG,EAAI,EACR,MAAMC,EAAW,CAAE,EACnB,IAAIV,EACJ,QAASX,EAAI,EAAGA,EAAIiB,EAAU,OAAQjB,IACpCW,EAAKG,EAAQC,EAAMK,EAAI,EAAI,IAAKD,EAAI,EAAI,GAAG,EAAGJ,EAAME,EAAUjB,CAAC,EAAE,CAAC,EAAI,EAAI,IAAKiB,EAAUjB,CAAC,EAAE,CAAC,EAAI,EAAI,GAAG,EAAGkB,CAAK,EAChHP,EAAG,WAAa,EAChBA,EAAG,gBAAkB,EACrBA,EAAG,UAAY,EACfA,EAAG,QAAU,GACbU,EAAS,KAAKV,CAAE,EAChBS,EAAIH,EAAUjB,CAAC,EAAE,CAAC,EAClBmB,EAAIF,EAAUjB,CAAC,EAAE,CAAC,EAEpB,OAAAW,EAAKG,EAAQC,EAAMK,EAAI,EAAI,IAAKD,EAAI,EAAI,GAAG,EAAGJ,EAAMK,EAAI,EAAI,IAAKD,EAAI,EAAI,GAAG,EAAGD,CAAK,EACpFP,EAAG,WAAa,EAChBA,EAAG,gBAAkB,EACrBA,EAAG,UAAY,EACfA,EAAG,QAAU,GACbU,EAAS,KAAKV,CAAE,EACTU,CACR,EAeD,KAAK,aAAe,SAAUC,EAAWC,EAAgBC,EAAmBf,EAAQ,CAClFc,EAAiBE,EAAkCF,EAAgBD,EAAU,MAAM,EACnFE,EAAoBC,EAAkCD,EAAmB3D,EAAaD,EAAW0D,EAAU,MAAM,EACjH,MAAMZ,EAAS,CAAE,EACXgB,EAAU,CAAE,EAClB,IAAIC,EACAC,EAAiB,EACjBC,EAAoB,EAExB,QAASlC,EAAI,EAAGA,EAAI9B,EAAY8B,IAC9B+B,EAAQ,KAAK,CAAC,EAAG,CAAC,CAAC,EAErB,QAAS/B,EAAI,EAAGA,EAAI9B,EAAa,EAAG8B,IAClC,QAASC,EAAI,EAAGA,EAAIhC,EAAUgC,IAAK,CACjC+B,EAAS,GACT,QAAStD,EAAI,EAAGA,EAAIiD,EAAU,OAAQjD,IAChCiD,EAAUjD,CAAC,EAAE,CAAC,IAAMsB,GAAK2B,EAAUjD,CAAC,EAAE,CAAC,IAAMuB,IAAG+B,EAAS,IAE1DA,GAIHD,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,EAAI2B,EAAeK,CAAc,EACjDA,MAJAF,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,EAAI4B,EAAkBK,CAAiB,EACvDA,IAKH,CAEH,QAASlC,EAAI,EAAGA,EAAI9B,EAAa,EAAG8B,IAClC,QAASC,EAAI,EAAGA,EAAIhC,EAAUgC,IACxB,OAAQ8B,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,GAAO,SACjCc,EAAO,KAAKoB,EAAqBC,EAAiBL,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,CAAC,EAAGmB,EAAM,KAAOpB,EAAI,EAAG,IAAMC,EAAI,CAAC,EAAG,SAAU,QAASa,EAAQ,EAAG,GAAM3C,CAAW,CAAC,EAC/I,OAAQ4D,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,GAAO,SACxCc,EAAO,KAAKsB,EAAwBN,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,EAAG,KAAOD,EAAI,EAAG,IAAMC,EAAI,EAAG,SAAU,QAASa,EAAQ,EAAG,GAAM3C,CAAW,CAAC,EAElI4C,EAAO,KAAKuB,EAAoBP,EAAQ/B,EAAI,CAAC,EAAEC,CAAC,EAAE,YAAa,KAAOD,EAAI,EAAG,IAAMC,EAAI,EAAG,QAAS,GAAI,GAAI,QAAS,KAAK,IAAI,EAAG,EAAIa,CAAM,CAAC,CAAC,EAIlJ,OAAOC,CACR,CACH,CAYO,SAASwB,EAAY,CAAE,SAAAtE,EAAW,EAAG,WAAAC,EAAa,EAAG,YAAAC,EAAc,CAAG,EAAG,GAAI,CAClF,OAAO,IAAIH,EAAW,CAAE,SAAAC,EAAU,WAAAC,EAAY,YAAAC,CAAW,CAAE,CAC7D"}