{"id":470687,"date":"2025-08-14T03:05:00","date_gmt":"2025-08-14T03:05:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=470687"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=470687","title":{"rendered":"<span>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (FSM \u2013 finite state machine)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u0430\u043a \u043d\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<h2>\u041e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u2013 \u044d\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f, \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438 \u043d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439.<\/p>\n<p>\u0414\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043e\u0431\u0448\u0438\u0440\u043d\u044b.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043b\u0438 \u0433\u043b\u0430\u0432\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0413\u043b\u0430\u0432\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0433\u0440\u0430\u0444.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u043e\u0442, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h2>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0428\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438\u043b\u0438 \u0433\u0440\u0430\u0444 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438\u043b\u0438 \u0433\u0440\u0430\u0444 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u2013 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444, \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438, \u0430 \u0434\u0443\u0433\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440:<\/strong><\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e98\/bd2\/b01\/e98bd2b01d887e775580e91376ccf5a4.png\" width=\"590\" height=\"150\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e98\/bd2\/b01\/e98bd2b01d887e775580e91376ccf5a4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e98\/bd2\/b01\/e98bd2b01d887e775580e91376ccf5a4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u2014 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0412 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S5<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418\u0437 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043c\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>\u0414\u0430\u043d \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong><\/p>\n<pre><code>}%1VMF19C.:$A--+G-SWL5#&gt;9XJ&gt;TYNCU(EO'-5,2K~}?&lt;2&lt;3K\\QX,!5FT.AX21IX^MYA9)I=+&amp;LL{LO34K|DD~H|B2)KPLI5 \\VFQOI-NLXK]*XYM[U&amp;MMYS2U?S_2(3L%\"J{)AEGGLK&amp;V4GNMS_]U|;K&lt;F_@B~J'Y\"!YYB&lt;YK?:8IW)}32JR&lt;DXG)JAW~`'EI L8S1\\4%V'&amp;\/)TVCLL=;VY2_W&gt;SVL&amp;S5TOC;J*`&gt;#7C\/')!B&amp;IS+HX|ZRG}V~T_W4FJ&lt;33E8CTGOUV9Z?DEHJ'@D+&gt;E!3RO2J^ MJ}?L{}IG~_IKWF&gt;HHBZGKWVQUNJJ'QNNG*&amp;N5GM;|S&gt;X7CFZ!U1CZJMFYKPCF.CL6VLG+H1IW|ZYPBNN\"AFSJJT,JV,IOSFE K!}$25FAZCL\\9?EJNKO&gt;OW;YNSJUKMP+,SQ$OP#\/Q%H4JIQ&gt;K7&lt;R@GUB-@GAK!42#1B6V*MOZV#Z&lt;{YDI'AT&lt;ZJ0LXTF{SM,\\ {DW{\\9]L{8@&gt;|U\/9P4\/I6}[U43K\\|T'_{W}^PND,\/;CVFNK3+}6%5\/PSC'A)X,PRN;A?M(2:TO'%6SEM}D6}1SWTOD]X\\6QG8 DLZT,+N,XVGOG[BWOKJ^:UR,;IQCBH$RYQ.;TZ,IM!4GWYO8A&amp;~R#2D&lt;FFQ('XW^|G0;WC]#L3JUH,~C~&amp;MYOOT$$~%V{X4VT =&amp;II`|GHXW$S'W$O(V&amp;#-KOO9IS&lt;RXQ}^PJEAS|I=Y0C$KQO9T[(2.`[G\\(7CU{L.OJ[4$(-!S*S~7IF$B&gt;UJ=S.DY30+)(]J R\/1!RZD[B1KS?X[FXTUF4Z&lt;=Z#-X1BVC\\{R6~].Z&lt;K&gt;^CKAGNVX*K[=.C?)WD+9W!WF|PF)I=Y`Y&lt;RHZCR%2CROL-OGDV&gt;X\/S OQU^O[R\/P,=D-:N:O@|3RD._VJPC,[_E3`3.HL,NODKC}YS&amp;&amp;RNG\"BBO[}LP}`CX:R`W%#BLGIG&gt;J9^W8?.)NN\/3C=)C'QK6K MR(I~EBL\/1L:J'?^.&amp;OFNM(Z{\"28FESG?V-\\DRC$K6OK~A;X$SL8SV=E+O6$_VR;_$JZUPK`I&amp;9Z3LVH~!!NW^H}'GFF(2(YS DB`Y5D[`I2+_$LK*PPCAMLJP.V`AZGK9`~~CP8P!SQNOD#F~VX+[T.)@V`ZZYTNFVJVAJ{3AL[`!NJJ)Q=82%2SC)U3|ZPM^3 L?M_MY+D(OB&lt;`HN,C7;EE^\"2O7AFE+(WDO?!'UP+@QZ3#6G}C*0SS=C'C3HO+MTDU~`?4KU:DPBNF):F#;ZND1]3O1V8;KRZT OOMB^TA-EZ1DF.G`E`O,JI?{WE&gt;D.WWGR4H}9URG+L@SAL;&lt;NT:{?JPN38PD+M\\T_55`+;.FO\"'ANKNU\\BHYI?S-OBMLX&lt;5%H D62\"J2:EQI?8_#:\"Q$'CS8HP3-Y8GTO\\E.Z[H*V=W%.!15L\\(M|=SR;;91}PI_1D5%D&lt;,\/;GKQFE?AST;&lt;D\/JA7NF\\`4UN=_U +.X\\}[Z,U\"RZ&amp;O1|7E7CQT?*AINZUBUGHQL%S:1P`]&lt;DNY!5QKXQY=$S?'AZ%NUH&gt;:^J#{EBPEIJ(7L%#^\"WKRMGQ\\A%$-BCZ Q&gt;V,\\~PTRGMT9E,J,OXPSYG{_]\\D&lt;^L&lt;VB4UOT*M7BL@H&gt;;EZTEAQ*HX7K)YGCVQZ&amp;'~L)Z7I*|*IQD\"YJJDL]8AFUTAMO+\", J=;OAPAHD4W$VF^?LZ]EXRDZ\\NSV@U|XR\\2HQ_RRQKIUH91DWYI!;LG2U53`M\\65DHO9:;{\"]ZGQ+9_;I'F$ZWEQ&lt;@ARO*VR* GYTZ'I_5\\2;QJF#*+^$SGH{2RO;DA#{F~:U#VW,{V!I]V$AEIG[IE[\\*$+MY#D5X\\B(E~\"M|Q%91%LG&amp;}{H)3Q],#{J\/HV&lt;:X NGD(NF+OFW-MLCE(00I=Q)!B:CO(B$IJ:KU?PBQ9MZJ,7Z6CJ=\/SYC&gt;S8&lt;9E.7Y#W6~]]VZ}|?(8X3D;*O+KP9L&lt;;X!%3KHGX .+0)SB~I8KSIJ@WT`G[XGP-3\/-VB@C9%V{6UEAR9I@OIU5.:}F{K$H\"8GHR&gt;+'C&amp;WB)UTR&amp;6BE#(13}A+K5C?:NCQ8I4=C0N9 (^+''TU8H_,QE$&lt;RZC]D3@XF[(XJCU\/N@8CU&amp;J%P@,~X8N;`0[{D^IKF8CS05ETLD)CT:1$,3FEZ:K}T&lt;CO&gt;,\/L?II(H}GR&gt;J P8\"WY(B%$5!`^4MU&lt;NGRSS8|\/$=PBH9K|XD5JN_YJ7PW6MWABELJ=KK&gt;G|L\"KYMUAX-(P*JA\"N67EH:X&amp;F\"\/&lt;2W[RD_2_}6TP<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 FINITESTATEMACHINE, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"scala\">trait Fsm {   private type Transition = State =&gt; State   private type StateFunction = PartialFunction[Event, Transition]    private val stateFunctions = mutable.Map[Status, StateFunction]()    def process(currentState: State, event: Event): State = {     val stateFunction = stateFunctions(currentState.status)     val nextState = if (stateFunction.isDefinedAt(event)) {       stateFunction(event)(currentState)     } else {       stay()(currentState).withStopReason(FsmException(s\"Unhandled event $event in state $currentState\"))     }     nextState.stopReason.foreach(throw _)     applyState(nextState, currentState)   }    protected final def when(statuses: Status*)(stateFunction: StateFunction): Unit = {     statuses.foreach(register(_, stateFunction))   }    protected final def start(status: Status): State = State(status)    protected final def stay(): Transition = currentState =&gt; currentState    protected final def goto(nextStatus: Status): Transition = _ =&gt; State(nextStatus)    protected final def stop(reason: FsmException): Transition = {     currentState =&gt; stay()(currentState).withStopReason(reason)   }    private final def register(status: Status, function: StateFunction): Unit = {     stateFunctions(status) = stateFunctions.getOrElse(status, function)   }    private def applyState(nextState: State, currentState: State): State = {     val state = if (stateFunctions.contains(nextState.status)) {       nextState     } else {       stay()(currentState).withStopReason(FsmException(s\"Next state ${nextState.status} does not exist\"))     }     state.stopReason.foreach(throw _)     state   } }  object Fsm {   trait Status {     def is(pf: PartialFunction[Status, Boolean]): Boolean = Status.is(this)(pf)   }    object Status {     def is(status: Status)(pf: PartialFunction[Status, Boolean]): Boolean = pf.lift(status).fold(false)(identity)   }    class Event    case class State(status: Status, stopReason: Option[FsmException] = None) {     def !(event: Event)(implicit fsm: Fsm): State = fsm.process(this, event)      private[core] def withStopReason(reason: FsmException): State = copy(stopReason = Some(reason))   }    case class FsmException(message: String) extends RuntimeException(message) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0443 \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u043e\u0432\u0430. \u0412\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438:<\/strong><\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Start \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c Stop. \u041c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u043f\u0438\u0448\u0435\u043c \u0432\u0435\u0441\u044c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442. \u0421\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u043a\u043e\u043c\u044b\u0445 \u0441\u043b\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Unknown \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"scala\">object Letters {   object Statuses {     case object Start extends Status     case object Stop extends Status      case object A extends Status     case object B extends Status     case object C extends Status     case object D extends Status     case object E extends Status     case object F extends Status     case object G extends Status     case object H extends Status     case object I extends Status     case object J extends Status     case object K extends Status     case object L extends Status     case object M extends Status     case object N extends Status     case object O extends Status     case object P extends Status     case object Q extends Status     case object R extends Status     case object S extends Status     case object T extends Status     case object U extends Status     case object V extends Status     case object W extends Status     case object X extends Status     case object Y extends Status     case object Z extends Status   }    object Events {     case object Unknown extends Event      case object A extends Event     case object B extends Event     case object C extends Event     case object D extends Event     case object E extends Event     case object F extends Event     case object G extends Event     case object H extends Event     case object I extends Event     case object J extends Event     case object K extends Event     case object L extends Event     case object M extends Event     case object N extends Event     case object O extends Event     case object P extends Event     case object Q extends Event     case object R extends Event     case object S extends Event     case object T extends Event     case object U extends Event     case object V extends Event     case object W extends Event     case object X extends Event     case object Y extends Event     case object Z extends Event   }    object LettersFsm extends Fsm {     val start: State = start(Statuses.Start)      when(Statuses.Start) {       case Events.F =&gt; goto(Statuses.F)       case Events.S =&gt; goto(Statuses.S)       case Events.M =&gt; goto(Statuses.M)       case _ =&gt; stay()     }      when(Statuses.F) {       case Events.I =&gt; goto(Statuses.I)       case _ =&gt; stay()     }      when(Statuses.I) {       case Events.N =&gt; goto(Statuses.N)       case Events.T =&gt; goto(Statuses.T)       case _ =&gt; stay()     }      when(Statuses.N) {       case Events.I =&gt; goto(Statuses.I)       case Events.E =&gt; goto(Statuses.E)       case _ =&gt; stay()     }      when(Statuses.I) {       case Events.N =&gt; goto(Statuses.N)       case _ =&gt; stay()     }      when(Statuses.T) {       case Events.E =&gt; goto(Statuses.E)       case Events.A =&gt; goto(Statuses.A)       case _ =&gt; stay()     }      when(Statuses.S) {       case Events.T =&gt; goto(Statuses.T)       case _ =&gt; stay()     }      when(Statuses.A) {       case Events.T =&gt; goto(Statuses.T)       case Events.C =&gt; goto(Statuses.C)       case _ =&gt; stay()     }      when(Statuses.C) {       case Events.H =&gt; goto(Statuses.H)       case _ =&gt; stay()     }      when(Statuses.M) {       case Events.A =&gt; goto(Statuses.A)       case _ =&gt; stay()     }      when(Statuses.H) {       case Events.I =&gt; goto(Statuses.I)       case _ =&gt; stay()     }      when(Statuses.E) {       case _ =&gt; goto(Statuses.Stop)     }      when(Statuses.Stop) {       case event =&gt; (current: State) =&gt; stop(FsmException(s\"Event: $event received in finite status: ${current.status}\"))(current)     }   }    implicit val fsm: LettersFsm.type = LettersFsm   val start: State = fsm.start }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/strong><\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/539\/9eb\/3ba\/5399eb3ba907618a51d6860a218f313e.png\" width=\"1062\" height=\"770\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/539\/9eb\/3ba\/5399eb3ba907618a51d6860a218f313e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/539\/9eb\/3ba\/5399eb3ba907618a51d6860a218f313e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0438\u0441\u043a\u043e\u043c\u044b\u0445 \u0441\u043b\u043e\u0432, \u0442\u043e \u0432\u044b\u0445\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0448\u0443\u043c\u043e\u043c.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438:<\/strong><\/p>\n<pre><code>FINE MACHINE STE STE MACHITE MACHITE MATATATE MACHINE MATE FITATACHITACHINITE MACHINE FITE STE STACHITE FINE MATE STACHITE MACHINITE MATE MACHITE FITE FITATE MATACHITE STE FITATACHINITATE STACHINE MATE FITATE MACHINININE MATATACHINININININE MATE FITACHITACHINE STE MACHITE STATACHITATACHINITACHITATATACHINE MACHITE FINITE<\/code><\/pre>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438:<\/strong><\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Start \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c Stop. \u041c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0441\u043a\u043e\u043c\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u0421\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043a\u043e\u043c\u044b\u0435 \u0441\u043b\u043e\u0432\u0430. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Unknown \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432.<\/p>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"scala\">object Words {   object Statuses {     case object Start extends Status     case object Stop extends Status      case object Finite extends Status     case object State extends Status     case object Machine extends Status   }    object Events {     case object Unknown extends Event      case object Finite extends Event     case object State extends Event     case object Machine extends Event   }    object WordsFsm extends Fsm {     val start: State = start(Statuses.Start)      when(Statuses.Start) {       case Events.Finite =&gt; goto(Statuses.Finite)       case _ =&gt; stay()     }      when(Statuses.Finite) {       case Events.State =&gt; goto(Statuses.State)       case _ =&gt; stay()     }      when(Statuses.State) {       case Events.Machine =&gt; goto(Statuses.Machine)       case _ =&gt; stay()     }      when(Statuses.Machine) {       case _ =&gt; goto(Statuses.Stop)     }      when(Statuses.Stop) {       case event =&gt; (current: State) =&gt; stop(FsmException(s\"Event: $event received in finite status: ${current.status}\"))(current)     }   }    implicit val fsm: WordsFsm.type = WordsFsm   val start: State = fsm.start }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/strong><\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/332\/1b2\/067\/3321b2067fd09a0c2d9ef40022b8ae7f.png\" width=\"1027\" height=\"749\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/332\/1b2\/067\/3321b2067fd09a0c2d9ef40022b8ae7f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/332\/1b2\/067\/3321b2067fd09a0c2d9ef40022b8ae7f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0438\u0441\u043a\u043e\u043c\u044b\u0445 \u0441\u043b\u043e\u0432, \u0442\u043e \u0432\u044b\u0445\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0448\u0443\u043c\u0430.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438:<\/strong><\/p>\n<pre><code>FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE FINITESTATEMACHINE<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0432\u044b\u0445\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u043c \u0434\u0430\u0435\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 github \u2013 <a href=\"https:\/\/github.com\/dmitry-goncharov\/fsmex\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/dmitry-goncharov\/fsmex<\/a><\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0441\u043e\u0441\u0430\u043d\u0430 \u0438\u0437 \u043f\u0430\u043b\u044c\u0446\u0430, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u0430 \u0438, \u0432\u043e\u043e\u0431\u0449\u0435, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u0422\u0430\u043a\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0435 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u044b\u0441\u043e\u043a\u0430, \u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438. \u041e\u043f\u0438\u0441\u0430\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0438 \u043f\u0443\u0441\u0442\u0438\u0432 \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043c\u0430\u0448\u0438\u0441\u0442\u0435\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445, \u043d\u043e \u0431\u0435\u0437 \u043d\u0438\u0445 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/936138\/\"> https:\/\/habr.com\/ru\/articles\/936138\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u0430\u043a \u043d\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<h2>\u041e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u2013 \u044d\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f, \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438 \u043d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439.<\/p>\n<p>\u0414\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043e\u0431\u0448\u0438\u0440\u043d\u044b.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043b\u0438 \u0433\u043b\u0430\u0432\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0413\u043b\u0430\u0432\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0433\u0440\u0430\u0444.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u043e\u0442, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h2>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0428\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438\u043b\u0438 \u0433\u0440\u0430\u0444 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438\u043b\u0438 \u0433\u0440\u0430\u0444 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u2013 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444, \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438, \u0430 \u0434\u0443\u0433\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440:<\/strong><\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u2014 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0412 \u044f\u0447\u0435\u0439\u043a\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<td>\n<p align=\"left\">S1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<td>\n<p align=\"left\">S2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S3<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S4<\/p>\n<\/td>\n<td>\n<p align=\"left\">S5<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418\u0437 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043c\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>\u0414\u0430\u043d \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/strong><\/p>\n<pre><code>}%1VMF19C.:$A--+G-SWL5#&gt;9XJ&gt;TYNCU(EO'-5,2K~}?&lt;2&lt;3K\\QX,!5FT.AX21IX^MYA9)I=+&amp;LL{LO34K|DD~H|B2)KPLI5 \\VFQOI-NLXK]*XYM[U&amp;MMYS2U?S_2(3L%\"J{)AEGGLK&amp;V4GNMS_]U|;K&lt;F_@B~J'Y\"!YYB&lt;YK?:8IW)}32JR&lt;DXG)JAW~`'EI L8S1\\4%V'&amp;\/)TVCLL=;VY2_W&gt;SVL&amp;S5TOC;J*`&gt;#7C\/')!B&amp;IS+HX|ZRG}V~T_W4FJ&lt;33E8CTGOUV9Z?DEHJ'@D+&gt;E!3RO2J^ MJ}?L{}IG~_IKWF&gt;HHBZGKWVQUNJJ'QNNG*&amp;N5GM;|S&gt;X7CFZ!U1CZJMFYKPCF.CL6VLG+H1IW|ZYPBNN\"AFSJJT,JV,IOSFE K!}$25FAZCL\\9?EJNKO&gt;OW;YNSJUKMP+,SQ$OP#\/Q%H4JIQ&gt;K7&lt;R@GUB-@GAK!42#1B6V*MOZV#Z&lt;{YDI'AT&lt;ZJ0LXTF{SM,\\ {DW{\\9]L{8@&gt;|U\/9P4\/I6}[U43K\\|T'_{W}^PND,\/;CVFNK3+}6%5\/PSC'A)X,PRN;A?M(2:TO'%6SEM}D6}1SWTOD]X\\6QG8 DLZT,+N,XVGOG[BWOKJ^:UR,;IQCBH$RYQ.;TZ,IM!4GWYO8A&amp;~R#2D&lt;FFQ('XW^|G0;WC]#L3JUH,~C~&amp;MYOOT$$~%V{X4VT =&amp;II`|GHXW$S'W$O(V&amp;#-KOO9IS&lt;RXQ}^PJEAS|I=Y0C$KQO9T[(2.`[G\\(7CU{L.OJ[4$(-!S*S~7IF$B&gt;UJ=S.DY30+)(]J R\/1!RZD[B1KS?X[FXTUF4Z&lt;=Z#-X1BVC\\{R6~].Z&lt;K&gt;^CKAGNVX*K[=.C?)WD+9W!WF|PF)I=Y`Y&lt;RHZCR%2CROL-OGDV&gt;X\/S OQU^O[R\/P,=D-:N:O@|3RD._VJPC,[_E3`3.HL,NODKC}YS&amp;&amp;RNG\"BBO[}LP}`CX:R`W%#BLGIG&gt;J9^W8?.)NN\/3C=)C'QK6K MR(I~EBL\/1L:J'?^.&amp;OFNM(Z{\"28FESG?V-\\DRC$K6OK~A;X$SL8SV=E+O6$_VR;_$JZUPK`I&amp;9Z3LVH~!!NW^H}'GFF(2(YS DB`Y5D[`I2+_$LK*PPCAMLJP.V`AZGK9`~~CP8P!SQNOD#F~VX+[T.)@V`ZZYTNFVJVAJ{3AL[`!NJJ)Q=82%2SC)U3|ZPM^3 L?M_MY+D(OB&lt;`HN,C7;EE^\"2O7AFE+(WDO?!'UP+@QZ3#6G}C*0SS=C'C3HO+MTDU~`?4KU:DPBNF):F#;ZND1]3O1V8;KRZT OOMB^TA-EZ1DF.G`E`O,JI?{WE&gt;D.WWGR4H}9URG+L@SAL;&lt;NT:{?JPN38PD+M\\T_55`+;.FO\"'ANKNU\\BHYI?S-OBMLX&lt;5%H D62\"J2:EQI?8_#:\"Q$'CS8HP3-Y8GTO\\E.Z[H*V=W%.!15L\\(M|=SR;;91}PI_1D5%D&lt;,\/;GKQFE?AST;&lt;D\/JA7NF\\`4UN=_U +.X\\}[Z,U\"RZ&amp;O1|7E7CQT?*AINZUBUGHQL%S:1P`]&lt;DNY!5QKXQY=$S?'AZ%NUH&gt;:^J#{EBPEIJ(7L%#^\"WKRMGQ\\A%$-BCZ Q&gt;V,\\~PTRGMT9E,J,OXPSYG{_]\\D&lt;^L&lt;VB4UOT*M7BL@H&gt;;EZTEAQ*HX7K)YGCVQZ&amp;'~L)Z7I*|*IQD\"YJJDL]8AFUTAMO+\", J=;OAPAHD4W$VF^?LZ]EXRDZ\\NSV@U|XR\\2HQ_RRQKIUH91DWYI!;LG2U53`M\\65DHO9:;{\"]ZGQ+9_;I'F$ZWEQ&lt;@ARO*VR* GYTZ'I_5\\2;QJF#*+^$SGH{2RO;DA#{F~:U#VW,{V!I]V$AEIG[IE[\\*$+MY#D5X\\B(E~\"M|Q%91%LG&amp;}{H)3Q],#{J\/HV&lt;:X NGD(NF+OFW-MLCE(00I=Q)!B:CO(B$IJ:KU?PBQ9MZJ,7Z6CJ=\/SYC&gt;S8&lt;9E.7Y#W6~]]VZ}|?(8X3D;*O+KP9L&lt;;X!%3KHGX .+0)SB~I8KSIJ@WT`G[XGP-3\/-VB@C9%V{6UEAR9I@OIU5.:}F{K$H\"8GHR&gt;+'C&amp;WB)UTR&amp;6BE#(13}A+K5C?:NCQ8I4=C0N9 (^+''TU8H_,QE$&lt;RZC]D3@XF[(XJCU\/N@8CU&amp;J%P@,~X8N;`0[{D^IKF8CS05ETLD)CT:1$,3FEZ:K}T&lt;CO&gt;,\/L?II(H}GR&gt;J P8\"WY(B%$5!`^4MU&lt;NGRSS8|\/$=PBH9K|XD5JN_YJ7PW6MWABELJ=KK&gt;G|L\"KYMUAX-(P*JA\"N67EH:X&amp;F\"\/&lt;2W[RD_2_}6TP<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 FINITESTATEMACHINE, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"scala\">trait Fsm {   private type Transition = State =&gt; State   private type StateFunction = PartialFunction[Event, Transition]    private val stateFunctions = mutable.Map[Status, StateFunction]()    def process(currentState: State, event: Event): State = {     val stateFunction = stateFunctions(currentState.status)     val nextState = if (stateFunction.isDefinedAt(event)) {       stateFunction(event)(currentState)     } else {       stay()(currentState).withStopReason(FsmException(s\"Unhandled event $event in state $currentState\"))     }     nextState.stopReason.foreach(throw _)     applyState(nextState, currentState)   }    protected final def when(statuses: Status*)(stateFunction: StateFunction): Unit = {     statuses.foreach(register(_, stateFunction))   }    protected final def start(status: Status): State = State(status)    protected final def stay(): Transition = currentState =&gt; currentState    protected final def goto(nextStatus: Status): Transition = _ =&gt; State(nextStatus)    protected final def stop(reason: FsmException): Transition = {     currentState =&gt; stay()(currentState).withStopReason(reason)   }    private final def register(status: Status, function: StateFunction): Unit = {     stateFunctions(status) = stateFunctions.getOrElse(status, function)   }    private def applyState(nextState: State, currentState: State): State = {     val state = if (stateFunctions.contains(nextState.status)) {       nextState     } else {       stay()(currentState).withStopReason(FsmException(s\"Next state ${nextState.status} does not exist\"))     }     state.stopReason.foreach(throw _)     state   } }  object Fsm {   trait Status {     def is(pf: PartialFunction[Status, Boolean]): Boolean = Status.is(this)(pf)   }    object Status {     def is(status: Status)(pf: PartialFunction[Status, Boolean]): Boolean = pf.lift(status).fold(false)(identity)   }    class Event    case class State(status: Status, stopReason: Option[FsmException] = None) {     def !(event: Event)(implicit fsm: Fsm): State = fsm.process(this, event)      private[core] def withStopReason(reason: FsmException): State = copy(stopReason = Some(reason))   }    case class FsmException(message: String) extends RuntimeException(message) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0443 \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u043e\u0432\u0430. \u0412\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438:<\/strong><\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Start \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c Stop. \u041c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u043f\u0438\u0448\u0435\u043c \u0432\u0435\u0441\u044c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442. \u0421\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u043a\u043e\u043c\u044b\u0445 \u0441\u043b\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Unknown \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"scala\">object Letters {   object Statuses {     case object Start extends Status     case object Stop extends Status      case object A extends Status     case object B extends Status     case object C extends Status     case object D extends Status     case object E extends Status     case object F extends Status     case object G extends Status     case object H extends Status     case object I extends Status     case object J extends Status     case object K extends Status     case object L extends Status     case object M extends Status     case object N extends Status     case object O extends Status     case object P extends Status     case object Q extends Status     case object R extends Status     case object S extends Status     case object T extends Status     case object U extends Status     case object V extends Status     case object W extends Status     case object X extends Status     case object Y extends Status     case object Z extends Status   }    object Events {     case object Unknown extends Event      case object A extends Event     case object B extends Event     case object C extends Event     case object D extends Event     case object E extends Event     case object F extends Event     case object G extends Event     case object H extends Event     case object I extends Event     case object J extends Event     case object K extends Event     case object L extends Event     case object M extends Event     case object N extends Event     case object O extends Event     case object P extends Event     case object Q extends Event     case object R extends Event     case object S extends Event     case object T extends Event     case object U extends Event     case object V extends Event     case object W extends Event     case object X extends Event     case object Y extends Event     case object Z extends Event   }    object LettersFsm extends Fsm {     val start: State = start(Statuses.Start)      when(Statuses.Start) {       case Events.F =&gt; goto(Statuses.F)       case Events.S =&gt; goto(Statuses.S)       case Events.M =&gt; goto(Statuses.M)       case _ =&gt;<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-470687","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=470687"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470687\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=470687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=470687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=470687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}