GreKo 2015 ML - Echecs et informatique sur PC-Windows

Rechercher
Aller au contenu

Menu principal :

Moteurs


Greko 2015 ML
L'ancienne version programmable


J'ai découvert fortuitement, en lisant un article sur les joueurs simulés de Lucas Chess, que les anciennes versions de GreKo permettaient de créer de nouvelles personnalités. La dernière à le proposer aura été la 2015 ML(1). Cette version était créditée d'une force de 2600 Elo - contre 2800 Elo pour Greko 2021, évolution la plus récente du moteur(2). Elle est donc sensiblement moins forte, mais la création de personnalité différente du réglage standards du moteur est une aptitude interessante, utilisé depuis plusieurs années par l'interface Lucas Chess pour générer quelques uns des nombreux joueurs fictifs du programme. Depuis la version 7.9, le nombre de critères disponibles a peu augmenté mais la qualité de jeu est par contre en forte hausse. Les erreurs grossières sont devenues beaucoup plus rares et le jeu du moteur plus réaliste, plus proche du jeu humain.
GreKo est naturellement un moteur plutôt tactique et offensif, conçu davantage pour l'attaque, avec un style qui ressemble à celui de Kasparov. Mais contrairement à beaucoup de forts moteurs tactiques, qui misent trop sur le calcul, il peut s'appuyer sur une bonne maîtrise de la position. C'est donc un moteur polyvalent, qui pourra être utilisé avec succès pour créer des personnalités fortement positionnelles ou même défensives.

Pour les généralités sur GreKo, voir la page dédiée à ce moteur. Cet article a pour but de souligner les particularités de la version 2015, notamment en matière de programmation de personnalités.

(1) ML signifie "Machine learning". Autrement dit, il s'agit d'un module d'apprentissage automatique qui est activé depuis une commande console. Je ne l'ai pas utilisé, je signale le fait pour être complet. Notez que c'est la seule différence entre GreKo 2015 et GreKo 2015 ML. Pour en savoir plus, lisez le fichier "history.txt" qui se trouve à la racine du répertoire du moteur.

(2) Je ne parle pas de GreKo 2021 NNUE, version expérimentale à intelligence hybride (mi-algorithmique, mi-neuronale) dont la force est de l'ordre de 3000 Elo.


Plan de l'article

Téléchargement
Les paramètres de la version 2015
  Paramètres généraux
  Paramètres de la recherche
  Réglages de personnalité
Programmation de personnalités
  Bibliothèques d'ouvertures
  Procédure avec Arena
  Arena GreKo
Quelques propositions de personnalités
  Personnalité par défaut
  Balanced
  Defender
  Tactical
  Positional
  Warrior
  Classement des joueurs
Utiliser GreKo avec le protocole Winboard




Téléchargement

GreKo 2015 ML est téléchargeable avec toutes les autres versions du moteur sur le site de l'auteur. Je précise que la version GreKo 2015 est identique à la version 2015 ML sauf sur un point : elle n'intègre pas le module d'apprentissage. Vous pouvez donc l'utiliser de la même façon et vous obtiendrez les mêmes résultats.


Les paramètres de la version 2015 ML

Le menu de configuration de GreKo 2015 est beaucoup plus chargé que celui de la version la plus récente du moteur. Pas de quoi paniquer : l'essentiel concerne la programmation de personnalité et ce n'est pas tellement compliqué. Je rappelle que pour l'interface Arena, on y accède depuis le menu "Modules" > "Modules 1" (ou "Module 2") > "Configurer" ou Ctrl+1 . N'oubliez pas toutefois que le moteur doit déjà être sélectionné. Si ce n'est pas le cas, ouvrir le menu "Modules" > "Gérer" (ou F11) puis de l'ongler "Choix", sélectionner un ou deux des moteurs installés dans l'interface et validez par "Ok" ou "Appliquer".
Voici comment ce menu se présente dans Arena :



Il y a trois paramètres généraux, des paramètres de réglage de l'évaluation et des paramètres de réglage de la recherche.


Paramètres généraux

Il s'agit de Hash, MultiPv et LimitKnps. Seul Hash est vraiment important à connaître.

