diff --git a/index.html b/index.html
index e752c1f2..9b28ae77 100644
--- a/index.html
+++ b/index.html
@@ -91,8 +91,7 @@
Website
-
-
+
A free, open-source web app to learn and play chess online. Created with PHP and JavaScript, using Symfony and Bootstrap.
Available Environments
Development
The following repositories are required to run a complete chess platform in a local development environment:
@@ -370,5 +369,5 @@
Keyboard Shortcuts
diff --git a/search/search_index.json b/search/search_index.json
index 882ff72d..82c1174b 100644
--- a/search/search_index.json
+++ b/search/search_index.json
@@ -1 +1 @@
-{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Website Available Environments Development The following repositories are required to run a complete chess platform in a local development environment: Chess Data PHP Chess Server Website Remember to add your PHP Chess Server host name to the assets/env.js file of your website. Decentralized With decentralized chess (DeChess) a complete chess platform can be run using one ChesslaBlab repository only: Website Make sure to add at least a PHP Chess Server host name from the ChesslaBlab Node List to the assets/env.js file of your website. SSL Certificate Setup Some familiarity with Public Key Infrastructure (PKI) is recommended in order to follow this section. Development Environment The first thing you need to understand about setting up a ChesslaBlab website in a local development environment is that you have to create an SSL certificate to secure three different domain names at once. chesslablab.org www.chesslablab.org async.chesslablab.org This is because nowadays, major browsers want all traffic to be secure, and as a web developer you want the development environment to mimic production as much as possible. The first two domain names, chesslablab.org and www.chesslablab.org , will point to the IP of the website . When it comes to websites, it is a common practice to create a domain alias that redirects to the primary domain. Hence the two domain names for the website, one starting with www. The async.chesslablab.org to the IP of the asynchronous chess server . Decentralized Environment In a decentralized environment only two domain names need to be secured. chesslablab.org www.chesslablab.org Use custom domain names to configure yours whether you are a chess club, a school, or a FIDE titled player. yourchessclub.com www.yourchessclub.com Free SSL Certificate with Certbot Probably the easiest way to proceed is to purchase a wildcard certificate from a Certificate Authority (CA) however you may want to consider to get your free certificate using Certbot instead. Be that as it may, keep in mind that before any CA can issue an SSL certificate, a validation process is required to verify that it can be sent to the Certificate Signing Request (CSR) requester. This is typically achieved through one of the following methods. Email Validation \u2014 a validation email is sent to the certificate requester. HTTP Validation \u2014 the certificate requester is asked to upload a validation file at their host. DNS Validation \u2014 the certificate requester sets up a CNAME record in the domain's DNS zone for further validation. I used Certbot to automatically get a free HTTPS certificate. Since the ChesslaBlab website is running on an Ubuntu server, the certificate was validated through DNS as it is described next. sudo certbot certonly --standalone Saving debug log to /var/log/letsencrypt/letsencrypt.log Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): chesslablab.org www.chesslablab.org async.chesslablab.org Requesting a certificate for chesslablab.org and 2 more domains Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/chesslablab.org-0001/fullchain.pem Key is saved at: /etc/letsencrypt/live/chesslablab.org-0001/privkey.pem This certificate expires on 2024-04-23. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The certbot command generated two files, fullchain.pem and privkey.pem , that then were installed in each of the repos listed above: chesslablab/website chesslablab/chess-server It is worth saying that for this to function properly, Certbot's documentation recommends to have a working web site that can already be accessed using HTTP on port 80. Self-Signed SSL Certificate with OpenSSL If issuing a certificate with DNS validation sounds too complicated to you, OpenSSL might be an alternate solution for the development environment. You may want to create a self-signed multi-domain SSL certificate using OpenSSL. openssl genrsa -aes256 -passout pass:foobar -out chesslablab.org.pem 2048 openssl req -passin pass:foobar -new -sha256 -key chesslablab.org.pem -subj \"/C=US/ST=CA/O=ChesslaBlab, Inc./CN=chesslablab.org\" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf \"[SAN]\\nsubjectAltName=DNS:*.mydomain.org\")) -out chesslablab.org.csr openssl x509 -passin pass:foobar -req -days 365 -in chesslablab.org.csr -signkey chesslablab.org.pem -out chesslablab.org.crt openssl rsa -passin pass:foobar -in chesslablab.org.pem -out chesslablab.org.key The command above will generate four files: chesslablab.org.crt chesslablab.org.csr chesslablab.org.key chesslablab.org.pem Then, chesslablab.org.crt and chesslablab.org.key must be renamed in order to match both the certificate and the key filename created by Certbot. As noted before, it is assumed that Certbot is used to automatically generate the HTTPS certificate so all repositories are configured to read these two files on startup. mv chesslablab.org.crt fullchain.pem mv chesslablab.org.key privkey.pem At this point, it is of vital importance to add the chess server's self-signed certificate as trusted to your browser. Figure 1 . Make the browser trust the chess server's self-signed certificate. If skipping this step, the web browser won't be able to connect to the chess server. The latter will complain with an SSL handshake error. SSL handshake error: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown And the web browser will throw an error accordingly. WebSocket connection to 'wss://async.chesslablab.org:8443/' failed Figure 2 . WebSocket connection to 'wss://async.chesslablab.org:8443/' failed. Let's recap! In order to set up a local development environment, three different domain names need to be secured at once. The SSL certificate is to be installed in each of the following repositories. chesslablab/website chesslablab/chess-server In a decentralized environment only two domain names need to be secured. The SSL certificate is to be installed in the following repository. chesslablab/website Certbot can be used to automatically get a free HTTPS certificate, however, if this still sounds too complicated, OpenSSL might be an alternate solution for the development environment. Customization The default settings can be customized through the environment variables starting with SET_ in the .env file. SET_SITE_NAME=ChesslaBlab SET_LOCALE=en Change the site name and the locale to configure your website whether you are a chess club, a school, or a FIDE titled player. SET_SITE_NAME=YourChessClub SET_LOCALE=es The supported locales are described in the following table. Locale Description de German en English es Spanish fr French ru Russian tr Turkish hi Hindi zh_CN Chinese (Simplified) Installation Clone the chesslablab/website repo into your projects folder. Then cd the website directory and create an .env file: cp .env.example .env Update the .env file to your specific needs. Set up the browser environment variables: cp assets/env.example.js assets/env.js Update the env.js file to your specific needs. Make sure to have installed the fullchain.pem and privkey.pem files into the docker/nginx/ssl folder, and run the Docker containers in detached mode in the background: docker compose -f docker-compose.default.yml up -d Clear the cache: docker exec -itu 1000:1000 chess_website_php php bin/console cache:clear Download the assets: docker exec -itu 1000:1000 chess_website_php php bin/console importmap:install Compile the assets: docker exec -itu 1000:1000 chess_website_php php bin/console asset-map:compile Finally, if you are running the website in a local development environment, you may want to add a domain name entry to your /etc/hosts file. 127.0.0.1 chesslablab.org","title":"Website"},{"location":"#website","text":"","title":"Website"},{"location":"#available-environments","text":"","title":"Available Environments"},{"location":"#development","text":"The following repositories are required to run a complete chess platform in a local development environment: Chess Data PHP Chess Server Website Remember to add your PHP Chess Server host name to the assets/env.js file of your website.","title":"Development"},{"location":"#decentralized","text":"With decentralized chess (DeChess) a complete chess platform can be run using one ChesslaBlab repository only: Website Make sure to add at least a PHP Chess Server host name from the ChesslaBlab Node List to the assets/env.js file of your website.","title":"Decentralized"},{"location":"#ssl-certificate-setup","text":"Some familiarity with Public Key Infrastructure (PKI) is recommended in order to follow this section.","title":"SSL Certificate Setup"},{"location":"#development-environment","text":"The first thing you need to understand about setting up a ChesslaBlab website in a local development environment is that you have to create an SSL certificate to secure three different domain names at once. chesslablab.org www.chesslablab.org async.chesslablab.org This is because nowadays, major browsers want all traffic to be secure, and as a web developer you want the development environment to mimic production as much as possible. The first two domain names, chesslablab.org and www.chesslablab.org , will point to the IP of the website . When it comes to websites, it is a common practice to create a domain alias that redirects to the primary domain. Hence the two domain names for the website, one starting with www. The async.chesslablab.org to the IP of the asynchronous chess server .","title":"Development Environment"},{"location":"#decentralized-environment","text":"In a decentralized environment only two domain names need to be secured. chesslablab.org www.chesslablab.org Use custom domain names to configure yours whether you are a chess club, a school, or a FIDE titled player. yourchessclub.com www.yourchessclub.com","title":"Decentralized Environment"},{"location":"#free-ssl-certificate-with-certbot","text":"Probably the easiest way to proceed is to purchase a wildcard certificate from a Certificate Authority (CA) however you may want to consider to get your free certificate using Certbot instead. Be that as it may, keep in mind that before any CA can issue an SSL certificate, a validation process is required to verify that it can be sent to the Certificate Signing Request (CSR) requester. This is typically achieved through one of the following methods. Email Validation \u2014 a validation email is sent to the certificate requester. HTTP Validation \u2014 the certificate requester is asked to upload a validation file at their host. DNS Validation \u2014 the certificate requester sets up a CNAME record in the domain's DNS zone for further validation. I used Certbot to automatically get a free HTTPS certificate. Since the ChesslaBlab website is running on an Ubuntu server, the certificate was validated through DNS as it is described next. sudo certbot certonly --standalone Saving debug log to /var/log/letsencrypt/letsencrypt.log Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): chesslablab.org www.chesslablab.org async.chesslablab.org Requesting a certificate for chesslablab.org and 2 more domains Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/chesslablab.org-0001/fullchain.pem Key is saved at: /etc/letsencrypt/live/chesslablab.org-0001/privkey.pem This certificate expires on 2024-04-23. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The certbot command generated two files, fullchain.pem and privkey.pem , that then were installed in each of the repos listed above: chesslablab/website chesslablab/chess-server It is worth saying that for this to function properly, Certbot's documentation recommends to have a working web site that can already be accessed using HTTP on port 80.","title":"Free SSL Certificate with Certbot"},{"location":"#self-signed-ssl-certificate-with-openssl","text":"If issuing a certificate with DNS validation sounds too complicated to you, OpenSSL might be an alternate solution for the development environment. You may want to create a self-signed multi-domain SSL certificate using OpenSSL. openssl genrsa -aes256 -passout pass:foobar -out chesslablab.org.pem 2048 openssl req -passin pass:foobar -new -sha256 -key chesslablab.org.pem -subj \"/C=US/ST=CA/O=ChesslaBlab, Inc./CN=chesslablab.org\" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf \"[SAN]\\nsubjectAltName=DNS:*.mydomain.org\")) -out chesslablab.org.csr openssl x509 -passin pass:foobar -req -days 365 -in chesslablab.org.csr -signkey chesslablab.org.pem -out chesslablab.org.crt openssl rsa -passin pass:foobar -in chesslablab.org.pem -out chesslablab.org.key The command above will generate four files: chesslablab.org.crt chesslablab.org.csr chesslablab.org.key chesslablab.org.pem Then, chesslablab.org.crt and chesslablab.org.key must be renamed in order to match both the certificate and the key filename created by Certbot. As noted before, it is assumed that Certbot is used to automatically generate the HTTPS certificate so all repositories are configured to read these two files on startup. mv chesslablab.org.crt fullchain.pem mv chesslablab.org.key privkey.pem At this point, it is of vital importance to add the chess server's self-signed certificate as trusted to your browser. Figure 1 . Make the browser trust the chess server's self-signed certificate. If skipping this step, the web browser won't be able to connect to the chess server. The latter will complain with an SSL handshake error. SSL handshake error: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown And the web browser will throw an error accordingly. WebSocket connection to 'wss://async.chesslablab.org:8443/' failed Figure 2 . WebSocket connection to 'wss://async.chesslablab.org:8443/' failed. Let's recap! In order to set up a local development environment, three different domain names need to be secured at once. The SSL certificate is to be installed in each of the following repositories. chesslablab/website chesslablab/chess-server In a decentralized environment only two domain names need to be secured. The SSL certificate is to be installed in the following repository. chesslablab/website Certbot can be used to automatically get a free HTTPS certificate, however, if this still sounds too complicated, OpenSSL might be an alternate solution for the development environment.","title":"Self-Signed SSL Certificate with OpenSSL"},{"location":"#customization","text":"The default settings can be customized through the environment variables starting with SET_ in the .env file. SET_SITE_NAME=ChesslaBlab SET_LOCALE=en Change the site name and the locale to configure your website whether you are a chess club, a school, or a FIDE titled player. SET_SITE_NAME=YourChessClub SET_LOCALE=es The supported locales are described in the following table. Locale Description de German en English es Spanish fr French ru Russian tr Turkish hi Hindi zh_CN Chinese (Simplified)","title":"Customization"},{"location":"#installation","text":"Clone the chesslablab/website repo into your projects folder. Then cd the website directory and create an .env file: cp .env.example .env Update the .env file to your specific needs. Set up the browser environment variables: cp assets/env.example.js assets/env.js Update the env.js file to your specific needs. Make sure to have installed the fullchain.pem and privkey.pem files into the docker/nginx/ssl folder, and run the Docker containers in detached mode in the background: docker compose -f docker-compose.default.yml up -d Clear the cache: docker exec -itu 1000:1000 chess_website_php php bin/console cache:clear Download the assets: docker exec -itu 1000:1000 chess_website_php php bin/console importmap:install Compile the assets: docker exec -itu 1000:1000 chess_website_php php bin/console asset-map:compile Finally, if you are running the website in a local development environment, you may want to add a domain name entry to your /etc/hosts file. 127.0.0.1 chesslablab.org","title":"Installation"},{"location":"architecture/","text":"Architecture Some familiarity with JavaScript modules as well as with Symfony's Asset Mapper component is recommended in order to follow this section. The ChesslaBlab website is a multi-page application (MPA) that is not adhering to the MVC architectural pattern. The controller actions are basically sending an HTML document to the browser on each request. The business logic is implemented in the chess server. In this website architecture in particular, there is no model layer (M) and as a result the Controller layer (C) remains quite basic as in the following example. The main reason behind a multi-page architecture like this one as opposed to a single-page architecture is that we want the pages to be indexed by web crawlers. render('pages/play/computer/index.html.twig'); } } As a rule of thumb, there is a .twig.html file and a .js file associated to each controller action. So the structure of the App\\Controller\\Pages namespace is mirroring the structure of both the templates/pages folder and the assets/js/pages folder. src/Controller/Pages/Play/ComputerController.php templates/pages/play/computer/index.html.twig assets/js/pages/play/computer/index.js This naming convention allows developers to reduce memorization because given one file name, the name of the remaining two can be inferred. Each page's JavaScript file is then set up as an entrypoint in the importmap.php config file. The main point of the entrypoint script is to update the DOM on user interaction and data change. So the JavaScript code in the assets/js/pages/play/computer/index.js file basically boils down to initialization because the business logic is implemented in WebSocket ESM modules. When the web browser retrieves the response from the WebSocket server, the ESM components are updated with the new data. import { playComputerModal } from './PlayComputerModal.js'; import { binaryWebSocket } from '../../../websockets/binary/BinaryWebSocket.js'; import { stockfishWebSocket } from '../../../websockets/game/StockfishWebSocket.js'; try { await Promise.all([ binaryWebSocket.connect(), stockfishWebSocket.connect() ]); } catch {} playComputerModal.props.modal.show(); WebSocket Connections The ChesslaBlab website is integrated with PHP Chess Server , an asynchronous WebSocket server that provides functionality to play chess online over a WebSocket connection. The environment variables required for the chess server can be found in the assets/env.example.js file. As described in the docs , these are the game modes available: analysis is used to start games for further analysis. play allows to play chess online with other players. stockfish allows to play chess against the computer. The WebSocket ESM modules are implemented based on this same separation of concerns and abstraction: assets/js/websockets/game/AnalysisWebSocket.js assets/js/websockets/game/PlayWebSocket.js assets/js/websockets/game/StockfishWebSocket.js","title":"Architecture"},{"location":"architecture/#architecture","text":"Some familiarity with JavaScript modules as well as with Symfony's Asset Mapper component is recommended in order to follow this section. The ChesslaBlab website is a multi-page application (MPA) that is not adhering to the MVC architectural pattern. The controller actions are basically sending an HTML document to the browser on each request. The business logic is implemented in the chess server. In this website architecture in particular, there is no model layer (M) and as a result the Controller layer (C) remains quite basic as in the following example. The main reason behind a multi-page architecture like this one as opposed to a single-page architecture is that we want the pages to be indexed by web crawlers. render('pages/play/computer/index.html.twig'); } } As a rule of thumb, there is a .twig.html file and a .js file associated to each controller action. So the structure of the App\\Controller\\Pages namespace is mirroring the structure of both the templates/pages folder and the assets/js/pages folder. src/Controller/Pages/Play/ComputerController.php templates/pages/play/computer/index.html.twig assets/js/pages/play/computer/index.js This naming convention allows developers to reduce memorization because given one file name, the name of the remaining two can be inferred. Each page's JavaScript file is then set up as an entrypoint in the importmap.php config file. The main point of the entrypoint script is to update the DOM on user interaction and data change. So the JavaScript code in the assets/js/pages/play/computer/index.js file basically boils down to initialization because the business logic is implemented in WebSocket ESM modules. When the web browser retrieves the response from the WebSocket server, the ESM components are updated with the new data. import { playComputerModal } from './PlayComputerModal.js'; import { binaryWebSocket } from '../../../websockets/binary/BinaryWebSocket.js'; import { stockfishWebSocket } from '../../../websockets/game/StockfishWebSocket.js'; try { await Promise.all([ binaryWebSocket.connect(), stockfishWebSocket.connect() ]); } catch {} playComputerModal.props.modal.show();","title":"Architecture"},{"location":"architecture/#websocket-connections","text":"The ChesslaBlab website is integrated with PHP Chess Server , an asynchronous WebSocket server that provides functionality to play chess online over a WebSocket connection. The environment variables required for the chess server can be found in the assets/env.example.js file. As described in the docs , these are the game modes available: analysis is used to start games for further analysis. play allows to play chess online with other players. stockfish allows to play chess against the computer. The WebSocket ESM modules are implemented based on this same separation of concerns and abstraction: assets/js/websockets/game/AnalysisWebSocket.js assets/js/websockets/game/PlayWebSocket.js assets/js/websockets/game/StockfishWebSocket.js","title":"WebSocket Connections"},{"location":"blog/","text":"Blog A static SEO-optimized blog has been set up to allow chess content creators to share stories with the world. A static blog differs from a dynamic blog in that the content is stored in Markdown files as opposed to in a database. Figure 1 . Click on Blog The posts are stored in the file system in the blog folder. Two sample posts are provided in two languages: English and Spanish . The sitemap.xml file is generated on request based on the routes defined in the config/routing/blog.yaml file. As you can see, all blog routes are prefixed with the word blog . The blog.yaml file is intended to encode the metadata of the posts into multiple languages.","title":"Blog"},{"location":"blog/#blog","text":"A static SEO-optimized blog has been set up to allow chess content creators to share stories with the world. A static blog differs from a dynamic blog in that the content is stored in Markdown files as opposed to in a database. Figure 1 . Click on Blog The posts are stored in the file system in the blog folder. Two sample posts are provided in two languages: English and Spanish . The sitemap.xml file is generated on request based on the routes defined in the config/routing/blog.yaml file. As you can see, all blog routes are prefixed with the word blog . The blog.yaml file is intended to encode the metadata of the posts into multiple languages.","title":"Blog"},{"location":"html-iframes/","text":"HTML Iframes Chess authors can engage with readers on their ChesslaBlab website by embedding chess functionality into their publications. Analysis Board Add the following sample HTML code to your blog post:
Figure 1 . E25 Nimzo-Indian Defense: S\u00e4misch Variation, Keres Variation. Parameters variant The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row. fen An URL-encoded FEN string. movetext An URL-encoded movetext in SAN format. startPos (optional) The start position in a Chess960 game; for example BRNNKBRQ . Annotations Board Add the following sample HTML code to your blog post:
Figure 2 . Lasker - Capablanca World Championship. Parameters variant The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row. fen An URL-encoded FEN string. movetext An URL-encoded movetext in RAV format. startPos (optional) The start position in a Chess960 game; for example BRNNKBRQ .","title":"HTML Iframes"},{"location":"html-iframes/#html-iframes","text":"Chess authors can engage with readers on their ChesslaBlab website by embedding chess functionality into their publications.","title":"HTML Iframes"},{"location":"html-iframes/#analysis-board","text":"Add the following sample HTML code to your blog post:
Figure 1 . E25 Nimzo-Indian Defense: S\u00e4misch Variation, Keres Variation.","title":"Analysis Board"},{"location":"html-iframes/#parameters","text":"","title":"Parameters"},{"location":"html-iframes/#variant","text":"The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row.","title":"variant"},{"location":"html-iframes/#fen","text":"An URL-encoded FEN string.","title":"fen"},{"location":"html-iframes/#movetext","text":"An URL-encoded movetext in SAN format.","title":"movetext"},{"location":"html-iframes/#startpos-optional","text":"The start position in a Chess960 game; for example BRNNKBRQ .","title":"startPos (optional)"},{"location":"html-iframes/#annotations-board","text":"Add the following sample HTML code to your blog post:
Figure 2 . Lasker - Capablanca World Championship.","title":"Annotations Board"},{"location":"html-iframes/#parameters_1","text":"","title":"Parameters"},{"location":"html-iframes/#variant_1","text":"The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row.","title":"variant"},{"location":"html-iframes/#fen_1","text":"An URL-encoded FEN string.","title":"fen"},{"location":"html-iframes/#movetext_1","text":"An URL-encoded movetext in RAV format.","title":"movetext"},{"location":"html-iframes/#startpos-optional_1","text":"The start position in a Chess960 game; for example BRNNKBRQ .","title":"startPos (optional)"}]}
\ No newline at end of file
+{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Website A free, open-source web app to learn and play chess online. Created with PHP and JavaScript, using Symfony and Bootstrap. Available Environments Development The following repositories are required to run a complete chess platform in a local development environment: Chess Data PHP Chess Server Website Remember to add your PHP Chess Server host name to the assets/env.js file of your website. Decentralized With decentralized chess (DeChess) a complete chess platform can be run using one ChesslaBlab repository only: Website Make sure to add at least a PHP Chess Server host name from the ChesslaBlab Node List to the assets/env.js file of your website. SSL Certificate Setup Some familiarity with Public Key Infrastructure (PKI) is recommended in order to follow this section. Development Environment The first thing you need to understand about setting up a ChesslaBlab website in a local development environment is that you have to create an SSL certificate to secure three different domain names at once. chesslablab.org www.chesslablab.org async.chesslablab.org This is because nowadays, major browsers want all traffic to be secure, and as a web developer you want the development environment to mimic production as much as possible. The first two domain names, chesslablab.org and www.chesslablab.org , will point to the IP of the website . When it comes to websites, it is a common practice to create a domain alias that redirects to the primary domain. Hence the two domain names for the website, one starting with www. The async.chesslablab.org to the IP of the asynchronous chess server . Decentralized Environment In a decentralized environment only two domain names need to be secured. chesslablab.org www.chesslablab.org Use custom domain names to configure yours whether you are a chess club, a school, or a FIDE titled player. yourchessclub.com www.yourchessclub.com Free SSL Certificate with Certbot Probably the easiest way to proceed is to purchase a wildcard certificate from a Certificate Authority (CA) however you may want to consider to get your free certificate using Certbot instead. Be that as it may, keep in mind that before any CA can issue an SSL certificate, a validation process is required to verify that it can be sent to the Certificate Signing Request (CSR) requester. This is typically achieved through one of the following methods. Email Validation \u2014 a validation email is sent to the certificate requester. HTTP Validation \u2014 the certificate requester is asked to upload a validation file at their host. DNS Validation \u2014 the certificate requester sets up a CNAME record in the domain's DNS zone for further validation. I used Certbot to automatically get a free HTTPS certificate. Since the ChesslaBlab website is running on an Ubuntu server, the certificate was validated through DNS as it is described next. sudo certbot certonly --standalone Saving debug log to /var/log/letsencrypt/letsencrypt.log Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): chesslablab.org www.chesslablab.org async.chesslablab.org Requesting a certificate for chesslablab.org and 2 more domains Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/chesslablab.org-0001/fullchain.pem Key is saved at: /etc/letsencrypt/live/chesslablab.org-0001/privkey.pem This certificate expires on 2024-04-23. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The certbot command generated two files, fullchain.pem and privkey.pem , that then were installed in each of the repos listed above: chesslablab/website chesslablab/chess-server It is worth saying that for this to function properly, Certbot's documentation recommends to have a working web site that can already be accessed using HTTP on port 80. Self-Signed SSL Certificate with OpenSSL If issuing a certificate with DNS validation sounds too complicated to you, OpenSSL might be an alternate solution for the development environment. You may want to create a self-signed multi-domain SSL certificate using OpenSSL. openssl genrsa -aes256 -passout pass:foobar -out chesslablab.org.pem 2048 openssl req -passin pass:foobar -new -sha256 -key chesslablab.org.pem -subj \"/C=US/ST=CA/O=ChesslaBlab, Inc./CN=chesslablab.org\" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf \"[SAN]\\nsubjectAltName=DNS:*.mydomain.org\")) -out chesslablab.org.csr openssl x509 -passin pass:foobar -req -days 365 -in chesslablab.org.csr -signkey chesslablab.org.pem -out chesslablab.org.crt openssl rsa -passin pass:foobar -in chesslablab.org.pem -out chesslablab.org.key The command above will generate four files: chesslablab.org.crt chesslablab.org.csr chesslablab.org.key chesslablab.org.pem Then, chesslablab.org.crt and chesslablab.org.key must be renamed in order to match both the certificate and the key filename created by Certbot. As noted before, it is assumed that Certbot is used to automatically generate the HTTPS certificate so all repositories are configured to read these two files on startup. mv chesslablab.org.crt fullchain.pem mv chesslablab.org.key privkey.pem At this point, it is of vital importance to add the chess server's self-signed certificate as trusted to your browser. Figure 1 . Make the browser trust the chess server's self-signed certificate. If skipping this step, the web browser won't be able to connect to the chess server. The latter will complain with an SSL handshake error. SSL handshake error: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown And the web browser will throw an error accordingly. WebSocket connection to 'wss://async.chesslablab.org:8443/' failed Figure 2 . WebSocket connection to 'wss://async.chesslablab.org:8443/' failed. Let's recap! In order to set up a local development environment, three different domain names need to be secured at once. The SSL certificate is to be installed in each of the following repositories. chesslablab/website chesslablab/chess-server In a decentralized environment only two domain names need to be secured. The SSL certificate is to be installed in the following repository. chesslablab/website Certbot can be used to automatically get a free HTTPS certificate, however, if this still sounds too complicated, OpenSSL might be an alternate solution for the development environment. Customization The default settings can be customized through the environment variables starting with SET_ in the .env file. SET_SITE_NAME=ChesslaBlab SET_LOCALE=en Change the site name and the locale to configure your website whether you are a chess club, a school, or a FIDE titled player. SET_SITE_NAME=YourChessClub SET_LOCALE=es The supported locales are described in the following table. Locale Description de German en English es Spanish fr French ru Russian tr Turkish hi Hindi zh_CN Chinese (Simplified) Installation Clone the chesslablab/website repo into your projects folder. Then cd the website directory and create an .env file: cp .env.example .env Update the .env file to your specific needs. Set up the browser environment variables: cp assets/env.example.js assets/env.js Update the env.js file to your specific needs. Make sure to have installed the fullchain.pem and privkey.pem files into the docker/nginx/ssl folder, and run the Docker containers in detached mode in the background: docker compose -f docker-compose.default.yml up -d Clear the cache: docker exec -itu 1000:1000 chess_website_php php bin/console cache:clear Download the assets: docker exec -itu 1000:1000 chess_website_php php bin/console importmap:install Compile the assets: docker exec -itu 1000:1000 chess_website_php php bin/console asset-map:compile Finally, if you are running the website in a local development environment, you may want to add a domain name entry to your /etc/hosts file. 127.0.0.1 chesslablab.org","title":"Website"},{"location":"#website","text":"A free, open-source web app to learn and play chess online. Created with PHP and JavaScript, using Symfony and Bootstrap.","title":"Website"},{"location":"#available-environments","text":"","title":"Available Environments"},{"location":"#development","text":"The following repositories are required to run a complete chess platform in a local development environment: Chess Data PHP Chess Server Website Remember to add your PHP Chess Server host name to the assets/env.js file of your website.","title":"Development"},{"location":"#decentralized","text":"With decentralized chess (DeChess) a complete chess platform can be run using one ChesslaBlab repository only: Website Make sure to add at least a PHP Chess Server host name from the ChesslaBlab Node List to the assets/env.js file of your website.","title":"Decentralized"},{"location":"#ssl-certificate-setup","text":"Some familiarity with Public Key Infrastructure (PKI) is recommended in order to follow this section.","title":"SSL Certificate Setup"},{"location":"#development-environment","text":"The first thing you need to understand about setting up a ChesslaBlab website in a local development environment is that you have to create an SSL certificate to secure three different domain names at once. chesslablab.org www.chesslablab.org async.chesslablab.org This is because nowadays, major browsers want all traffic to be secure, and as a web developer you want the development environment to mimic production as much as possible. The first two domain names, chesslablab.org and www.chesslablab.org , will point to the IP of the website . When it comes to websites, it is a common practice to create a domain alias that redirects to the primary domain. Hence the two domain names for the website, one starting with www. The async.chesslablab.org to the IP of the asynchronous chess server .","title":"Development Environment"},{"location":"#decentralized-environment","text":"In a decentralized environment only two domain names need to be secured. chesslablab.org www.chesslablab.org Use custom domain names to configure yours whether you are a chess club, a school, or a FIDE titled player. yourchessclub.com www.yourchessclub.com","title":"Decentralized Environment"},{"location":"#free-ssl-certificate-with-certbot","text":"Probably the easiest way to proceed is to purchase a wildcard certificate from a Certificate Authority (CA) however you may want to consider to get your free certificate using Certbot instead. Be that as it may, keep in mind that before any CA can issue an SSL certificate, a validation process is required to verify that it can be sent to the Certificate Signing Request (CSR) requester. This is typically achieved through one of the following methods. Email Validation \u2014 a validation email is sent to the certificate requester. HTTP Validation \u2014 the certificate requester is asked to upload a validation file at their host. DNS Validation \u2014 the certificate requester sets up a CNAME record in the domain's DNS zone for further validation. I used Certbot to automatically get a free HTTPS certificate. Since the ChesslaBlab website is running on an Ubuntu server, the certificate was validated through DNS as it is described next. sudo certbot certonly --standalone Saving debug log to /var/log/letsencrypt/letsencrypt.log Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): chesslablab.org www.chesslablab.org async.chesslablab.org Requesting a certificate for chesslablab.org and 2 more domains Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/chesslablab.org-0001/fullchain.pem Key is saved at: /etc/letsencrypt/live/chesslablab.org-0001/privkey.pem This certificate expires on 2024-04-23. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The certbot command generated two files, fullchain.pem and privkey.pem , that then were installed in each of the repos listed above: chesslablab/website chesslablab/chess-server It is worth saying that for this to function properly, Certbot's documentation recommends to have a working web site that can already be accessed using HTTP on port 80.","title":"Free SSL Certificate with Certbot"},{"location":"#self-signed-ssl-certificate-with-openssl","text":"If issuing a certificate with DNS validation sounds too complicated to you, OpenSSL might be an alternate solution for the development environment. You may want to create a self-signed multi-domain SSL certificate using OpenSSL. openssl genrsa -aes256 -passout pass:foobar -out chesslablab.org.pem 2048 openssl req -passin pass:foobar -new -sha256 -key chesslablab.org.pem -subj \"/C=US/ST=CA/O=ChesslaBlab, Inc./CN=chesslablab.org\" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf \"[SAN]\\nsubjectAltName=DNS:*.mydomain.org\")) -out chesslablab.org.csr openssl x509 -passin pass:foobar -req -days 365 -in chesslablab.org.csr -signkey chesslablab.org.pem -out chesslablab.org.crt openssl rsa -passin pass:foobar -in chesslablab.org.pem -out chesslablab.org.key The command above will generate four files: chesslablab.org.crt chesslablab.org.csr chesslablab.org.key chesslablab.org.pem Then, chesslablab.org.crt and chesslablab.org.key must be renamed in order to match both the certificate and the key filename created by Certbot. As noted before, it is assumed that Certbot is used to automatically generate the HTTPS certificate so all repositories are configured to read these two files on startup. mv chesslablab.org.crt fullchain.pem mv chesslablab.org.key privkey.pem At this point, it is of vital importance to add the chess server's self-signed certificate as trusted to your browser. Figure 1 . Make the browser trust the chess server's self-signed certificate. If skipping this step, the web browser won't be able to connect to the chess server. The latter will complain with an SSL handshake error. SSL handshake error: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown And the web browser will throw an error accordingly. WebSocket connection to 'wss://async.chesslablab.org:8443/' failed Figure 2 . WebSocket connection to 'wss://async.chesslablab.org:8443/' failed. Let's recap! In order to set up a local development environment, three different domain names need to be secured at once. The SSL certificate is to be installed in each of the following repositories. chesslablab/website chesslablab/chess-server In a decentralized environment only two domain names need to be secured. The SSL certificate is to be installed in the following repository. chesslablab/website Certbot can be used to automatically get a free HTTPS certificate, however, if this still sounds too complicated, OpenSSL might be an alternate solution for the development environment.","title":"Self-Signed SSL Certificate with OpenSSL"},{"location":"#customization","text":"The default settings can be customized through the environment variables starting with SET_ in the .env file. SET_SITE_NAME=ChesslaBlab SET_LOCALE=en Change the site name and the locale to configure your website whether you are a chess club, a school, or a FIDE titled player. SET_SITE_NAME=YourChessClub SET_LOCALE=es The supported locales are described in the following table. Locale Description de German en English es Spanish fr French ru Russian tr Turkish hi Hindi zh_CN Chinese (Simplified)","title":"Customization"},{"location":"#installation","text":"Clone the chesslablab/website repo into your projects folder. Then cd the website directory and create an .env file: cp .env.example .env Update the .env file to your specific needs. Set up the browser environment variables: cp assets/env.example.js assets/env.js Update the env.js file to your specific needs. Make sure to have installed the fullchain.pem and privkey.pem files into the docker/nginx/ssl folder, and run the Docker containers in detached mode in the background: docker compose -f docker-compose.default.yml up -d Clear the cache: docker exec -itu 1000:1000 chess_website_php php bin/console cache:clear Download the assets: docker exec -itu 1000:1000 chess_website_php php bin/console importmap:install Compile the assets: docker exec -itu 1000:1000 chess_website_php php bin/console asset-map:compile Finally, if you are running the website in a local development environment, you may want to add a domain name entry to your /etc/hosts file. 127.0.0.1 chesslablab.org","title":"Installation"},{"location":"architecture/","text":"Architecture Some familiarity with JavaScript modules as well as with Symfony's Asset Mapper component is recommended in order to follow this section. The ChesslaBlab website is a multi-page application (MPA) that is not adhering to the MVC architectural pattern. The controller actions are basically sending an HTML document to the browser on each request. The business logic is implemented in the chess server. In this website architecture in particular, there is no model layer (M) and as a result the Controller layer (C) remains quite basic as in the following example. The main reason behind a multi-page architecture like this one as opposed to a single-page architecture is that we want the pages to be indexed by web crawlers. render('pages/play/computer/index.html.twig'); } } As a rule of thumb, there is a .twig.html file and a .js file associated to each controller action. So the structure of the App\\Controller\\Pages namespace is mirroring the structure of both the templates/pages folder and the assets/js/pages folder. src/Controller/Pages/Play/ComputerController.php templates/pages/play/computer/index.html.twig assets/js/pages/play/computer/index.js This naming convention allows developers to reduce memorization because given one file name, the name of the remaining two can be inferred. Each page's JavaScript file is then set up as an entrypoint in the importmap.php config file. The main point of the entrypoint script is to update the DOM on user interaction and data change. So the JavaScript code in the assets/js/pages/play/computer/index.js file basically boils down to initialization because the business logic is implemented in WebSocket ESM modules. When the web browser retrieves the response from the WebSocket server, the ESM components are updated with the new data. import { playComputerModal } from './PlayComputerModal.js'; import { binaryWebSocket } from '../../../websockets/binary/BinaryWebSocket.js'; import { stockfishWebSocket } from '../../../websockets/game/StockfishWebSocket.js'; try { await Promise.all([ binaryWebSocket.connect(), stockfishWebSocket.connect() ]); } catch {} playComputerModal.props.modal.show(); WebSocket Connections The ChesslaBlab website is integrated with PHP Chess Server , an asynchronous WebSocket server that provides functionality to play chess online over a WebSocket connection. The environment variables required for the chess server can be found in the assets/env.example.js file. As described in the docs , these are the game modes available: analysis is used to start games for further analysis. play allows to play chess online with other players. stockfish allows to play chess against the computer. The WebSocket ESM modules are implemented based on this same separation of concerns and abstraction: assets/js/websockets/game/AnalysisWebSocket.js assets/js/websockets/game/PlayWebSocket.js assets/js/websockets/game/StockfishWebSocket.js","title":"Architecture"},{"location":"architecture/#architecture","text":"Some familiarity with JavaScript modules as well as with Symfony's Asset Mapper component is recommended in order to follow this section. The ChesslaBlab website is a multi-page application (MPA) that is not adhering to the MVC architectural pattern. The controller actions are basically sending an HTML document to the browser on each request. The business logic is implemented in the chess server. In this website architecture in particular, there is no model layer (M) and as a result the Controller layer (C) remains quite basic as in the following example. The main reason behind a multi-page architecture like this one as opposed to a single-page architecture is that we want the pages to be indexed by web crawlers. render('pages/play/computer/index.html.twig'); } } As a rule of thumb, there is a .twig.html file and a .js file associated to each controller action. So the structure of the App\\Controller\\Pages namespace is mirroring the structure of both the templates/pages folder and the assets/js/pages folder. src/Controller/Pages/Play/ComputerController.php templates/pages/play/computer/index.html.twig assets/js/pages/play/computer/index.js This naming convention allows developers to reduce memorization because given one file name, the name of the remaining two can be inferred. Each page's JavaScript file is then set up as an entrypoint in the importmap.php config file. The main point of the entrypoint script is to update the DOM on user interaction and data change. So the JavaScript code in the assets/js/pages/play/computer/index.js file basically boils down to initialization because the business logic is implemented in WebSocket ESM modules. When the web browser retrieves the response from the WebSocket server, the ESM components are updated with the new data. import { playComputerModal } from './PlayComputerModal.js'; import { binaryWebSocket } from '../../../websockets/binary/BinaryWebSocket.js'; import { stockfishWebSocket } from '../../../websockets/game/StockfishWebSocket.js'; try { await Promise.all([ binaryWebSocket.connect(), stockfishWebSocket.connect() ]); } catch {} playComputerModal.props.modal.show();","title":"Architecture"},{"location":"architecture/#websocket-connections","text":"The ChesslaBlab website is integrated with PHP Chess Server , an asynchronous WebSocket server that provides functionality to play chess online over a WebSocket connection. The environment variables required for the chess server can be found in the assets/env.example.js file. As described in the docs , these are the game modes available: analysis is used to start games for further analysis. play allows to play chess online with other players. stockfish allows to play chess against the computer. The WebSocket ESM modules are implemented based on this same separation of concerns and abstraction: assets/js/websockets/game/AnalysisWebSocket.js assets/js/websockets/game/PlayWebSocket.js assets/js/websockets/game/StockfishWebSocket.js","title":"WebSocket Connections"},{"location":"blog/","text":"Blog A static SEO-optimized blog has been set up to allow chess content creators to share stories with the world. A static blog differs from a dynamic blog in that the content is stored in Markdown files as opposed to in a database. Figure 1 . Click on Blog The posts are stored in the file system in the blog folder. Two sample posts are provided in two languages: English and Spanish . The sitemap.xml file is generated on request based on the routes defined in the config/routing/blog.yaml file. As you can see, all blog routes are prefixed with the word blog . The blog.yaml file is intended to encode the metadata of the posts into multiple languages.","title":"Blog"},{"location":"blog/#blog","text":"A static SEO-optimized blog has been set up to allow chess content creators to share stories with the world. A static blog differs from a dynamic blog in that the content is stored in Markdown files as opposed to in a database. Figure 1 . Click on Blog The posts are stored in the file system in the blog folder. Two sample posts are provided in two languages: English and Spanish . The sitemap.xml file is generated on request based on the routes defined in the config/routing/blog.yaml file. As you can see, all blog routes are prefixed with the word blog . The blog.yaml file is intended to encode the metadata of the posts into multiple languages.","title":"Blog"},{"location":"html-iframes/","text":"HTML Iframes Chess authors can engage with readers on their ChesslaBlab website by embedding chess functionality into their publications. Analysis Board Add the following sample HTML code to your blog post:
Figure 1 . E25 Nimzo-Indian Defense: S\u00e4misch Variation, Keres Variation. Parameters variant The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row. fen An URL-encoded FEN string. movetext An URL-encoded movetext in SAN format. startPos (optional) The start position in a Chess960 game; for example BRNNKBRQ . Annotations Board Add the following sample HTML code to your blog post:
Figure 2 . Lasker - Capablanca World Championship. Parameters variant The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row. fen An URL-encoded FEN string. movetext An URL-encoded movetext in RAV format. startPos (optional) The start position in a Chess960 game; for example BRNNKBRQ .","title":"HTML Iframes"},{"location":"html-iframes/#html-iframes","text":"Chess authors can engage with readers on their ChesslaBlab website by embedding chess functionality into their publications.","title":"HTML Iframes"},{"location":"html-iframes/#analysis-board","text":"Add the following sample HTML code to your blog post:
Figure 1 . E25 Nimzo-Indian Defense: S\u00e4misch Variation, Keres Variation.","title":"Analysis Board"},{"location":"html-iframes/#parameters","text":"","title":"Parameters"},{"location":"html-iframes/#variant","text":"The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row.","title":"variant"},{"location":"html-iframes/#fen","text":"An URL-encoded FEN string.","title":"fen"},{"location":"html-iframes/#movetext","text":"An URL-encoded movetext in SAN format.","title":"movetext"},{"location":"html-iframes/#startpos-optional","text":"The start position in a Chess960 game; for example BRNNKBRQ .","title":"startPos (optional)"},{"location":"html-iframes/#annotations-board","text":"Add the following sample HTML code to your blog post:
Figure 2 . Lasker - Capablanca World Championship.","title":"Annotations Board"},{"location":"html-iframes/#parameters_1","text":"","title":"Parameters"},{"location":"html-iframes/#variant_1","text":"The chess variant as per these options. classical chess, also known as standard or slow chess. 960 is the same as classical chess except that the starting position of the pieces is randomized. dunsany is an asymmetric variant in which Black has the standard chess army and White has 32 pawns. losing chess, the objective of each player is to lose all of their pieces or be stalemated. racing-kings consists of being the first player to move their king to the eighth row.","title":"variant"},{"location":"html-iframes/#fen_1","text":"An URL-encoded FEN string.","title":"fen"},{"location":"html-iframes/#movetext_1","text":"An URL-encoded movetext in RAV format.","title":"movetext"},{"location":"html-iframes/#startpos-optional_1","text":"The start position in a Chess960 game; for example BRNNKBRQ .","title":"startPos (optional)"}]}
\ No newline at end of file
diff --git a/sitemap.xml.gz b/sitemap.xml.gz
index c20fb7c3..c82f8659 100644
Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