<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
/* 1vmnw4n */

/*
    000-helpers.js
*/
function number_format(number, decimals, dec_point, thousands_sep) {
  //  discuss at: http://phpjs.org/functions/number_format/
  // original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: davook
  // improved by: Brett Zamir (http://brett-zamir.me)
  // improved by: Brett Zamir (http://brett-zamir.me)
  // improved by: Theriault
  // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // bugfixed by: Michael White (http://getsprink.com)
  // bugfixed by: Benjamin Lupton
  // bugfixed by: Allan Jensen (http://www.winternet.no)
  // bugfixed by: Howard Yeend
  // bugfixed by: Diogo Resende
  // bugfixed by: Rival
  // bugfixed by: Brett Zamir (http://brett-zamir.me)
  //  revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  //  revised by: Luke Smith (http://lucassmith.name)
  //    input by: Kheang Hok Chin (http://www.distantia.ca/)
  //    input by: Jay Klehr
  //    input by: Amir Habibi (http://www.residence-mixte.com/)
  //    input by: Amirouche
  //   example 1: number_format(1234.56);
  //   returns 1: '1,235'
  //   example 2: number_format(1234.56, 2, ',', ' ');
  //   returns 2: '1 234,56'
  //   example 3: number_format(1234.5678, 2, '.', '');
  //   returns 3: '1234.57'
  //   example 4: number_format(67, 2, ',', '.');
  //   returns 4: '67,00'
  //   example 5: number_format(1000);
  //   returns 5: '1,000'
  //   example 6: number_format(67.311, 2);
  //   returns 6: '67.31'
  //   example 7: number_format(1000.55, 1);
  //   returns 7: '1,000.6'
  //   example 8: number_format(67000, 5, ',', '.');
  //   returns 8: '67.000,00000'
  //   example 9: number_format(0.9, 0);
  //   returns 9: '1'
  //  example 10: number_format('1.20', 2);
  //  returns 10: '1.20'
  //  example 11: number_format('1.20', 4);
  //  returns 11: '1.2000'
  //  example 12: number_format('1.2000', 3);
  //  returns 12: '1.200'
  //  example 13: number_format('1 000,50', 2, '.', ' ');
  //  returns 13: '100 050.00'
  //  example 14: number_format(1e-8, 8, '.', '');
  //  returns 14: '0.00000001'
  
  number = (number + '')
    .replace(/[^0-9+\-Ee.]/g, '');
  var n = !isFinite(+number) ? 0 : +number,
    prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
    sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
    dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
    s = '',
    toFixedFix = function (n, prec) {
      var k = Math.pow(10, prec);
      return '' + (Math.round(n * k) / k)
        .toFixed(prec);
    };
  // Fix for IE parseFloat(0.55).toFixed(0) = 0;
  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
    .split('.');
  if (s[0].length &gt; 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }
  if ((s[1] || '')
    .length &lt; prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1)
      .join('0');
  }
  return s.join(dec);
}

function num(number, decimals = 0) {
  return number_format(number, decimals, ".", "&amp;nbsp;");
}

/*
  Форматує число для грошей
*/
function money(number) {
  return num(number, 2);
}

/*
  Форматує число для доларів
*/
function usd(number) {
  return '$' + money(number);
}

/*
  Форматує число для Євро
*/
function eur(number) {
  return '€' + money(number);
}

/*
  Форматує число в БТК
*/
function btc(number) {
  return num(number, 9);
}

function _l(code, replacements = {}){
  const table = window._lang || {};
  let message = table[code] || code;
  for(const key in replacements){
    message = message.replace(`{${key}}`, replacements[key]);
  }
  return message;
}
;

/*
    991-script-common.js
*/
const $win = $(window);
const $doc = $(document);

$doc.on("click", "a[data-href], button[data-href]", event =&gt; {
  console.log(event, event.target.dataset.href)
  const link = event.target.dataset.href;
  if (link) {
    event.preventDefault();
    window.location.assign(link);
  }
});

/* Highlight current page link */
$([
  ".header .nav-link[href='" + location.pathname + "'i]",
  ".header .nav-link[data-href='" + location.pathname + "'i]",
  ".header  .dropdown:not(.not-autoopen-on-mobile) .dropdown-item[href='" + location.pathname + "'i]",
  ".header  .dropdown:not(.not-autoopen-on-mobile) .dropdown-item[data-href='" + location.pathname + "'i]",
].join(", ")).addClass("active");

/*
 * SCROLL FIX HEADER
 */
const $headerHolder = $(".header-holder");
const $header = $(".header");

$win.on("scroll click resize", function () {
  if (!$header.length) {
    return;
  }
  
  const headerHeight = $header.get(0).getBoundingClientRect().height;
  const headerTop = $headerHolder.get(0).getBoundingClientRect().top;
  if (headerTop &lt; 0) {
    $header.addClass("fixed");
    $headerHolder.css({
      height: headerHeight,
    });
  } else {
    $header.removeClass("fixed");
    $headerHolder.css({
      height: "",
    });
  }
});
// Тригерим скрол щоб хедер став на потрібне місце
$win.trigger("scroll");

