Сайт обваливается Новый


Доброго времени суток, устал уже, нет никаких сил по 100 раз уже восстанавливал сайт с нуля на modx, а он все равно зараза обваливается и слетает. Не могу понять в чем дело, есть сайт — акваклининг33.рф вот его я делаю на modx, суть в следующем. Сначала сайт нормально функционирует как нужно, но спустя сутки отваливаются сначала скрипты такие как — wow.js просто не отвечают и приходится останавливать сценарий, и ajax форма обратной связи feedback.js начинает работать наполовину а потом и сам сайт отваливается выдавая кучу ошибок.

В консоли пишет вот такую штуку и тут сразу целый набор скриптов которые почему то не хотят нормально уже работать а домен тестовый a0179940.xsph.ru:

Error: Script terminated by timeout at:
WOW.prototype.start/this.boxes<@http://a0179940.xsph.ru/assets/js/wow.js:206:39
WOW.prototype.start@http://a0179940.xsph.ru/assets/js/wow.js:202:21
bind/<@http://a0179940.xsph.ru/assets/js/wow.js:3:56
WOW.prototype.init@http://a0179940.xsph.ru/assets/js/wow.js:192:9
@http://a0179940.xsph.ru/assets/js/init.js:2:3
c@https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3:7852
fireWith@https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3:8658
ready@https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3:3264
H@https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3:693

Может кто нибудь сталкивался с такой проблемой? я замучал уже и себя и заказчика никогда на своей практике многолетней с таким не сталкивался, ну не хочет сайт работать и ВСЕ! Помогите кто может
18 января 2018, 08:34    Дмитрий   
0    172 0