Hash : une classique table de hachage à régler en taille. Par défaut elle à 32 Mo, valeur très basse. Vous pouvez certainement la porter sans soucis à 128 Mo. 256 Mo est encore mieux mais il est inutile d'aller au delà car le gain serait pratiquement nul.

MultiPv : le Multi-Pv est désactivé par défaut (sur "1") et devrait le rester. Demander au moteur de suivre plusieurs lignes à la fois équivaut à abaisser fortement sa force. Pour seulement une deuxième ligne, la chute est déjà de 200 points Elo.  Le Multi-Pv a d'ailleurs été purement et simplement supprimé des versions postérieures de GreKo.

LimitKnps : il est possible ici de limiter le nombre de noeuds explorés par le moteur. Par défaut le champ est à 9999 (centaines de Nps), c'est à dire en fait sans aucune limitation. LimitKnps n'est d'aucun intérêt si on utilise GreKo comme un moteur UCI. En effet, il est possible de réduire la force depuis l'interface grâce à la commande UCI_Elo (ici entre 1600 et 2400 - ou à la force maximale). Avec Arena, menu "Niveau" > "Limite Elo de la force de jeu".

Cela peut être utile par contre à ceux qui font tourner le moteur en mode Winboard.  Pour ces courageux voici un tableau de correspondence approximative entre Nps et force pour GreKo 2015 :




Paramètres de la recherche

Moteur moderne, GreKo est doté d'une recherche performante, assistée de nombreuses heuristiques d'élagage - procédés qui éliminent les branches non-productives de l'arborescence des coups.  Certaines de ces heuristiques sont réglables,  disons, pour simplifier, en intensité ; car un élagage vigoureux augmente la force mais diminue la qualité de jeu, certaines positions peuvant être très mal comprises et éliminées à tort par les routines d'élagage. Ici, il s'agit principalement de Lazy Evaluation (LazyEvalMargin), Null Move Pruning  (MoveRéduction, MoveMinDepth, PruningMargin) et Late Move Reduction (LmrMinDepth, LmrMinMoveNumber et Qchecks).
Les paramètres par défaut constituent un choix optimal conjuguant un niveau de force élevé avec une excellente qualité de jeu.  Je conseille de ne pas les modifier.  



Réglages de personnalité

Nous entrons ici dans le vif du sujet qui nous intéresse. Voici les sept paramètres réglables permettant d'influer sur le style du moteur :

Material

Ce paramètre permet de régler la valeur du matériel.  La plage de réglage se situe entre 0 et 100 ; valeur par défaut, 50.  Avec des valeur inférieures à 50, GreKo devient plus "spéculatif", plus prompt à échanger des pièces ; des valeurs plus élevées le poussent au contraire à conserver ses pièces et à s'emparer de celles de son adversaire. Les joueurs offensifs sont en général peu matérialistes et accordent au matériel une valeur inférieure à celle que retiendrait un joueur défensif et positionnel.


Board Control

A priori, à voir comment le moteur réagit sur des valeurs extrêmes, ce paramètre semble l'équivalent du Center Control du moteur The King, qui sert à déterminer le "désir" plus ou moins grand du moteur de mener le jeu au centre. Plage de réglage entre 0 et 100.  Par défaut, 60.

Mobility

Ce paramètre affecte l'évaluation de la mobilité (et donc de l'activité) des deux camps ; des valeurs supérieures à 40 conduisent le moteur vers des positions où ses pièces ont une grande mobilité - c'est-à-dire beaucoup de coups possibles -  alors que des valeurs plus basses rendent le jeu du moteur plus statique. Plage de réglage entre 0 et 100.  Par défaut, 40.
A des valeurs très élevées, GreKo a tendance à devenir un "grinder" : il essaie de maximiser sa mobilité mais aussi d'étouffer son adversaire, en limitant ses mouvements.

PawnStruct

Règle le soucis du moteur d'avoir une bonne structure de pions. Plus la valeur est élevée, plus le moteur est attentif à conserver une position solide. Plage de réglage entre 0 et 100.  Par défaut, 40.
Un joueur offensif aimant prendre et garder l'initiative portera une attention plus faible à la solidité de sa structure de pions. Un joueur fortement positionnel fera le contraire.

PawnPassed