/*
 * INPUT FILE
 */
$("input.custom-file-input[type='file']").on("change", (event) =&gt; {
  const { target } = event;
  const { labels, files } = target;
  
  const namesLabel = Array.from(files).map(file =&gt; file.name).join(", ");
  
  Array.from(labels)
    .filter(label =&gt; label.classList.contains("custom-file-label"))
    .forEach(label =&gt; {
      if (files.length) {
        label.dataset.oldText = label.innerHTML;
        label.innerText = namesLabel;
      } else if (label.dataset.oldText) {
        label.innerHTML = label.dataset.oldText;
        delete label.dataset.oldText;
      }
    });
});

/*
  Photoswipe auto init
*/
$(".my-gallery").photoSwipe().addClass("my-gallery-initialized");

/*
  sticky sidebar
*/
$('.sidebar-sticky').stickySidebar({
  topSpacing: $header.height() + 16,
  bottomSpacing: 16,
  minWidth: 768,
  containerSelector: '.container'
}).css({
  "transition-duration": "0s",
});

/*
  Remote modal
*/
$win.on("show.bs.modal", async event =&gt; {
  const $remoteForm = $(event.target);
  const dataRemote = $remoteForm.data("remote");
  if (!dataRemote) {
    return;
  }
  const $contentBlock = $remoteForm.find(".modal-content")
  $contentBlock
    .html("")
    .addClass("loading")
    .css({
      "min-height": "100px",
    });
  
  const content = await $.ajax(dataRemote);
  const $contentBlockInside = $(`&lt;div&gt;${content}&lt;/div&gt;`);
  
  $contentBlockInside.hide();
  $contentBlock.append($contentBlockInside);
  $contentBlockInside.slideDown();
  setTimeout(() =&gt; {
    $contentBlock
      .removeClass("loading")
      .css({
        "min-height": null,
      });
  }, 500);
});

/*
  Ajax-form
*/
$doc.on("submit", "form.js-ajax-form", event =&gt; {
  const $form = $(event.target);
  $form.ajaxSubmit({
    beforeSubmit: (arr, $form, options) =&gt; {
      $form.addClass("loading");
    },
    
    success: (data, _textStatus, _jqXHR, $form) =&gt; {
      const $content = $(`&lt;div&gt;${data}&lt;/div&gt;`);
      $content.hide();
      $form.prepend($content);
      $content.slideDown();
      $form.removeClass("loading");
      setTimeout(() =&gt; {
        $content.slideUp();
        setTimeout(() =&gt; {
          $content.remove();
        }, 1000);
      }, 5000);
    },
  });
  event.preventDefault();
});

/*
  Open modal on load
*/
(() =&gt; {
  const { hash } = window.location;
  if (!hash || hash.length &lt; 5) {
    return;
  }
  
  const $passedElements = $(hash);
  if ($passedElements.length !== 1) {
    return;
  }
  
  if (!$passedElements.hasClass("modal")) {
    return;
  }
  
  $passedElements.modal();
  history.replaceState(history.state, null, location.href.replace(hash, ""));
})();

/*
  Highlight
*/
hljs.highlightAll();
;

/*
    992-script-blog.js
*/
(() =&gt; {
  if (!window.location.pathname.includes("/blog")) {
    return;
  }
  
  const $allTagTabs = $(".js-tag-badge");
  const $articlesContainter = $(".js-articles");
  const $allArticles = $(".js-articles .js-article");
  
  $allTagTabs.on("click", event =&gt; {
    event.preventDefault();
    const $target = $(event.target);
    const tag = $target.data("tag");
    
    $articlesContainter.css({
      "min-height": $articlesContainter.height() + "px",
    });
    $allArticles.css({
      "transition-duration": "0s",
    });
    $allArticles.fadeOut(250);
    setTimeout(() =&gt; {
      $allArticles.filter("[data-tags~='" + tag + "']").fadeIn(250);
      $articlesContainter.css({
        "min-height": "",
      });
      setTimeout(() =&gt; {
        $allArticles.css({
          "transition-duration": "",
        });
      }, 250);
    }, 800);
    
    $allTagTabs.removeClass("active text-light bg-theme-dark");
    $target.addClass("active text-light bg-theme-dark");
  });
})();
;

/*
    992-script-download.js
*/
const generateDownloadLink = (serviceKey, getParams = {}) =&gt; {
  let currentService;
  if (serviceKey === "current") {
    currentService = window._currentService;
  } else {
    currentService = (window._allServices || []).find(service =&gt; service.key === serviceKey);
  }
  if (!currentService) {
    return false;
  }
  
  const downloadURL = new URL(currentService.download.path, window.location);
  const defaultGetParams = {
    utm_source: "site",
    utm_campaign: currentService.key,
    utm_content: "[not-set]"
  };
  const allGetParams = { ...defaultGetParams, ...getParams };
  for (const key in allGetParams) {
    downloadURL.searchParams.set(key, allGetParams[key]);
  }
  
  return downloadURL.toString();
};