Комментарии ()

  1. Дмитрий 18 января 2018, 08:47 # 0
    Мы уже даже на хостинг другой перешли, но везде одно и тоже, на тестовом домене этом с нуля воссоздал снова сайт, раньше все таблицы из бд брал и просто импортировал чтобы с нуля все не делать, сейчас прям все чанки, доп поля, и т.д все с нуля сделал, а итог опять такой же, и на тестовом сайте те же симптомы появились, сначала отваливаются скрипты, перестает работать форма, а потом и сайт обваливается и все, только бэкап исправляет а через время опять тоже самое
    1. Наумов Алексей 18 января 2018, 09:49 # 0
      Открыл, увидел в консоли браузера 500 ошибку при запросе адреса /feedback/
      Но текста ошибки нет. Возможно, из-за ее наличия js скрипты и зависают. Включите отображение ошибок на сервере, посмотрите, что происходит, исправьте.
      1. Дмитрий 18 января 2018, 09:54 # 0
        мне просто интересен тот факт, что когда с бэкапа я восстанавливаю сайт, он работает как нужно, и скрипты с каталога feedback все прекрасно как нужно работает, никаких ошибок нет, в течении времени, сайт никто не трогает, и он сначала выдает в консоли то что я описал выше, а потом и совсем обваливается и выдает ошибки разряда

        Warning: array_merge() [function.array-merge]: Argument #2 is not an array in /MYRoot/core/model/modx/modx.class.php on line 2409
        Fatal error: Class 'modContext_' not found in /MyRoot/core/xpdo/xpdo.class.php on line 763
        1. Наумов Алексей 18 января 2018, 10:38 # +1
          А что на строке 2409 в файле modx.class.php?
          И в xpdo.class.php on line 763 ??

          М.б. у вас дыра на сайте и вирус автоматически через некоторое время заражает сайт и портит файлы?
          1. Дмитрий 18 января 2018, 10:41 # 0
            вот и я непонимаю, в чем может быть дело, cms качаю в официального сайта последнюю версию, вроде бы папка системная core, и файлы в ней от источника должны быть надежные, но вот откуда корни растут непонятно
        2. Дмитрий 18 января 2018, 09:55 # 0
          смущает именно то что изначально ошибок нет, но они возникают без каких либо манипуляций, во всяком случае с моей стороны, а заказчику сомневаюсь что есть смысл что то там самому пытаться менять
          1. Иисус 18 января 2018, 11:09 # 0
            Напишите адрес сайта. Мы посмотрим.
            1. Иисус 18 января 2018, 11:51 # 0
              нашел(акваклининг33. рф/). тут проблема простая, бесплатная версия wow.js содержит скрипт для майнинга, покупайте WoW Commecial за 99 бачей, возможно проблема исчезнет.
              1. Дмитрий 18 января 2018, 11:53 # 0
                а можно посмотреть на него на сам скрипт? как он выглядит?
                1. Алексей Ерохин 18 января 2018, 13:12 # 0
                  откуда информация про майнер в стандартном скрипте?
                  в коде в репозитории ничего такого нет, скорее всего на сайте вирус сидит, который дописывает в js файлы всякую херню.
                  1. Дмитрий 18 января 2018, 13:15 # 0
                    как же его удалить? замучался уже
                    1. Алексей Ерохин 18 января 2018, 13:30 # 0
                      сможете дать архив файлов?
                      1. Дмитрий 18 января 2018, 13:42 # 0
                        да вот ссылка

                        yadi.sk/d/5NtNiPFZ3RZb3r
                        1. Дмитрий 18 января 2018, 14:54 # 0
                          ну как Алексей? есть какие новости?
                          1. Алексей Ерохин 18 января 2018, 15:15 # 0
                            ничего не нашел, но мало ли.
                            Закройте на всякий случай папку core, там внутри htaccess лежит уже.
                            Если есть еще сайты на этом же аккаунте, стоит их проверить.

                            Можно поглядеть access логи, искать post запросы в core и нестандартные файлы.
                            1. Дмитрий 18 января 2018, 15:24 # 0
                              если подумать методом исключений, то я скрипт feedback.js взял с рабочего у себя сайта, и там он вообще работает и никак не конфликтует и тоже на modx, то есть он точно отпадает, смущает меня wow.js и плагин js который я когда то нашел давно еще youtube.js чтобы подгружать видео на сайте когда на него кликнешь
                      2. Дмитрий 18 января 2018, 13:15 # 0
                        проверял сайт неоднократно и на вирусы ничего не выдает
              2. Дмитрий 18 января 2018, 11:53 # 0
                почему же тогда весь сайт в итоге ломается?
                1. Иисус 18 января 2018, 12:13 # 0
                  сам скрипт вот акваклининг33. рф/assets/js/wow.js — его смотри. Удали оттуда часть которую подгружает скрипт майнера.
                  1. Дмитрий 18 января 2018, 12:38 # 0
                    то есть если к примеру вообще wow.js удалить проблема должна исчезнуть? вы точно уверены именно в этом файле?
                    1. Алексей Ерохин 18 января 2018, 13:00 # 0
                      а вы его совсем удалили? если нет, киньте посмотреть, пожалуйста
                      1. Дмитрий 18 января 2018, 13:05 # 0
                        он у меня на тестовом еще остался вот он

                        (function() {
                          var MutationObserver, Util, WeakMap, getComputedStyle, getComputedStyleRX,
                            bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
                            indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
                        
                          Util = (function() {
                            function Util() {}
                        
                            Util.prototype.extend = function(custom, defaults) {
                              var key, value;
                              for (key in defaults) {
                                value = defaults[key];
                                if (custom[key] == null) {
                                  custom[key] = value;
                                }
                              }
                              return custom;
                            };
                        
                            Util.prototype.isMobile = function(agent) {
                              return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent);
                            };
                        
                            Util.prototype.createEvent = function(event, bubble, cancel, detail) {
                              var customEvent;
                              if (bubble == null) {
                                bubble = false;
                              }
                              if (cancel == null) {
                                cancel = false;
                              }
                              if (detail == null) {
                                detail = null;
                              }
                              if (document.createEvent != null) {
                                customEvent = document.createEvent('CustomEvent');
                                customEvent.initCustomEvent(event, bubble, cancel, detail);
                              } else if (document.createEventObject != null) {
                                customEvent = document.createEventObject();
                                customEvent.eventType = event;
                              } else {
                                customEvent.eventName = event;
                              }
                              return customEvent;
                            };
                        
                            Util.prototype.emitEvent = function(elem, event) {
                              if (elem.dispatchEvent != null) {
                                return elem.dispatchEvent(event);
                              } else if (event in (elem != null)) {
                                return elem[event]();
                              } else if (("on" + event) in (elem != null)) {
                                return elem["on" + event]();
                              }
                            };
                        
                            Util.prototype.addEvent = function(elem, event, fn) {
                              if (elem.addEventListener != null) {
                                return elem.addEventListener(event, fn, false);
                              } else if (elem.attachEvent != null) {
                                return elem.attachEvent("on" + event, fn);
                              } else {
                                return elem[event] = fn;
                              }
                            };
                        
                            Util.prototype.removeEvent = function(elem, event, fn) {
                              if (elem.removeEventListener != null) {
                                return elem.removeEventListener(event, fn, false);
                              } else if (elem.detachEvent != null) {
                                return elem.detachEvent("on" + event, fn);
                              } else {
                                return delete elem[event];
                              }
                            };
                        
                            Util.prototype.innerHeight = function() {
                              if ('innerHeight' in window) {
                                return window.innerHeight;
                              } else {
                                return document.documentElement.clientHeight;
                              }
                            };
                        
                            return Util;
                        
                          })();
                        
                          WeakMap = this.WeakMap || this.MozWeakMap || (WeakMap = (function() {
                            function WeakMap() {
                              this.keys = [];
                              this.values = [];
                            }
                        
                            WeakMap.prototype.get = function(key) {
                              var i, item, j, len, ref;
                              ref = this.keys;
                              for (i = j = 0, len = ref.length; j < len; i = ++j) {
                                item = ref[i];
                                if (item === key) {
                                  return this.values[i];
                                }
                              }
                            };
                        
                            WeakMap.prototype.set = function(key, value) {
                              var i, item, j, len, ref;
                              ref = this.keys;
                              for (i = j = 0, len = ref.length; j < len; i = ++j) {
                                item = ref[i];
                                if (item === key) {
                                  this.values[i] = value;
                                  return;
                                }
                              }
                              this.keys.push(key);
                              return this.values.push(value);
                            };
                        
                            return WeakMap;
                        
                          })());
                        
                          MutationObserver = this.MutationObserver || this.WebkitMutationObserver || this.MozMutationObserver || (MutationObserver = (function() {
                            function MutationObserver() {
                              if (typeof console !== "undefined" && console !== null) {
                                console.warn('MutationObserver is not supported by your browser.');
                              }
                              if (typeof console !== "undefined" && console !== null) {
                                console.warn('WOW.js cannot detect dom mutations, please call .sync() after loading new content.');
                              }
                            }
                        
                            MutationObserver.notSupported = true;
                        
                            MutationObserver.prototype.observe = function() {};
                        
                            return MutationObserver;
                        
                          })());
                        
                          getComputedStyle = this.getComputedStyle || function(el, pseudo) {
                            this.getPropertyValue = function(prop) {
                              var ref;
                              if (prop === 'float') {
                                prop = 'styleFloat';
                              }
                              if (getComputedStyleRX.test(prop)) {
                                prop.replace(getComputedStyleRX, function(_, _char) {
                                  return _char.toUpperCase();
                                });
                              }
                              return ((ref = el.currentStyle) != null ? ref[prop] : void 0) || null;
                            };
                            return this;
                          };
                        
                          getComputedStyleRX = /(\-([a-z]){1})/g;
                        
                          this.WOW = (function() {
                            WOW.prototype.defaults = {
                              boxClass: 'wow',
                              animateClass: 'animated',
                              offset: 0,
                              mobile: true,
                              live: true,
                              callback: null,
                              scrollContainer: null
                            };
                        
                            function WOW(options) {
                              if (options == null) {
                                options = {};
                              }
                              this.scrollCallback = bind(this.scrollCallback, this);
                              this.scrollHandler = bind(this.scrollHandler, this);
                              this.resetAnimation = bind(this.resetAnimation, this);
                              this.start = bind(this.start, this);
                              this.scrolled = true;
                              this.config = this.util().extend(options, this.defaults);
                              if (options.scrollContainer != null) {
                                this.config.scrollContainer = document.querySelector(options.scrollContainer);
                              }
                              this.animationNameCache = new WeakMap();
                              this.wowEvent = this.util().createEvent(this.config.boxClass);
                            }
                        
                            WOW.prototype.init = function() {
                              var ref;
                              this.element = window.document.documentElement;
                              if ((ref = document.readyState) === "interactive" || ref === "complete") {
                                this.start();
                              } else {
                                this.util().addEvent(document, 'DOMContentLoaded', this.start);
                              }
                              return this.finished = [];
                            };
                        
                            WOW.prototype.start = function() {
                              var box, j, len, ref;
                              this.stopped = false;
                              this.boxes = (function() {
                                var j, len, ref, results;
                                ref = this.element.querySelectorAll("." + this.config.boxClass);
                                results = [];
                                for (j = 0, len = ref.length; j < len; j++) {
                                  box = ref[j];
                                  results.push(box);
                                }
                                return results;
                              }).call(this);
                              this.all = (function() {
                                var j, len, ref, results;
                                ref = this.boxes;
                                results = [];
                                for (j = 0, len = ref.length; j < len; j++) {
                                  box = ref[j];
                                  results.push(box);
                                }
                                return results;
                              }).call(this);
                              if (this.boxes.length) {
                                if (this.disabled()) {
                                  this.resetStyle();
                                } else {
                                  ref = this.boxes;
                                  for (j = 0, len = ref.length; j < len; j++) {
                                    box = ref[j];
                                    this.applyStyle(box, true);
                                  }
                                }
                              }
                              if (!this.disabled()) {
                                this.util().addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
                                this.util().addEvent(window, 'resize', this.scrollHandler);
                                this.interval = setInterval(this.scrollCallback, 50);
                              }
                              if (this.config.live) {
                                return new MutationObserver((function(_this) {
                                  return function(records) {
                                    var k, len1, node, record, results;
                                    results = [];
                                    for (k = 0, len1 = records.length; k < len1; k++) {
                                      record = records[k];
                                      results.push((function() {
                                        var l, len2, ref1, results1;
                                        ref1 = record.addedNodes || [];
                                        results1 = [];
                                        for (l = 0, len2 = ref1.length; l < len2; l++) {
                                          node = ref1[l];
                                          results1.push(this.doSync(node));
                                        }
                                        return results1;
                                      }).call(_this));
                                    }
                                    return results;
                                  };
                                })(this)).observe(document.body, {
                                  childList: true,
                                  subtree: true
                                });
                              }
                            };
                        
                            WOW.prototype.stop = function() {
                              this.stopped = true;
                              this.util().removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
                              this.util().removeEvent(window, 'resize', this.scrollHandler);
                              if (this.interval != null) {
                                return clearInterval(this.interval);
                              }
                            };
                        
                            WOW.prototype.sync = function(element) {
                              if (MutationObserver.notSupported) {
                                return this.doSync(this.element);
                              }
                            };
                        
                            WOW.prototype.doSync = function(element) {
                              var box, j, len, ref, results;
                              if (element == null) {
                                element = this.element;
                              }
                              if (element.nodeType !== 1) {
                                return;
                              }
                              element = element.parentNode || element;
                              ref = element.querySelectorAll("." + this.config.boxClass);
                              results = [];
                              for (j = 0, len = ref.length; j < len; j++) {
                                box = ref[j];
                                if (indexOf.call(this.all, box) < 0) {
                                  this.boxes.push(box);
                                  this.all.push(box);
                                  if (this.stopped || this.disabled()) {
                                    this.resetStyle();
                                  } else {
                                    this.applyStyle(box, true);
                                  }
                                  results.push(this.scrolled = true);
                                } else {
                                  results.push(void 0);
                                }
                              }
                              return results;
                            };
                        
                            WOW.prototype.show = function(box) {
                              this.applyStyle(box);
                              box.className = box.className + " " + this.config.animateClass;
                              if (this.config.callback != null) {
                                this.config.callback(box);
                              }
                              this.util().emitEvent(box, this.wowEvent);
                              this.util().addEvent(box, 'animationend', this.resetAnimation);
                              this.util().addEvent(box, 'oanimationend', this.resetAnimation);
                              this.util().addEvent(box, 'webkitAnimationEnd', this.resetAnimation);
                              this.util().addEvent(box, 'MSAnimationEnd', this.resetAnimation);
                              return box;
                            };
                        
                            WOW.prototype.applyStyle = function(box, hidden) {
                              var delay, duration, iteration;
                              duration = box.getAttribute('data-wow-duration');
                              delay = box.getAttribute('data-wow-delay');
                              iteration = box.getAttribute('data-wow-iteration');
                              return this.animate((function(_this) {
                                return function() {
                                  return _this.customStyle(box, hidden, duration, delay, iteration);
                                };
                              })(this));
                            };
                        
                            WOW.prototype.animate = (function() {
                              if ('requestAnimationFrame' in window) {
                                return function(callback) {
                                  return window.requestAnimationFrame(callback);
                                };
                              } else {
                                return function(callback) {
                                  return callback();
                                };
                              }
                            })();
                        
                            WOW.prototype.resetStyle = function() {
                              var box, j, len, ref, results;
                              ref = this.boxes;
                              results = [];
                              for (j = 0, len = ref.length; j < len; j++) {
                                box = ref[j];
                                results.push(box.style.visibility = 'visible');
                              }
                              return results;
                            };
                        
                            WOW.prototype.resetAnimation = function(event) {
                              var target;
                              if (event.type.toLowerCase().indexOf('animationend') >= 0) {
                                target = event.target || event.srcElement;
                                return target.className = target.className.replace(this.config.animateClass, '').trim();
                              }
                            };
                        
                            WOW.prototype.customStyle = function(box, hidden, duration, delay, iteration) {
                              if (hidden) {
                                this.cacheAnimationName(box);
                              }
                              box.style.visibility = hidden ? 'hidden' : 'visible';
                              if (duration) {
                                this.vendorSet(box.style, {
                                  animationDuration: duration
                                });
                              }
                              if (delay) {
                                this.vendorSet(box.style, {
                                  animationDelay: delay
                                });
                              }
                              if (iteration) {
                                this.vendorSet(box.style, {
                                  animationIterationCount: iteration
                                });
                              }
                              this.vendorSet(box.style, {
                                animationName: hidden ? 'none' : this.cachedAnimationName(box)
                              });
                              return box;
                            };
                        
                            WOW.prototype.vendors = ["moz", "webkit"];
                        
                            WOW.prototype.vendorSet = function(elem, properties) {
                              var name, results, value, vendor;
                              results = [];
                              for (name in properties) {
                                value = properties[name];
                                elem["" + name] = value;
                                results.push((function() {
                                  var j, len, ref, results1;
                                  ref = this.vendors;
                                  results1 = [];
                                  for (j = 0, len = ref.length; j < len; j++) {
                                    vendor = ref[j];
                                    results1.push(elem["" + vendor + (name.charAt(0).toUpperCase()) + (name.substr(1))] = value);
                                  }
                                  return results1;
                                }).call(this));
                              }
                              return results;
                            };
                        
                            WOW.prototype.vendorCSS = function(elem, property) {
                              var j, len, ref, result, style, vendor;
                              style = getComputedStyle(elem);
                              result = style.getPropertyCSSValue(property);
                              ref = this.vendors;
                              for (j = 0, len = ref.length; j < len; j++) {
                                vendor = ref[j];
                                result = result || style.getPropertyCSSValue("-" + vendor + "-" + property);
                              }
                              return result;
                            };
                        
                            WOW.prototype.animationName = function(box) {
                              var animationName, error;
                              try {
                                animationName = this.vendorCSS(box, 'animation-name').cssText;
                              } catch (error) {
                                animationName = getComputedStyle(box).getPropertyValue('animation-name');
                              }
                              if (animationName === 'none') {
                                return '';
                              } else {
                                return animationName;
                              }
                            };
                        
                            WOW.prototype.cacheAnimationName = function(box) {
                              return this.animationNameCache.set(box, this.animationName(box));
                            };
                        
                            WOW.prototype.cachedAnimationName = function(box) {
                              return this.animationNameCache.get(box);
                            };
                        
                            WOW.prototype.scrollHandler = function() {
                              return this.scrolled = true;
                            };
                        
                            WOW.prototype.scrollCallback = function() {
                              var box;
                              if (this.scrolled) {
                                this.scrolled = false;
                                this.boxes = (function() {
                                  var j, len, ref, results;
                                  ref = this.boxes;
                                  results = [];
                                  for (j = 0, len = ref.length; j < len; j++) {
                                    box = ref[j];
                                    if (!(box)) {
                                      continue;
                                    }
                                    if (this.isVisible(box)) {
                                      this.show(box);
                                      continue;
                                    }
                                    results.push(box);
                                  }
                                  return results;
                                }).call(this);
                                if (!(this.boxes.length || this.config.live)) {
                                  return this.stop();
                                }
                              }
                            };
                        
                            WOW.prototype.offsetTop = function(element) {
                              var top;
                              while (element.offsetTop === void 0) {
                                element = element.parentNode;
                              }
                              top = element.offsetTop;
                              while (element = element.offsetParent) {
                                top += element.offsetTop;
                              }
                              return top;
                            };
                        
                            WOW.prototype.isVisible = function(box) {
                              var bottom, offset, top, viewBottom, viewTop;
                              offset = box.getAttribute('data-wow-offset') || this.config.offset;
                              viewTop = (this.config.scrollContainer && this.config.scrollContainer.scrollTop) || window.pageYOffset;
                              viewBottom = viewTop + Math.min(this.element.clientHeight, this.util().innerHeight()) - offset;
                              top = this.offsetTop(box);
                              bottom = top + box.clientHeight;
                              return top <= viewBottom && bottom >= viewTop;
                            };
                        
                            WOW.prototype.util = function() {
                              return this._util != null ? this._util : this._util = new Util();
                            };
                        
                            WOW.prototype.disabled = function() {
                              return !this.config.mobile && this.util().isMobile(navigator.userAgent);
                            };
                        
                            return WOW;
                        
                          })();
                        
                        }).call(this);
                        
                        1. Алексей Ерохин 18 января 2018, 13:15 # 0
                          Это скрипт такой же как в репозитории wowjs и ничего плохого там нет. Скорее всего у вас сидит вирус, который дописывает в js файлы вредоносный код
                          1. Дмитрий 18 января 2018, 13:17 # 0
                            я и брал его как раз с репозитория, но как можно обнаружить где именно вирус сидит? есть какие нибудь методы кроме антивирусника онлайн
                            1. Андрей 18 января 2018, 17:54 # 0
                              Попробуйте просканить сайт айболитом — AI-Bolit.
                  2. Иисус 18 января 2018, 12:47 # 0
                    эти ошибки точно исчезнут" WOW.prototype.start/this.boxes...." А на счёт других не знаю.
                    В wow_js есть система копирования себя в другие части сайта. В виде пхп интеграцый.
                  3. t.g 18 января 2018, 14:42 # 0
                    Попробуйте переделать форму обратной связи (средствами FormIt Ajax), сейчас она пытается отправить данные во время загрузки страницы но неправильно указанный путь. joxi.net/zANJVevtl71REA. Также какие-то проблемы с кодировкой файлов. Настройте страницу 404 и Вашый сайт закрыт от индексации.
                    1. Дмитрий 18 января 2018, 14:46 # 0
                      в том то и дело что поначалу сайт из бэкапа работает и форма функционирует и все прекрасно отправляет куда нужно, проходит время я ничего не трогаю и внезапно сыпятся эти ошибки
                      1. t.g 18 января 2018, 14:52 # 0
                        Возможно что проблема связана с кириллическим доменом. Можно попробовать в эту сторону посмотреть.
                        1. Дмитрий 18 января 2018, 14:55 # 0
                          может быть, но все же не понятно по логике, как так сайт может работать его никто не трогает а потом как по команде разваливаться начать, мне кажется это скорее всего вирус какой то, ну не бывает же так, что сайт валится и не может cms найти классы, аж в папке core которая при установке была с официального сайта
                          1. t.g 18 января 2018, 15:11 # 0
                            Бывает что вирус может быть в самом ресурсе, отключите html редактор и посмотрите нет ли там чего подозрительного.
                    Вы должны авторизоваться, чтобы оставлять комментарии.