Modifie la tendance du moteur à créer les conditions pour obtenir un ou plusieurs pions passés. ou conserver un ou plusieurs pions passés. En dessus de 50, le moteur cherchera davantage à obtenir des pions passés au détriment d'autres facteurs ; il les évitera dans le cas de valeurs plus faibles. Plage de réglage entre 0 et 100. Par défaut 60.

KingSafety

Modifie le comportement du moteur concernant la sécurité de son roi et de celui de l'adversaire. Des valeurs supérieures à 50 forcent le moteur à être plus prudent et à mobiliser davantage de pièces pour la protection de son roi (posture défensive) ;  des valeurs plus basses aboutissent au comportement inverse : le joueur va privilégier la mobilisation de ses pièces pour l'attaque de l'adversaire. Plage de réglage entre 0 et 100.  Par défaut 50.

DrawScore

Détermine l'attitude du moteur vis-à-vis de la nullité. Plus le chiffre est élevé, plus la personnalité sera réticente à accepter la nullité dans une position qui lui est défavorable. C'est l'équivalent du paramètre Contempt que proposent beaucoup de moteurs. Plage de réglage entre -1200 (hyper-frileux) et + 1200 (ne renonce jamais). Par défaut, 0.



Programmation de personnalités

En termes de capacités de programmation, GreKo 2015 est assez comparable à CDrill. Avec seulement six paramètres  agissant sur l'évaluation, on ne peut pas envisager de reproduire le jeu de tel ou tel grand maître mais on peut créer des personnalités bien typées.  Dans ce domaine, le moteur du programme NagaSkaki permet une programmation plus fine avec dix paramètres agissant sur l'évaluation, dont cinq concernent le poids des pièces et le dernier ayant pour fonction de créer du flou dans le jeu du moteur.
Bien que je préfère CDrill, GreKo 2015 est également excellent. C'est un moteur polyvalent,  à l'aise aussi bien en attaque qu'en défense et son jeu est de grande qualité.  Au fils des versions, Vladimir Medvedev a corrigé la plupart des aberrations que l'on observait encore sur la v7.9. Sur ce plan, le 2015 est aussi bon que CDrill 2000 et NagaSkaki.
Certains utilisateurs pourraient aussi trouver utile d'avoir un moteur de force élevé. Avec ses 2600 Elo, Greko 2015 est bien plus fort que CDrill (2000 Elo) et que NagaSkaki (2200 Elo).


Bibliothèques d'ouvertures


GreKo utilise une petite bibliothèque interne contenue dans le fichier "book.bin". Malgré les apparences, elle n'est pas au format Polyglot. Aucune autre bibliothèque "*.bin" n'est acceptée. C'est un peu dommage car nous aimerions pouvoir doter chaque personnalité d'une bibliothèque correspondant à son style. La plupart des interfaces permettent toutefois de débrayer la bibliothèque interne du moteur pour la remplacer par une autre, gérée par l'interface. Si vous utilisez Arena  il suffit de forcer l'usage de l'une des bibliothèques Abk qu'elle contient.  Je peux d'ailleurs vous en proposer toute une collection : pour accompagner les profils de grands maîtres du moteur The King de Chessmaster, j'ai créé 49 petites bibliothèques Abk avec des milliers de parties de ces joueurs. Elles peuvent fournir jusqu'à 12 1/2 coup d'une partie, l'objectif étant de guider le démarrage du moteur et non la performance. Parmi ces 49 bibliothèques, vous en trouverez forcément une qui pourrait s'accorder avec les styles de vos créations.

Télécharger le pack de bibliothèque d'ouvertures au format Abk ?



Procédure avec Arena

GreKo a le même défaut que CDrill : rien n'est prévu pour sauvegarder une personnalité modifiée ; du moins lorsque le moteur fonctionne avec le protocole UCI. Pour créer une nouvelle personnalité, le seul moyen est de modifier les paramètres d'un GreKo 2015 déjà installé depuis son menu de configuration. Par contre, si c'est le protocole de communication xboard qui est utilisé, les nouveaux paramètres seront sauvegardés dans un fichier "ini" et il sera possible de les réutiliser. J'y reviens plus loin, dans une section séparée.