$(document).on("click", "[data-download], [href^='#!download/']", event =&gt; {
  event.preventDefault();
  
  const $target = $(event.target);
  let downloadInfoRaw = $target.data("download");
  if (!downloadInfoRaw) {
    downloadInfoRaw = $target.attr("href").replace("#!download/", "");
  }
  const downloadInfoURLParsed = new URL(downloadInfoRaw, "https://not-existing-base");
  
  const serviceKey = downloadInfoURLParsed.pathname.substr(1);
  const getParams = Object.fromEntries(downloadInfoURLParsed.searchParams.entries());
  
  const downloadLink = generateDownloadLink(serviceKey, getParams);
  window.open(downloadLink);
});
;

/*
    992-script-embed-youtube-video.js
*/
(() =&gt; {
  const $win = $(window);
  
  $(".embed-youtube-video").each((_index, element) =&gt; {
    const $embed = $(element);
    const videoId = $embed.data("video-id");
    
    const coverSrc = `https://i.ytimg.com/vi_webp/${videoId}/hqdefault.webp`;
    $embed.css("background-image", `url(${coverSrc})`);
    
    let insertedIframe = false;
    const insertYoutubeIframe = () =&gt; {
      if (insertedIframe) {
        return;
      }
      insertedIframe = true;
      
      const $videoIframe = $(`&lt;iframe class="embed-youtube-video__iframe embed-youtube-video__iframe__hide" src="https://www.youtube-nocookie.com/embed/${videoId}" title="YouTube video player" frameborder="0" allow="autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""&gt;&lt;/iframe&gt;`);
      $videoIframe.on("focus load", event =&gt; {
        $embed.addClass("embed-youtube-video__loaded");
        $videoIframe.removeClass("embed-youtube-video__iframe__hide");
      });
      $videoIframe.on("error", event =&gt; {
        $videoIframe.remove();
        $embed.hide();
      });
      $embed.append($videoIframe);
    };
    
    $win.on("load scroll", event =&gt; {
      const viewportHeight = window.innerHeight;
      const embedRect = $embed.get(0).getBoundingClientRect();
      
      if (embedRect.top &lt; viewportHeight) {
        insertYoutubeIframe();
        $win.off("scroll", event.handleObj.handler);
      }
    });
    setTimeout(insertYoutubeIframe, 10000);
  });
})();
;

/*
    992-script-order.js
*/
// Order
(() =&gt; {
  if (!/\/order$/ig.test(window.location.pathname) &amp;&amp; !/\/order2$/ig.test(window.location.pathname)) {
    return;
  }
  
  const $allPlanCards = $(".plan");
  let $currentPlanCards = $allPlanCards;

  function setPlanActive(target) {
    //const $target = $(event.target).closest(".plan");
    const $target = $(target).closest(".plan");
    const planAmount = $target.data("amount");
    
    $currentPlanCards.removeClass("active");
    $target.addClass("active");
    $(".js-current-amount").text(planAmount);
  }

  $allPlanCards.on("click", event =&gt; {
    $(event.target).find("input").trigger("input");
  });

  const $planRange = $(".plan-ext-select");
  $planRange.on("input", event =&gt; {
    const $currentPlanRange = $(event.target).closest("input[type='range'i]");
    const $currentPlanCard = $currentPlanRange.closest(".plan-ext");
    const value = $currentPlanRange.val();
    const plans = $currentPlanRange.data("plans");
    const plan = plans[+value] || plans[defaultIndex];
    
    $currentPlanCard.data("amount", plan.amount);
    $currentPlanCard.find(".plan__duration").text(_l(plan.duration_string_key));
    if (plan.amount_old) {
      $currentPlanCard.find(".plan__amount__old")
        .show()
        .find(" .text")
        .text(money(plan.amount_old));
    } else {
      $currentPlanCard.find(".plan__amount__old").hide();
    }
    $currentPlanCard.find(".plan__amount__normal .text").text(money(plan.amount));
    if (plan.amount_monthly) {
      $currentPlanCard.find(".plan__amount__monthly")
        .show()
        .find(" .text")
        .text(money(plan.amount_monthly));
    } else {
      $currentPlanCard.find(".plan__amount__monthly").hide();
    }
    
    //console.table(plan);
    //console.log('new plan '+plan.key);
    // TODO: Навести порядок
    $("input[name=product_name]").val(plan.key);
    $("input[name=product_duration]").val(plan.duration_string_key);
    $("input[name=product_amount]").val(plan.amount);
    setPlanActive(event.target);
  });
  
  $planRange.trigger("input");
  $planRange.eq(0).trigger("input");
})();
;

/*
    992-script-reviews.js
*/
// Order
(() =&gt; {
  if (!/\/reviews$/ig.test(window.location.pathname)) {
    return;
  }
  
  
})();
;

</pre></body></html>