Je ne peux pas fournir une procédure pour toutes les interfaces avec lesquelles GreKo pourrait être utilisé, mais je vais le faire pour Arena, interface partoculièrement bien adaptée aux moteurs programmables. De plus je fournirai plus bas une version portable d'Arena avec toutes mes personnalités déjà installées et dotées de nombreuses bibliothèques.

Pour installer GreKo dans Arena, suivre la procédure habituelle : menu "Modules" > "Installer nouveau module" et allez chercher le fichier "GreKo.exe". A partir de là, deux possibilités :

➤Créer plusieurs personnalités en utlisant le même "GreKo.exe". Lorsque vous demandez à Arena d'installer plusieurs fois le même moteur, l'interface vous propose en effet un nom provisoire, comme "GreKo [001]", "GreKo  [002]", "GreKo  [003]"... Vous pourrez ensuite pour chacun d'eux d'adapter les réglages de personnalité et donnner aux copies des noms plus explicites. L'inconvénient de cette solution est que le moteur utilisera toujours la même bibliothèque.
➤Dupliquer GreKo dans le dossier "Egines" d'Arena autant de fois qu'il y a de personnalités puis installer toutes ces copies séparément. Puis doter chacun de ces moteurs d'une nouvelle personnalité et d'une bibliothèque dédiée. C'est une solution plus longue à mettre en oeuvre mais c'est la meilleure. Voyons celle-ci en détail...

Un moteur GreKo par personnalité avec Arena

Voyons comment cela fonctionne en supposant que nous voulions intégrer une déclinaison de GreKo dotée d'une personnalité appelée "Positional" :

Préparation

➤Faire une copie du dossier de GreKo dans le répertoire "Engine" d'Arena en lui donnant un nom explicite. Ici "Positional".
➤Renommer le fichier "GreKo.exe" en "Positional.exe".
Si l'on compte utiliser une bibliothèque autre que celle du moteur, supprimer le fichier "Book.bin".

Prise en compte du nouveau moteur par l'interface

Menu "Modules" > "Installer nouveau module". Utilisez le sélecteur de fichiers pour aller chercher le nouveau moteur, ici "Positional.exe". En principe, "UCI" est sélectionné. Cliquez sur "Ok" puis acceptez de "démarrer le nouveau module". GreKo version "Positional" sera maintenant disponible dans la liste des moteurs installés dans Arena.

Configuration du nouveau moteur

A cette étape, on règle les paramètres généraux du moteur et on modifie la personnalité du moteur : menu "Modules" > "Module 1" > "Configurer" ou Ctrl +1.
➤Portez la table de hash à 128 Mo (vous pouvez aller jusqu'à 256 Mo)
➤Changez les valeurs des critères de personnalisation en recopiant ceux de la personnalité Positional, ci-dessous (ou la votre bien sûr !)
➤Cliquez sur "Ok".

Liaison avec une bibliothèque abk

➤Assurez-vous que la bibliothèque que vous souhaitez utiliser se trouve bien dans le répertoire "Books" d'Arena.
➤Associez la copie de GreKo avec la bonne bibliothèque : menu "Module" > "Gérer" (ou F11). Cherchez le moteur "Positional" dans la liste des moteurs disponibles et sélectionnez-le. Ouvrez l'onglet "Bibliothèque" et utilisez le sélecteur de fichiers pour aller chercher la bonne bibliothèque.
➤Enfin, décochez la case "Utilisez la bibliothèque principale d'Arena avec ce module" (si elle est cochée).

Utilisation

Pour jouer avec la personnalité Positional : menu "Modules" > "Gérer" ou F11. Sélectionnez l'onglet "Choix" et choisissez le moteur "Positional" dans la liste. Si vous ne connaissez pas encore Arena, je vous invite à lire le mode d'emploi que je lui consacre sur ce site.

Bien sûr, il faut recommencer tout le processus pour chaque personnalité.


Arena GreKo

Pour ceux qui aimeraient une interface prête à l'emploi avec tous les moteurs déjà installés, je vous propose de télécharger ici une version portable d'Arena avec GreKo et les six personnalités décrites ci-dessous. Chaque personnalité a sa bibliothèque présente et activée, la table de Hash est sur 128 Mo et les paramètres des personnalités sont préréglées. L'interface est francisée et tout ce qui était superflu a été supprimé, notamment les autres moteurs, les bibliothèques d'ouvertures abk de l'interface, la database O-Deville, etc. Par contre, sont présentes les 49 bibliothèques abk des GM de Chessmaster. C'est une Arena uniquement pour GreKo !
Pour l'utiliser, décompressez l'archive où vous voulez sur votre disque dur et créez un raccourci vers le fichier "Arena.exe" du répertoire principal. L'interface devrait fonctionner sans problème sur n'importe quel PC / Windows.

Remarque : en principe la licence d'Arena ne me permet pas d'offrir une version de l'interface en téléchargement. Si on me demande de la retirer, je le ferai. Donc pressez-vous de la télécharger si cela vous intéresse.

Télécharger Arena GreKo ?



Quelques propositions de personnalités

Voici quelques personnalités au style bien marqué, que vous pourriez utiliser ou prendre comme exemple. Nous avons, du plus fort au plus faible :


La personnalité par défaut

Force : 2602 Elo



Contrairement à ce qui se fait habituellement, la personnalité standard de GreKo 2015 n'est pas réglé systématiquement sur des valeurs moyennes. Le center control est plus vigoureux, le rythme ralenti, le souci pour une bonne structure de pions plus faible et l'attention aux pions passé plus vive. Le style de jeu reste vif et offensif.

Material=50 (Standard)
BoardControl=60 (contrôle central fort)
Mobility=40 (mobilité modérée)
PawnStruct=40 (soucis assez faible pour une bonne structure de pions).
PawnPassed=60 (attention marqué pour la promotion)
KingSafety=50 (Standard)
DrawScore=0 (Standard)


Balanced

Force : 2581 Elo



Tous les paramètres de réglage de ce joueur sont en position médiane, ce qui lui donne un style assez équilibré entre attaque et défense, jeu tactique et jeu positionnel. Il est presque aussi fort que la personnalité par défaut...

Material=50
BoardControl=50
Mobility=50
PawnStruct=50
PawnPassed=50
KingSafety=50
DrawScore=0


Defender

Force : 2517 Elo



Personnalité matérialiste, appréciant les plateaux encombrés et très attentive à conserver une bonne position. Préférant se défendre plutôt qu'attaquer, elle privilégie la promotion comme moyen offensif. Contrôler le centre n'est pas une priorité.

Material=65 (matérialiste)
BoardControl=30 (jeu central faible)
Mobility=30 (avance prudemment)
PawnStruct=60 (conserve une bonne structure de pions)
PawnPassed=70 (aime promouvoir ses pions)
KingSafety=60 (protège bien son roi)
DrawScore=-200 (accepte facilement la nullité)


Tactical

Force : 2504 Elo



Moins matérialiste et plus mobile que le joueur par défaut, c'est un attaquant, qui cherchera à conserver une bonne position centrale.

Material=40 (peu matérialiste)
BoardControl=60 (jeu au centre vigoureux)
Mobility=50 (standard)
PawnStruct=40 (intérêt limité pour une bonne position)
PawnPassed=50 (standard)
KingSafety=45 (protection du roi modérée)
DrawScore=250 (n'accepte pas facilement la nullité)


Positional

Force : 2502 Elo



Joueur économe de ses pièces avançant prudemment et en conservant une position très solide. Il protège son roi sans obsession défensive, privilégie la promotion et cherche à s'incruster au centre. Perd une centaine de points Elo par rapport à la personnalité standard.

Material=55 (économe de ses pièces)
BoardControl=70 (jeu fort au centre)
Mobility=40 (avancée prudente)
PawnStruct=60 (conserve une position très solide)
PawnPassed=60 (privilégie la promotion des pions)
KingSafety=50 (standard)
DrawScore=0


Warrior

Force : 2349 Elo



Hyper-actif et agressif, ce joueur n'accorde que peu de valeur à ses pièces et les sacrifie allègrement. Il n'accorde pas beaucoup d'importance non plus à la solidité de sa position et préfère mobiliser ses pièces pour attaquer que pour protéger son roi. La promotion de pion nécessite trop d'efforts positionnels pour s'accommoder de son style va-t-en-guerre. La promotion n'est certainement pas sa tactique offensive !  Par contre, il a une véritable obsession du contrôle central.  Ce joueur extrême est le plus faible de la série.

Material=35 (très peu matérialiste)
BoardControl=90 (jeu au centre extrêmement vigoureux)
Mobility=70 (jeu fortement actif)
PawnStruct=37 (faible intérêt pour maintenir une position solide)
PawnPassed=20 (pas intéressé par la promotion de pion)
KingSafety=38 (ne mobilise que le minimum de pièces pour la protection de son roi)
DrawScore=250 (n'accepte pas facilement la nullité)


Classement des joueurs

J'ai fait jouer mes cinq personnalités et le profil par défaut de GreKo un tournoi toute ronde de 150 parties 40/12. Sans trop de surprises, c'est la personnalité par défaut qui gagne facilement.  Depuis le temps que Vladimir Medvedev travaille sur GreKo, il a appris à connaître son moteur ! Mais le joueur équilibré, aux paramètres proches, fait presque jeu égal.





Utiliser GreKo avec le protocole Winboard

En mode UCI, GreKo n'enregistre aucune donnée réutilisable après installation dans une interface quelconque. Il met bien à jour un fichier "Greko.ini" mais celui-ci n'est utilisé que lorsque le moteur est configuré pour utiliser le protocole de communication Winboard. Donc, si l'on force le moteur à utiliser Winboard, les fichiers ini pourront être utilisés directement par une autre interface, jouant le rôle d'un profil de personnalité. Il y a quand même quelques inconvients importants :
➤En termes de commodités, le protocole Winboard est moins performant que le protcole UCI. Par exemple nous ne bénéficieront plus de la possibilité de régler la force du moteur au Elo près.
➤On ne pourra plus employer GreKo avec Lucas Chess ou Mayura – et toutes les interfaces qui n'acceptent pas les moteurs Winboard. Arena sera alors la meilleure option. Voici comment faire avec cette interface :

Bascule UCI/Winboard : Menu ''Modules'' > ''Gérer '', onglet ''Détails'' et sélectionnez la personnalité de GreKo à modifier dans la liste des moteurs. Depuis l'onglet ''Général'' cherchez le champ ''Nom''. Actuellement, il est sur UCI. Passez sur  ''Winboard''.

Sélection du moteur : comme d'habitude, basculez sur l'onglet ''Choix'' et sélectionnez votre personnalité GreKo. ''Appliquer'' et fermez la fenêtre de gestion des moteurs.

Démarrage : menu ''Modules'' > ''Modules 1'' > ''Démarrage'' (ou Shift + F11). Notez que la zone de notification d'Arena, sous l'échiquier, affiche le changement de protocole.



Édition du fichier ''GreKo.ini'' : menu ''Modules'' > ''Modules 1'' > ''Configurer'' (ou Ctrl +1). Le message suivant s'affiche : ''Pas de fichier de configuration pour module GreKo. Voulez-vous le choisir maintenant ?''
Répondez ''Oui'' et sélectionnez le fichier ''GreKo.ini''.  Le bloc-note de Windows s'ouvre et affiche la configuration standard 

Changez les valeurs à votre convenance et sauvegardez. N'oubliez pas notamment de programmer LimitKnps en vous basant sur le tableau ci-dessus si vous voulez affaiblir la personnalité. Redémarrer GreKo (Shift+F11) après chaque modification afin que les changements soient pris en compte.

Sauvegarder la personnalité :
Donnez d'abord un nom explicite à la personnalité : menu ''Modules'' > ''Gérer '', onglet ''Détails'' et chercher le bon GreKo dans la liste des moteurs. Puis sur l'onglet ''Général'', cherchez le champ ''Nom'' et baptisez votre profil personnalisé. Par exemple ''Warrior'' si c'est un attaquant féroce.
Copiez le dossier du moteur et collez-le dans le répertoire ''Engines'' d'Arena en lui donnant le même nom que le nouveau moteur.
Installez ce nouveau moteur dans Arena, en n'oubliant pas que le protocole de communication doit être Winboard et non UCI.
N'ayez pas peur de faire des copies du moteur. Sans les sources, avec sa bibliothèque interne, GreKo ne pèse que 300 Ko. Ce n'est pas lui qui va alourdir votre disque dur !






Rob Rob, juillet 2021 (Article revu en mai 2024)

 
 
 
Retourner au contenu | Retourner au menu _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();