diff --git a/404.html b/404.html index 920aa2d6c..dae4c6314 100644 --- a/404.html +++ b/404.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/assets/Figure_2.01_B18602.373ad162.jpg b/assets/Figure_2.01_B18602.373ad162.jpg new file mode 100644 index 000000000..450ce1b0a Binary files /dev/null and b/assets/Figure_2.01_B18602.373ad162.jpg differ diff --git a/assets/Figure_2.02_B18602.234e28ef.jpg b/assets/Figure_2.02_B18602.234e28ef.jpg new file mode 100644 index 000000000..22120328c Binary files /dev/null and b/assets/Figure_2.02_B18602.234e28ef.jpg differ diff --git a/assets/Figure_2.03_B18602.6231b535.jpg b/assets/Figure_2.03_B18602.6231b535.jpg new file mode 100644 index 000000000..0c8a987f5 Binary files /dev/null and b/assets/Figure_2.03_B18602.6231b535.jpg differ diff --git a/assets/Figure_2.04_B18602.fa796e98.jpg b/assets/Figure_2.04_B18602.fa796e98.jpg new file mode 100644 index 000000000..bc87bfe4c Binary files /dev/null and b/assets/Figure_2.04_B18602.fa796e98.jpg differ diff --git a/assets/Figure_2.05_B18602.5e3e06c6.jpg b/assets/Figure_2.05_B18602.5e3e06c6.jpg new file mode 100644 index 000000000..c37f1a793 Binary files /dev/null and b/assets/Figure_2.05_B18602.5e3e06c6.jpg differ diff --git a/assets/Figure_2.06_B18602.7d26d857.jpg b/assets/Figure_2.06_B18602.7d26d857.jpg new file mode 100644 index 000000000..772aad83f Binary files /dev/null and b/assets/Figure_2.06_B18602.7d26d857.jpg differ diff --git a/assets/Figure_2.07_B18602.e597f56b.jpg b/assets/Figure_2.07_B18602.e597f56b.jpg new file mode 100644 index 000000000..dc33d7a6e Binary files /dev/null and b/assets/Figure_2.07_B18602.e597f56b.jpg differ diff --git a/assets/Figure_2.08_B18602.0ad05159.jpg b/assets/Figure_2.08_B18602.0ad05159.jpg new file mode 100644 index 000000000..101368164 Binary files /dev/null and b/assets/Figure_2.08_B18602.0ad05159.jpg differ diff --git a/assets/app.8ddeb0a2.js b/assets/app.e83138af.js similarity index 95% rename from assets/app.8ddeb0a2.js rename to assets/app.e83138af.js index 3911b3ef6..b768b2345 100644 --- a/assets/app.8ddeb0a2.js +++ b/assets/app.e83138af.js @@ -1 +1 @@ -import{s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as d,a8 as f,a9 as m,aa as h,ab as A,ac as g,V as P,d as v,u as y,j as C,y as w,ad as _,ae as b,af as E,ag as R}from"./chunks/framework.477046d0.js";import{t as D}from"./chunks/theme.88e180d0.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=p(D),j=v({name:"VitePressApp",setup(){const{site:e}=y();return C(()=>{w(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),b(),E(),o.setup&&o.setup(),()=>R(o.Layout)}});async function O(){const e=T(),a=S();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",d),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function S(){return h(j)}function T(){let e=s,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&O().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{O as createApp}; +import{s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as d,a8 as f,a9 as m,aa as h,ab as A,ac as g,V as P,d as v,u as y,j as C,y as w,ad as _,ae as b,af as E,ag as R}from"./chunks/framework.477046d0.js";import{t as D}from"./chunks/theme.b4470a0e.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=p(D),j=v({name:"VitePressApp",setup(){const{site:e}=y();return C(()=>{w(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),b(),E(),o.setup&&o.setup(),()=>R(o.Layout)}});async function O(){const e=T(),a=S();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",d),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function S(){return h(j)}function T(){let e=s,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&O().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{O as createApp}; diff --git a/assets/book_ru_Chapter 2_ Software Design Principles and Patterns.md.a02b71d5.js b/assets/book_ru_Chapter 2_ Software Design Principles and Patterns.md.a02b71d5.js new file mode 100644 index 000000000..657ccc048 --- /dev/null +++ b/assets/book_ru_Chapter 2_ Software Design Principles and Patterns.md.a02b71d5.js @@ -0,0 +1,543 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.477046d0.js";const p="/assets/Figure_2.01_B18602.373ad162.jpg",o="/assets/Figure_2.02_B18602.234e28ef.jpg",e="/assets/Figure_2.03_B18602.6231b535.jpg",t="/assets/Figure_2.04_B18602.fa796e98.jpg",c="/assets/Figure_2.05_B18602.5e3e06c6.jpg",r="/assets/Figure_2.06_B18602.7d26d857.jpg",E="/assets/Figure_2.07_B18602.e597f56b.jpg",y="/assets/Figure_2.08_B18602.0ad05159.jpg",b=JSON.parse('{"title":"Принципы и шаблоны проектирования программного обеспечения","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/Chapter 2_ Software Design Principles and Patterns.md","filePath":"book/ru/Chapter 2_ Software Design Principles and Patterns.md"}'),i={name:"book/ru/Chapter 2_ Software Design Principles and Patterns.md"},d=l('

Принципы и шаблоны проектирования программного обеспечения

Разработка программного обеспечения по своей сути является человекоемкой дисциплиной. Это означает, что она требует не только знания техники и технологии, но и понимания проблемы и умения принимать решения для реализации решения на нескольких уровнях абстракции.

Программирование во многом зависит от того, как мыслит разработчик. С годами в каждом контексте и языке появились рекомендации и решения для решения повторяющихся проблем. Знание этих паттернов (шаблонов) поможет вам определить, когда их следует применять, и ускорить разработку. С другой стороны, принципы - это руководящие концепции, которые должны применяться на каждом этапе процесса, и они в большей степени зависят от того, как вы подходите к процессу.

В этой главе мы рассмотрим неполный и не исчерпывающий список принципов и шаблонов, которые часто встречаются при разработке приложений на Vue 3.

Принципы проектирования

Шаблоны проектирования

Понимание этих принципов и шаблонов поможет вам использовать фреймворк более эффективно и чаще всего не позволит вам "изобретать велосипед". Вместе с первой главой эта глава завершает фундаментальную часть данной книги и дает основу для изучения практической части и реализации примеров приложений в остальных частях книги.

Каковы принципы проектирования программного обеспечения?

При разработке программного обеспечения принципы проектирования - это концептуальные рекомендации высокого уровня, которые должны применяться ко всему процессу. Не в каждом проекте будут использоваться одни и те же принципы, и это не обязательные правила, которые должны соблюдаться. Они могут проявляться в проекте, начиная с архитектуры и заканчивая пользовательским интерфейсом (UI) и последним фрагментом кода. На практике некоторые из этих принципов могут также влиять на такие атрибуты программного обеспечения, как сопровождаемость (maintainability) и возможность повторного использования (re-usability).

Неполный список принципов проектирования

Принципы проектирования несколько различаются в зависимости от контекста, области и даже команды, в которой человек работает в данный момент. Поэтому принципы, включенные в данную главу, являются неисчерпывающими.

Separation of concerns (Разделение ответственности)

Это, пожалуй, самый важный принцип в программной инженерии. Разделение ответственности подразумевает, что система должна быть разделена на подсистемы элементов, сгруппированных по их функциям или услугам (ответственности). Например, мы можем рассматривать человеческий организм как систему, состоящую из множества подсистем (дыхательной, кровеносной, пищеварительной и т.д.). Они, в свою очередь, объединены различными органами, которые состоят из тканей, и так далее, вплоть до мельчайшей клетки. Следуя той же идее в программном обеспечении, приложение можно разделить на элементы, сгруппированные по проблемам, начиная с большой архитектуры и заканчивая последней функцией. Без такого разделения сложности на управляемые части создать функциональную систему было бы гораздо сложнее, а то и вовсе невозможно.

В общем случае применение этого принципа начинается с общей картины того, какой должна быть система, рассматривает, что она должна делать для достижения этой цели, а затем разбивает ее на управляемые рабочие части.

В качестве примера приведем грубое графическое представление разделения задач для веб-приложения. Каждый квадрат на этой диаграмме обозначает отдельную зону ответственности, которая, в свою очередь, может быть детализирована на более мелкие функциональные части. Еще лучше, если вы увидите, как этот принцип позволяет выявить интегрирующие части системы.

Рисунок 2.1 - Простой архитектурный вид веб-приложения, демонстрирующий разделение ответственности

Если мы будем углубляться в любую из этих маленьких ячеек внутри соответствующих доменов, мы сможем найти еще больше проблем, которые можно разделить, пока не достигнем неделимого атомарного элемента (компонента или функции, например). Этот принцип имеет много общего с другими принципами, такими как абстракция и единая ответственность, и выигрывает от них. Мы рассмотрим их далее в этой же главе.

Composition over inheritance (Композиция над наследованием)

Принцип композиции над наследованием заимствован непосредственно из объектно-ориентированного программирования (ООП). Он гласит, что объект должен пытаться использовать функциональность других объектов, когда это необходимо, путем ссылки на них или инстанцирования, а не создавать большое и сложное дерево классов наследования для добавления такой функциональности.

В наши дни, JavaScript по своей сути является функциональным языком, хотя и поддерживает множество парадигм, включая черты ООП, поэтому этот принцип также применим. Есть одно предостережение для тех, кто переходит с ООП на JavaScript, - не поддавайтесь искушению рассматривать JavaScript как чистый ООП-язык. Это может привести к ненужным сложностям, вместо того чтобы воспользоваться достоинствами языка.

В Vue 3 не существует расширения или наследования компонентов. Когда нам нужна общая или наследуемая функциональность, у нас есть хороший набор инструментов для замены парадигмы наследования. Как соблюсти этот принцип, используя композитные компоненты, мы увидим позже в главе 4, Композиция пользовательского интерфейса с помощью компонентов.

Single responsibility principle (Принцип единой ответственности)

Этот принцип можно встретить как в ООП, так и в функциональном программировании. Проще говоря, он гласит, что класс, метод, функция или компонент должны иметь дело только с одной ответственностью или функциональностью.

Если вы работали в других дисциплинах и языках, то это естественно. Многоцелевые функции трудно поддерживать и они имеют тенденцию выходить из-под контроля, особенно в таких языках, как JavaScript, который является слабо типизированным и очень динамичным. Эта же концепция напрямую относится и к компонентам Vue 3. Каждый компонент должен выполнять одну конкретную операцию и не пытаться делать слишком много самостоятельно.

На практике, когда компонент выходит за определенные рамки, лучше разделить его на несколько компонентов или вынести поведение во внешние модули. Бывают случаи, когда в итоге получается компонент длиной в несколько тысяч строк, но, по моему опыту, это редко бывает необходимо, и этого можно и нужно избегать. Однако следует предупредить, что излишняя конкретика также может привести к ненужному усложнению.

В качестве примера представим себе экран входа в систему, на котором также отображается опция регистрации. Такой подход встречается сегодня на многих сайтах. Можно включить все функции в один компонент, но это нарушит данный принцип. Лучшей альтернативой будет разделение компонентов как минимум на три компонента для решения этой задачи:

Здесь представлено графическое представление данной конфигурации:

Рисунок 2.2 - Композиция интерфейса входа/регистрации с использованием нескольких компонентов.

Я думаю, что вы быстро поймете преимущества этого принципа. Он облегчает управление, поддержку и адаптацию кода, поскольку веб-приложения имеют свойство очень и очень быстро мутировать и развиваться.

Совет из лучших практик

Наделите компоненты единой ответственностью и функциональностью. По возможности избегайте монолитных компонентов.

Encapsulation (Инкапсуляция)

Инкапсуляция - это представление о том, что данные и методы должны быть обернуты в единое целое и при этом предоставлять четко определенный интерфейс прикладного программирования (API).

Часто это делается в виде классов, модулей или библиотек. JavaScript не является исключением, и настоятельно рекомендуется следовать этому принципу. В Vue 3 эта концепция распространяется не только на компоненты, но и на стили CSS и HTML. Введение однофайловых компонентов - яркий пример того, как фреймворк продвигает этот принцип в действии и насколько он важен для современной разработки.

Лишь в некоторых исключительных ситуациях мы должны рассматривать компоненты (UI) как "черные ящики", которые принимают входящие параметры и предоставляют исходящие данные. Другие компоненты не должны быть знакомы с их внутренним устройством, только с API. По мере создания примеров приложений, описанных в этой книге, вы увидите этот принцип в действии.

KIC - сохраняйте в себе все необходимые параметры

.

KIC - keep it clean

Этот принцип относится главным образом к тому, как вы пишете код. Здесь я должен подчеркнуть, что KIC непосредственно относится к двум категориям, которые сильно влияют на веб-приложения и приложения Vue 3:

Первый пункт включает в себя использование кодовых соглашений, комментариев и отступов для организации кода и логической группировки функций. Например, если у вас есть методы, которые работают с операциями создания, чтения, обновления и удаления (CRUD), то лучше всего разместить их в коде рядом друг с другом, а не разбрасывать по всему исходному файлу.

Многие интегрированные среды разработки (IDE) содержат функции, позволяющие сворачивать или разворачивать внутренний код функций. Это помогает быстро просматривать и находить в коде участки с похожей логикой.

Вторая часть этого принципа связана с обработкой памяти и ссылок. JavaScript имеет очень хороший сборщик мусора, функция которого заключается в отбрасывании неиспользуемых данных для освобождения памяти. Однако бывают случаи, когда алгоритм не может освободить ресурсы из-за того, что ссылка все еще не выполнена. Если вы работали с другими языками, такими как C/C++, то эта проблема может показаться вам знакомой, поскольку вам необходимо вручную резервировать и освобождать память, когда она не используется.

В JavaScript, если вы регистрируете функцию для прослушивания события, лучше всего вручную снять ее с регистрации в соответствующем событии жизненного цикла компонента, когда она больше не нужна. Это позволит избежать утечек и нерационального использования памяти, а также предотвратить некоторые риски безопасности (которые выходят за рамки данной книги).

Мы рассмотрим жизненный цикл компонента в главе 4, Композиция пользовательского интерфейса с помощью компонентов, а пока возьмем следующий пример в качестве хорошего применения этого принципа и сохраним его в качестве лучшей практики. В этом примере мы создадим компонуемый компонент для обнаружения изменения размера окна, поэтому в разделе script setup мы найдем что-то подобное этому:

  1. Регистрируем функцию на событие изменения размера объекта окна в состоянии монтирования.
  2. Снимаем регистрацию события перед размонтированием компонента.

Здесь приведен фрагмент кода:

vue
<script setup>
+   import {onMounted, onBeforeUnmount} from "vue"
+   onMounted(()=>{
+       window.addEventListener("resize", myFunction)
+    })
+   onBeforeUnmount(()=>{
+       window.removeEventListener("resize", myFunction)
+    })
+   function myFunction(){
+          // Делаем что-то с событием здесь
+    }
+</script>
<script setup>
+   import {onMounted, onBeforeUnmount} from "vue"
+   onMounted(()=>{
+       window.addEventListener("resize", myFunction)
+    })
+   onBeforeUnmount(()=>{
+       window.removeEventListener("resize", myFunction)
+    })
+   function myFunction(){
+          // Делаем что-то с событием здесь
+    }
+</script>

Функции onMounted и onBeforeUnmount являются частью фреймворка Vue 3 и вызываются соответствующим событием жизненного цикла компонента. Здесь мы прикрепляем нашу функцию к событию resize, когда компонент монтируется в Document Object Model (DOM), и освобождаем ее непосредственно перед удалением. Важно помнить, что необходимо убирать за собой и keep it clean.

DRY – don’t repeat yourself (не повторяйся)

Этот принцип достаточно известен, почти превратился в клише. К сожалению, его легко забыть. Его авторство принадлежит Эндрю Ханту и Дэвиду Томасу, которые использовали его в книге Прагматичный программист. Чаще всего его понимают как не пиши одно и то же дважды, и это не так уж и далеко от истины, но он выходит за рамки этого понятия.

Он включает в себя понятие избегания избыточности как в процессе, так и в логике приложения. Основная идея заключается в том, что каждый процесс, выполняющий бизнес-логику, должен существовать только в одном месте во всем приложении.

Например, большинство веб-приложений имеют асинхронную связь с сервером через API. В приложении может быть несколько элементов, которые будут использовать или должны использовать эту связь между удаленным компьютером и сервером. Если бы вы собирались написать весь код/логику взаимодействия с сервером в каждом компоненте, то в итоге мы бы получили не только дублирование кода, но и логики приложения. Такая система открыла бы двери для огромного количества негативных побочных эффектов, проблем с безопасностью, плохой работы пользователей и многого другого.

В соответствии с этим принципом более правильным подходом является абстрагирование всего коммуникационного кода, связанного с API сервера, в единый модуль или класс. На практике в JavaScript это можно даже делегировать веб-рабочему в отдельном потоке. Мы рассмотрим эту реализацию позже в главе 8, Многопоточность с Web Workers.

Как правило, если вы видите, что пишете один и тот же код в разных компонентах или классах, то это явная возможность абстрагировать функциональность в отдельный модуль или компонент.

KISS - keep it simple and short (держи это простым и коротким)

Этот принцип не является исключительным для сферы разработки программного обеспечения. Он был введен в обиход военно-морскими силами США еще в 60-х годах (согласно Википедии, https://en.wikipedia.org/wiki/KISS_principle).

Идея основана на здравом смысле: лучше создавать простые, небольшие функциональные части, которые работают вместе, чем пытаться создать большую и сложную программу за один раз. Кроме того, алгоритмы должны быть реализованы наиболее простым и эффективным способом. В веб-разработке этот принцип очень важен.

Современные веб-приложения состоят из сотен работающих частей, распределенных по нескольким компьютерам, серверам и средам. Чем сложнее система или реализация кода, тем труднее ее обслуживать и адаптировать.

Однако есть одно предостережение. Простота не означает чрезмерного упрощения или ненужного разделения. Слишком большое количество мелких деталей может внести в систему ненужную сложность. Применять принцип KISS означает оставаться в той средней точке, где все поддается управлению и легко понимается.

Code for the next (Пиши код для следующего)

Этот принцип заключается в том, что вы должны сделать свой код читаемым и понятным для кого-то еще, кроме вас. Соглашения об именовании, логический поток и межстрочные комментарии являются частью этого принципа. Не только для случая, когда вам придется передать свой код другому, но и когда вы вернетесь через год или два к тому же самому коду.

Меньше всего вам хочется тратить время на размышления о том, что же сделал прошлый неопытный человек с той заумной строчкой спагетти-кода. Умные разработчики пишут код так, как будто собираются учить кого-то другого, просто и элегантно. Особенно если вы используете открытый код или вносите в него свой вклад, этот принцип жизненно важен для групповой работы.

В этом случае стоит упомянуть о принципе бойскаута, который аналогичен, но применяется в группах. Он гласит, что если вы обнаружили трудночитаемый или "спагетти"-код, то рефакторите его, чтобы сделать чистым.

Совет из лучших практик

Содержите свой код в чистоте, используя комментарии и документацию, объясняющие логику, как будто учите кого-то другого. Чаще всего вы сами себя учите.

Принципы проектирования применимы ко многим различным сценариям, некоторые из них выходят за рамки практики разработки программного обеспечения. Важно усваивать их до тех пор, пока они не станут привычными. В целом, применение этих и других принципов, а также шаблонов проектирования накладывает существенный отпечаток на ваше профессиональное развитие.

Что такое шаблон проектирования программного обеспечения?

При разработке программного обеспечения часто бывает так, что определенные процессы и задачи встречаются в нескольких проектах, в том или ином виде или с некоторыми вариациями. Шаблон проектирования - это проверенное решение для подобных задач. Он не предписывает код, а действует как шаблон рассуждений, подход, абстрагированный независимо от реализации, для повторного использования и адаптации к конкретным условиям.

На практике применение шаблона дает большой простор для творчества. Этой теме посвящены целые книги, в которых приводится больше подробностей, чем позволяет объем данной книги. На следующих страницах мы рассмотрим наиболее часто встречающиеся, на мой взгляд, шаблоны, которые следует иметь в виду при работе с приложениями Vue 3.

Несмотря на то, что для целей изучения мы видим их по отдельности, в реальности часто реализация накладывает, смешивает и заключает в себе несколько шаблонов в одном фрагменте кода. Например, вы можете использовать синглтон для выполнения функций декоратора и прокси для упрощения или изменения взаимодействия между сервисами в вашем приложении (на самом деле мы будем делать это довольно часто, и полный код можно увидеть в Глава 8, Многопоточность с Web Workers.

Шаблоны проектирования также можно понимать как лучшие практики в области программной инженерии и разработки. А противоположную ей, плохую практику, часто называют антипаттерном. Антипаттерны - это "решения", которые, даже устраняя проблему в краткосрочной перспективе, создают проблемы и плохие последствия в дальнейшем. Они порождают необходимость обхода проблемы и дестабилизируют всю структуру и реализацию.

Давайте рассмотрим список шаблонов, которые должны стать частью вашего инструментария для проектов на Vue 3.

Краткий справочный список шаблонов

Шаблоны классифицируются в зависимости от типа функции или проблемы, которую они решают. Существует множество шаблонов в зависимости от контекста, языка и архитектуры системы. Вот неполный список шаблонов, которые мы будем использовать в этой книге и которые, по моему опыту, чаще всего встречаются в приложениях на Vue:

Порождающие шаблоны

Они касаются подхода к созданию классов, объектов и структур данных:

Поведенческие шаблоны

Они касаются взаимодействия между объектами, компонентами и другими элементами приложения:

Структурные шаблоны

Они предоставляют шаблоны, которые влияют на дизайн вашего приложения и взаимоотношения между компонентами:

Асинхронные шаблоны

Они работают с потоком данных и процессов с асинхронными запросами и событиями в однопоточных приложениях (широко используются в веб-приложениях):

Ни в коем случае этот список шаблонов не является полным. Существует гораздо больше шаблонов и классификаций, и этому вопросу посвящена целая библиотека. Стоит отметить, что описание и применение некоторых из них может отличаться в разных литературах, а также существует некоторое дублирование в зависимости от контекста и реализации.

После такого знакомства с шаблонами проектирования давайте рассмотрим их подробнее на примерах.

Шаблон Singleton

Это очень распространенный шаблон в JavaScript и, возможно, один из самых важных, если не самый важный. Основная концепция определяет, что экземпляр одного объекта должен существовать только один раз во всем приложении, и все ссылки и вызовы функций осуществляются через этот объект. Синглтон может выступать в качестве шлюза для доступа к ресурсам, библиотекам и данным.

Когда его использовать

Вот краткое эмпирическое правило, позволяющее понять, когда следует применять этот шаблон:

Реализация

Существует множество способов применения этого шаблона в JavaScript. В некоторых случаях реализация из других языков переносится в JavaScript, часто следуя примерам Java с использованием метода getInstance() для получения синглтона. Однако существуют более эффективные способы реализации этого шаблона в JavaScript. Рассмотрим их далее.

Метод 1

Самый простой способ - через модуль, экспортирующий обычный объектный литерал или JavaScript Object Notation (JSON), который является статическим объектом:

js
const my_singleton = {
+     // Код реализации здесь...
+}
+export default my_singleton;
const my_singleton = {
+     // Код реализации здесь...
+}
+export default my_singleton;

После этого вы можете импортировать этот модуль в другие модули и всегда иметь один и тот же объект. Это работает потому, что бандлеры и браузеры достаточно умны, чтобы избежать повторения импорта, поэтому, если этот объект был импортирован в первый раз, он будет игнорировать следующие запросы. Если не использовать бандлер, то реализация JavaScript в ES6 также определяет, что модули являются синглтонами.

Метод 2

Этот метод создает класс, а затем, при первом инстанцировании, сохраняет ссылку на него для последующих обращений. Для того чтобы это работало, мы используем переменную (традиционно называемую _instance) из класса и сохраняем ссылку на экземпляр в конструкторе. В последующих вызовах мы проверяем, существует ли значение _instance, и если да, то возвращаем его. Вот код:

js
class myClass{
+    constructor(){
+         if(myClass._instance) {
+             return myClass._instance;
+         } else {
+             myClass._instance=this;
+         }
+         return this;
+     }
+}
+export default new myClass()
class myClass{
+    constructor(){
+         if(myClass._instance) {
+             return myClass._instance;
+         } else {
+             myClass._instance=this;
+         }
+         return this;
+     }
+}
+export default new myClass()

Второй метод может быть более привычным для разработчиков других языков. Обратите внимание, что мы также экспортируем новый экземпляр класса, а не непосредственно сам класс. Таким образом, инвокеру не придется каждый раз вспоминать об инстанцировании класса, а код будет таким же, как и в методе 1. Этот вариант использования необходимо согласовать с вашей командой, чтобы избежать различных реализаций.

Затем инвокер может вызывать методы каждого из них напрямую (при условии, что синглтон имеет функцию/метод с названием myFunction()):

js
import my_method1_singleton from "./singleton-json";
+import my_method2_singleton from "./singleton-class";
+console.log("В обоих случаях инстанцирования нет!")
+my_method1_singleton.myFunction()
+my_method2_singleton.myFunction()
import my_method1_singleton from "./singleton-json";
+import my_method2_singleton from "./singleton-class";
+console.log("В обоих случаях инстанцирования нет!")
+my_method1_singleton.myFunction()
+my_method2_singleton.myFunction()

Шаблон синглтон чрезвычайно полезен, хотя он редко существует в изоляции. Часто мы используем синглтоны, чтобы обернуть реализацию других шаблонов и обеспечить единую точку доступа. В наших примерах мы будем использовать этот шаблон довольно часто.

Шаблон Dependency injection (инъекция зависимостей)

Этот шаблон просто утверждает, что зависимости для класса или функции предоставляются в качестве входных данных, например, в виде параметров, свойств или других типов реализаций. Это простое утверждение открывает очень широкий спектр возможностей. Возьмем, к примеру, класс, работающий с IndexedDB API браузера через класс абстракции. Подробнее об API IndexedDB мы узнаем в главе 7, Управление потоками данных, а пока остановимся на зависимой части.

Предположим, что файл dbManager.js экспортирует объект, который обрабатывает операции с базой данных, а объект projects обрабатывает CRUD-операции для таблицы (или коллекции) projects. Без использования инъекции зависимостей получится что-то подобное этому:

./chapter 2/dependency-injection-1.js

js
import dbManager from "dbManager"
+const projects={
+    getAllProjects(){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;
import dbManager from "dbManager"
+const projects={
+    getAllProjects(){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;

Предыдущий код демонстрирует "нормальный" подход, когда мы импортируем зависимости в начале файла и затем используем их в коде. Теперь давайте изменим этот же код, чтобы использовать инъекцию зависимостей:

./chapter 2/dependency-injection-2.js

js
const projects={
+    getAllProjects(dbManager){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;
const projects={
+    getAllProjects(dbManager){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;

Как видите, основное отличие заключается в том, что dbManager теперь передается в качестве параметра функции. Это то, что называется инъекцией. Это открывает множество способов управления зависимостями и в то же время отодвигает жесткое кодирование зависимостей вверх по дереву реализации. Это делает данный класс очень удобным для повторного использования, по крайней мере, до тех пор, пока зависимость соответствует ожидаемому API.

Приведенный пример не является единственным способом инъекции зависимости. Можно, например, присвоить ее внутреннему свойству объекта. Например, если бы файл projects.js был реализован с использованием подхода, основанного на свойствах, то он выглядел бы следующим образом:

./chapter 2/dependency-injection-3.js

js
const projects = {
+    dbManager,
+    getAllProjects(){
+        return this.dbManager.getAll("projects")
+    }
+}
+export default projects;
const projects = {
+    dbManager,
+    getAllProjects(){
+        return this.dbManager.getAll("projects")
+    }
+}
+export default projects;

В этом случае инвокер объекта (кстати, синглтона) должен знать об этом свойстве и присвоить его перед вызовом любой из своих функций. Вот пример того, как это будет выглядеть:

./chapter 2/dependency-injection-4.js

js
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.dbManager = dbManager;
+projects.getAllProjects();
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.dbManager = dbManager;
+projects.getAllProjects();

Но такой подход не рекомендуется. Вы можете видеть, что он нарушает принцип инкапсуляции, поскольку мы напрямую присваиваем свойство объекту. Кроме того, это не похоже на чистый код, даже если это корректный код.

Передача зависимостей по одной функции за раз также не рекомендуется. Итак, какой же подход лучше? Это зависит от реализации:

Этот последний подход также рекомендуется для передачи зависимости после инстанцирования объекта, когда зависимость не готова на момент реализации.

Приведем пример кода для первого пункта, упомянутого в предыдущем списке:

./chapter 2/dependency-injection-5.js

js
class Projects {
+    constructor(dbManager = null){
+         if (!dbManager) {
+             throw "Dependency missing"
+         } else {
+             this.dbManager = dbManager;
+         }
+     }
+}
class Projects {
+    constructor(dbManager = null){
+         if (!dbManager) {
+             throw "Dependency missing"
+         } else {
+             this.dbManager = dbManager;
+         }
+     }
+}

В конструкторе мы объявляем ожидаемый параметр со значением по умолчанию. Если зависимость не предоставлена, мы выбрасываем ошибку. В противном случае мы присваиваем ее внутреннему приватному атрибуту для использования экземпляром. В данном случае инвокер должен выглядеть следующим образом:

js
// Projects - это класс
+import Projects from "projects.js"
+import dbManager from "dbManager.js"
+try {
+    const projects = new Projects(dbManager);
+} catch {
+     // Обработчик ошибок здесь
+}
// Projects - это класс
+import Projects from "projects.js"
+import dbManager from "dbManager.js"
+try {
+    const projects = new Projects(dbManager);
+} catch {
+     // Обработчик ошибок здесь
+}

В альтернативной реализации мы могли бы иметь функцию, которая, по сути, делает то же самое, получая зависимость и присваивая ее приватному атрибуту:

js
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.setDBManager(dbManager);
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.setDBManager(dbManager);

Этот подход лучше, чем прямое присвоение внутреннего атрибута, но все равно нужно не забыть выполнить присвоение перед использованием любых методов объекта.

::: Совет из лучших практик Какой бы подход вы ни использовали для инъекции зависимостей, он должен оставаться неизменным во всей вашей кодовой базе. :::

Вы, наверное, заметили, что мы в основном сосредоточились на объектах. Как вы уже догадались, передача зависимости в функцию - это то же самое, что и передача другого параметра, поэтому она не заслуживает особого внимания.

В данном примере ответственность за реализацию зависимости просто перенесена на другой класс в иерархии. Но что если реализовать шаблон singleton для обработки всех или большинства зависимостей в нашем приложении? Таким образом, мы могли бы просто делегировать загрузку зависимостей одному классу или объекту в определенный момент жизненного цикла нашего приложения. Но как это реализовать? Нам понадобится следующее:

Применим это на практике и создадим очень наивную реализацию такого синглтона. Пожалуйста, помните, что это академическое упражнение, поэтому мы не рассматриваем проверку ошибок, снятие с регистрации, или другие соображения:

./chapter 2/dependency-injection-6.js

js
const dependencyService = {                         //1
+    dependencies: {},                               //2
+    provide(name, dependency){                      //3
+        this.dependencies[name] = dependency        //4
+        return this;              ;                 //5
+    }
+    inject(name){                                   //6
+        return this.dependencies[name] ?? null;     //7
+    }
+}
+export default dependencyService;
const dependencyService = {                         //1
+    dependencies: {},                               //2
+    provide(name, dependency){                      //3
+        this.dependencies[name] = dependency        //4
+        return this;              ;                 //5
+    }
+    inject(name){                                   //6
+        return this.dependencies[name] ?? null;     //7
+    }
+}
+export default dependencyService;

После этой минимальной реализации рассмотрим каждую строку по строковому комментарию:

  1. Мы создаем простой объектный литерал JavaScript как синглтон.
  2. Объявляем пустой объект для использования в качестве словаря для хранения зависимостей по именам.
  3. Функция provide позволяет нам зарегистрировать зависимость по имени.
  4. Здесь мы просто используем имя в качестве имени поля и присваиваем зависимость, переданную в качестве аргумента (заметьте, мы не проверяем уже существующие имена и т.д.).
  5. Здесь мы возвращаем исходный объект, в основном для удобства, чтобы можно было выстроить цепочку вызовов.
  6. Функция inject принимает имя, зарегистрированное в provide функции.
  7. Мы возвращаем зависимость или null , если она не найдена.

Получив синглтон, мы можем использовать его во всем приложении для распределения зависимостей по мере необходимости. Для этого нам нужен родительский объект, чтобы импортировать их и заполнить сервис. Вот пример того, как это может выглядеть:

./chapter 2/dependency-injection-7.js

js
import dependencyService from "./dependency-injection-6"
+import myDependency1 from "myFile1"
+import myDependency2 from "myFile2"
+import dbManager from "dbManager".
+dependencyService
+     .provide("dependency1", myDependency1)
+     .provide("dependency2", myDependency2)
+     .provide("dbManager", dbManager)
import dependencyService from "./dependency-injection-6"
+import myDependency1 from "myFile1"
+import myDependency2 from "myFile2"
+import dbManager from "dbManager".
+dependencyService
+     .provide("dependency1", myDependency1)
+     .provide("dependency2", myDependency2)
+     .provide("dbManager", dbManager)

Как видно, модуль имеет жестко закодированные зависимости, и его работа заключается в загрузке их в объект dependencyService. Затем зависимой функции или объекту достаточно импортировать сервис и получить нужную зависимость по имени регистрации следующим образом:

js
import dependencyService from "./dependency-injection-6"
+const dbManager = dependencyService.inject("dbManager")
import dependencyService from "./dependency-injection-6"
+const dbManager = dependencyService.inject("dbManager")

Этот подход действительно создает тесную связь между компонентами, но он приведен здесь в качестве справочного материала. Его преимущество заключается в том, что мы можем контролировать все зависимости в одном месте, так что преимущества в обслуживании могут быть значительными.

Выбор имен для методов объекта dependencyService также не случаен: они совпадают с теми, что используются в Vue 3 внутри иерархии компонента. Это очень удобно для реализации некоторых шаблонов проектирования пользовательского интерфейса. Более подробно мы рассмотрим это в главе 4, Композиция пользовательского интерфейса с компонентами и Главе 7, Управление потоком данных.

Как видите, этот шаблон очень важен и реализован в Vue 3 с помощью функций provide/inject. Это отличное дополнение к нашему набору инструментов, но это еще не все. Давайте перейдем к следующему.

Шаблон factory (фабрика)

Шаблон фабрики предоставляет нам способ создания объектов без создания прямых зависимостей. Он работает через функцию, которая, основываясь на входных данных, возвращает инстанцированный объект. Использование такой реализации будет осуществляться через общий или стандартный интерфейс.

Например, рассмотрим два класса: Circle и Square. Оба реализуют один и тот же метод draw(), который рисует фигуру на холсте. Тогда функция фабрики будет работать примерно так:

js
function createShape(type){
+    switch(type) {
+        case "circle": return new Circle();
+        case "square": return new Square();
+    }
+}
+let
+    shape1 = createShape("circle"),
+    shape2 = createShape("квадрат");
+shape1.draw();
+shape2.draw();
function createShape(type){
+    switch(type) {
+        case "circle": return new Circle();
+        case "square": return new Square();
+    }
+}
+let
+    shape1 = createShape("circle"),
+    shape2 = createShape("квадрат");
+shape1.draw();
+shape2.draw();

Этот метод довольно популярен, особенно в сочетании с другими шаблонами, что мы неоднократно увидим в этой книге.

Шаблон Observer (наблюдатель)

Шаблон "наблюдатель" очень полезен и является одной из основ реактивного фреймворка. Он определяет отношения между объектами, в которых один из них наблюдает (субъект) за изменениями или событиями, а другой (другие) уведомляется об этих изменениях (наблюдатели). Наблюдатели также называются слушателями. Вот графическое представление:

Рисунок 2.3 - Субъект выдает событие и оповещает наблюдателей.

Как видно из рисунка, субъект выдает событие для оповещения наблюдателей. Субъект сам определяет, какие события и параметры он будет опубликовывать. Тем временем наблюдатели подписываются на каждое событие, регистрируя функцию у издателя. Именно поэтому данный шаблон часто называют шаблоном pub/sub, и он может иметь несколько вариаций.

При рассмотрении реализации этого шаблона важно обратить внимание на кардинальность публикации: 1 событие на 0..N наблюдателей (функций). Это означает, что субъект должен реализовать, помимо своего основного назначения, функциональность по публикации событий и отслеживанию подписчиков. Поскольку это нарушает один или два принципа проектирования (разделение забот, единая ответственность и т.д.), принято выносить эту функциональность в средний объект. В этом случае предыдущий проект изменяется, добавляя средний слой:

Рисунок 2.4 - Реализация наблюдателя со средним объектом диспетчера.

Этот средний объект, иногда называемый "диспетчером событий", включает в себя базовую функциональность по регистрации наблюдателей, получению событий от субъекта и их отправке наблюдателям. Он также выполняет некоторые действия по очистке, когда наблюдатель перестает наблюдать. Давайте рассмотрим эти понятия на примере простой и наивной реализации диспетчера событий на обычном JavaScript:

./chapter 2/Observer-1.js

js
class ObserverPattern{
+constructor() {
+    this.events = {}                                        //1
+}
+on(event_name, fn = () => {}) {                             //2
+    if(!this.events[event_name]) {
+        this.events[event_name] = []
+    }
+    this.events[event_name].push(fn)                       //3
+}
+emit(event_name, data){                                     //4
+    if(!this.events[event_name]){
+        return
+    }
+    for(let i=0, l=this.events[event_name].length; i<l; i++) {
+        this.events[event_name][i](data)
+    }
+}
+off(event_name, fn){                                        //5
+    let i=this.events[event_name].indexOf(fn);
+    if(i>-1) {
+        this.events[event_name].splice(i, 1);
+    }
+}
+}
class ObserverPattern{
+constructor() {
+    this.events = {}                                        //1
+}
+on(event_name, fn = () => {}) {                             //2
+    if(!this.events[event_name]) {
+        this.events[event_name] = []
+    }
+    this.events[event_name].push(fn)                       //3
+}
+emit(event_name, data){                                     //4
+    if(!this.events[event_name]){
+        return
+    }
+    for(let i=0, l=this.events[event_name].length; i<l; i++) {
+        this.events[event_name][i](data)
+    }
+}
+off(event_name, fn){                                        //5
+    let i=this.events[event_name].indexOf(fn);
+    if(i>-1) {
+        this.events[event_name].splice(i, 1);
+    }
+}
+}

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

  1. В конструкторе мы объявляем объект для использования в качестве внутреннего словаря для событий.
  2. Метод on позволяет наблюдателям зарегистрировать свои функции. В этой строке, если событие не инициализировано, мы создаем пустой массив.
  3. В этой строке мы просто кладем функцию в массив (как я уже говорил, это наивная реализация, так как мы не проверяем, например, дубликаты).
  4. Метод emit позволяет субъекту опубликовать событие по его имени и передать ему некоторые данные. Здесь мы пробегаемся по массиву и выполняем каждую функцию, передавая в качестве параметра полученные данные.
  5. Метод off необходим для того, чтобы снять с регистрации функцию, если она не используется (см. принцип keep it clean, приведенный ранее в этой главе).

Для того чтобы данная реализация работала, каждый наблюдатель и субъект должны ссылаться на одну и ту же реализацию ObserverClass. Самый простой способ обеспечить это - реализовать его через шаблон синглтон. После импорта каждый наблюдатель регистрируется в диспетчере с помощью следующей строки:

js
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.on("event_name", myFunction)
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.on("event_name", myFunction)

После этого субъект испускает событие и передает данные следующими строками:

js
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.emit("event_name", data)
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.emit("event_name", data)

И наконец, когда наблюдателю больше не нужно следить за объектом, необходимо очистить ссылку с помощью метода off:

js
dispatcher.off("имя_события", myFunction)
dispatcher.off("имя_события", myFunction)

Существует большое количество крайних случаев и элементов управления, которые мы здесь не рассмотрели, и вместо того, чтобы изобретать велосипед, я предлагаю использовать готовые решения для этих случаев. В нашей книге мы будем использовать одно из них под названием mitt (https://www.npmjs.com/package/mitt). Оно имеет те же методы, что и в нашем примере. Как устанавливать упакованные зависимости, мы рассмотрим в главе 3, Установка рабочего проекта.

Шаблон Command (комманда)

Этот шаблон очень полезен и прост для понимания и реализации. Вместо того чтобы сразу выполнять функцию, основная концепция заключается в создании объекта или структуры с информацией, необходимой для выполнения. Затем этот пакет данных (команда) делегируется другому объекту, который будет выполнять исполнение в соответствии с некоторой логикой его обработки. Например, команды могут быть сериализованы и поставлены в очередь, запланированы, отменены, сгруппированы и преобразованы. Вот графическое представление этого шаблона с необходимыми частями:

Рисунок 2.5 - Графическая реализация командного шаблона

На схеме показано, как клиенты передают свои команды инвокеру. Обычно инвокер реализует некую очередь или массив задач для обработки команд, а затем направляет их выполнение соответствующему приемнику. Если есть какие-либо данные для возврата, он также возвращает их соответствующему клиенту.

Также часто инвокер присоединяет к команде дополнительные данные для отслеживания клиентов и получателей, особенно в случае асинхронного выполнения. Это также обеспечивает единую точку "входа" в приемники и отделяет от них "клиентов".

Снова поработаем над наивной реализацией класса Invoker:

./chapter 2/Command-1.js

js
class CommandInvoker{
+    addCommand(command_data) {                              //1
+          // ... реализация очереди здесь
+    }
+    runCommand(command_data) {                              //2
+         switch(command_data.action) {                      //3
+             case "eat":
+                    // ... вызываем получателя здесь
+                    break;
+             case "code":
+                    // ... вызываем получателя здесь
+                    break;
+             case "repeat":
+                    // ... вызываем получателя здесь
+                    break;
+          }
+     }
+}
class CommandInvoker{
+    addCommand(command_data) {                              //1
+          // ... реализация очереди здесь
+    }
+    runCommand(command_data) {                              //2
+         switch(command_data.action) {                      //3
+             case "eat":
+                    // ... вызываем получателя здесь
+                    break;
+             case "code":
+                    // ... вызываем получателя здесь
+                    break;
+             case "repeat":
+                    // ... вызываем получателя здесь
+                    break;
+          }
+     }
+}

В предыдущем коде мы построчно реализовали пример того, каким должен быть инвокер:

  1. В Invoker раскрывается метод для добавления команд в объект. Это необходимо только в том случае, если команды будут каким-то образом ставиться в очередь, сериализовываться или обрабатываться в соответствии с некоторой логикой.
  2. Эта строка выполняет команду в соответствии с полем action, содержащимся в параметре command_data.
  3. На основании поля действие invoker направляет выполнение в соответствующий приемник.

Реализовать логику маршрутизации выполнения можно разными способами. Важно отметить, что данный шаблон может быть реализован в более широком масштабе в зависимости от контекста. Например, инвокер может находиться даже не в клиентском веб-приложении, а на сервере или на другой машине. Реализацию этого шаблона мы увидим в главе 8, Многопоточность с Web Workers, где мы используем этот шаблон для обработки задач между различными потоками и разгрузки главного потока (в котором работает Vue 3).

Шаблон Proxy

Определение этого шаблона вытекает непосредственно из его названия, поскольку слово "прокси" означает что-то или кого-то, кто действует от имени другого, как если бы это было одно и то же. Довольно многословно, но это поможет вам запомнить его.

Давайте рассмотрим пример, чтобы прояснить, как это работает. Нам понадобятся как минимум три сущности (компонента, объекта и т.д.):

Взаимосвязь между этими объектами можно представить графически следующим образом:

Рисунок 2.6 - Прокси-объект раскрывает тот же API, что и целевой.

Ключевым фактором данного шаблона является то, что прокси ведет себя и предоставляет тот же API, что и целевой объект, причем таким образом, что клиент не знает или не должен знать, что он имеет дело с прокси, а не с целевым объектом напрямую. Итак, зачем нам это нужно? Есть много веских причин, например, следующие:

Есть и другие причины, с которыми вы можете столкнуться, но я надеюсь, что теперь вы видите, как это может быть полезно. Будучи шаблоном, этот шаблон может быть реализован на различных уровнях, от простого объектного прокси до полноценного приложения или сервера. Он довольно часто используется при частичном обновлении системы или приложения.

На более низком уровне JavaScript даже содержит встроенный конструктор для проксирования объектов, который Vue 3 использует для создания реактивности.

В главе 1, The Vue 3 Framework, мы рассмотрели варианты реактивности с помощью ref(), но в новой версии Vue также появилась другая альтернатива для сложных структур, называемая reactive(). В первом случае используются методы pub/sub(шаблон наблюдателя!), а во втором - нативные обработчики прокси (этот шаблон!). Рассмотрим на примере наивной частичной реализации, как может работать эта нативная реализация.

В этом простом примере мы заставим объект с реактивными свойствами автоматически преобразовывать градусы Цельсия в градусы Фаренгейта и обратно с помощью Proxy объекта:

./chapter 2/proxy-1.js

js
let temperature = { celsius:0, fahrenheit: 32 },                    //1
+    handler = {                                                     //2
+        set(target, key, value){                                    //3
+            target[key] = value;                                 //4
+            switch(key) {
+                case "celsius":
+                    target.fahrenheit = calculateFahrenheit(value); //5
+                    break;
+                case "fahrenheit":
+                    target.celsius = calculateCelsius(value);.
+            }
+        }
+        get(target, key) {
+            return target[key];                                     //6
+        }
+    }
+    degrees = new Proxy(temperature, handler)                       //7
+
+// Вспомогательные функции
+function calculateCelsius(fahrenheit){
+     return (fahrenheit - 32) / 1.8
+}
+function calculateFahrenheit(celsius){
+     return (celsius * 1.8) + 32
+}
+degrees.celsius = 25                                                //8
+console.log(degrees)
+// Выводится в консоль:
+// {celsius:25, fahrenheit:77}                                      //9
let temperature = { celsius:0, fahrenheit: 32 },                    //1
+    handler = {                                                     //2
+        set(target, key, value){                                    //3
+            target[key] = value;                                 //4
+            switch(key) {
+                case "celsius":
+                    target.fahrenheit = calculateFahrenheit(value); //5
+                    break;
+                case "fahrenheit":
+                    target.celsius = calculateCelsius(value);.
+            }
+        }
+        get(target, key) {
+            return target[key];                                     //6
+        }
+    }
+    degrees = new Proxy(temperature, handler)                       //7
+
+// Вспомогательные функции
+function calculateCelsius(fahrenheit){
+     return (fahrenheit - 32) / 1.8
+}
+function calculateFahrenheit(celsius){
+     return (celsius * 1.8) + 32
+}
+degrees.celsius = 25                                                //8
+console.log(degrees)
+// Выводится в консоль:
+// {celsius:25, fahrenheit:77}                                      //9

Давайте рассмотрим код построчно, чтобы увидеть, как это работает:

  1. В этой строке мы объявляем объект temperature, который будет нашей целью для проксирования. Мы инициализируем два его свойства одинаковым преобразованным значением.
  2. Объявляем объект handler, который будет нашим прокси для объекта temperature.
  3. Функция set в прокси-обработчике получает три аргумента: целевой объект, ключ, на который ссылаются, и значение, которое пытаются присвоить. Обратите внимание, что я говорю "попытка", поскольку операция была перехвачена прокси-сервером.
  4. В этой строке мы выполняем присваивание, как и предполагалось, свойству объекта. Здесь мы могли бы выполнить другие преобразования или логику, например, проверку или вызвать событие (снова шаблон Observer!).
  5. Обратите внимание, как мы используем переключатель для фильтрации интересующих нас имен свойств. Когда ключом является celsius, мы вычисляем и присваиваем значение в градусах Фаренгейта. Обратное происходит, когда мы получаем задание для градусов Фаренгейта. Вот здесь-то и проявляется реактивность.
  6. Для функции get, по крайней мере в этом примере, мы просто возвращаем запрошенное значение. В том виде, в котором это реализовано, это было бы то же самое, как если бы мы пропустили функцию getter. Однако именно здесь в качестве примера мы можем оперировать и преобразовывать возвращаемое значение, поскольку эта операция также перехватывается.
  7. И наконец, в строке 7 мы объявляем объект degrees в качестве прокси для temperature с обработчиком.
  8. В этой строке мы проверяем реактивность, присваивая члену объекта degrees значение в Celsius , как это обычно делается для любого другого объекта.
  9. Когда мы выводим объект degrees на консоль, мы замечаем, что свойство fahrenheit автоматически обновилось.

Это довольно ограниченный и простой пример того, как работает и работает конструктор Proxy(). Vue 3 имеет более сложный подход к реактивности и отслеживанию зависимостей, используя шаблоны proxy и observer. Тем не менее, это дает нам хорошее представление о том, какой подход происходит за кулисами, когда мы видим обновление HTML в реальном времени на наших глазах.

Концепция проксирования между клиентом и объектом связана со следующими двумя шаблонами: декоратор и фасад, поскольку они также являются своего рода реализацией прокси. Отличительной особенностью является то, что прокси сохраняет тот же API, что и исходный целевой объект.

Шаблон Decorator (декоратор)

На первый взгляд этот шаблон может показаться очень похожим на шаблон прокси, и это действительно так, однако он добавляет несколько отличительных особенностей, которые выделяют его из общего ряда.

В нем есть те же подвижные части, что и в прокси, то есть клиент, цель и декоратор между ними, который реализует тот же интерфейс, что и цель (да, точно так же, как и в прокси). Однако если в шаблоне Proxy перехваченные вызовы API в основном работают с данными и внутренним обслуживанием, то декоратор расширяет функциональность исходного объекта, делая его более функциональным. Это и есть фактор, который их разделяет.

В примере с прокси можно заметить, что дополнительной функциональностью стала внутренняя реактивность, позволяющая синхронизировать градусы в каждой шкале. Когда вы изменяете одну из них, она внутренне и автоматически обновляет другую. В шаблоне декоратора прокси-объект выполняет дополнительные операции до, во время или после выполнения вызова API к целевому объекту. Как и в шаблоне proxy, все это прозрачно для клиентского объекта.

Например, опираясь на предыдущий код, представим, что теперь мы хотим регистрировать каждый вызов API определенного объекта, сохраняя при этом его функциональность. Графически это будет выглядеть следующим образом:

Рисунок 2.7 - Пример декоратора, дополняющего цель функцией протоколирования.

Здесь то, что сначала было простым прокси, теперь, в результате выполнения скромного вызова логирования, превратилось в декоратор. В коде нам достаточно добавить эту строку перед концом метода set() (при условии, что существует также функция с именем getTimeStamp()):

js
console.log(getTimeStamp());
console.log(getTimeStamp());

Конечно, это простой пример, просто чтобы пояснить суть. В реальном мире декораторы очень полезны для добавления функциональности в приложение без необходимости переписывать логику или значительные части кода. Кроме того, декораторы могут быть штабелируемыми (stackable) или цепляемыми (chainable), что означает, что при необходимости можно создавать "декораторы для декораторов", каждый из которых будет представлять собой один шаг добавления функциональности, сохраняющий тот же API целевого объекта.

И вот так мы начинаем входить в границы шаблона middleware, но в этой книге мы его рассматривать не будем. В любом случае, идея этого шаблона заключается в создании слоев промежуточных функций с определенным API, каждая из которых выполняет одно действие, но с той разницей, что на любом шаге можно принять решение о прерывании операции, и тогда целевой объект может быть вызван, а может и нет. Но это уже другая история... Вернемся к декораторам.

Ранее в этой книге мы уже упоминали, что компоненты Vue 3 не имеют наследования, как обычные классы JavaScript, реализуемые путем расширения друг от друга. Вместо этого мы можем использовать шаблон декораторов в компонентах для добавления функциональности или изменения внешнего вида. Сейчас рассмотрим краткий пример, поскольку более подробно компоненты и проектирование пользовательского интерфейса будут рассмотрены в главе 4, Композиция пользовательского интерфейса с компонентами.

Рассмотрим простейший компонент, отображающий скромный тег h1 с заголовком, который получает на вход следующие данные:

./chapter 2/decorator-1.vue

vue
<script setup>
+    const $props = defineProps(['label'])           //1
+</script>
+<template>
+    <h1>{{$props.label}}</h1>                       //2
+</template>
+<style scoped></style>
<script setup>
+    const $props = defineProps(['label'])           //1
+</script>
+<template>
+    <h1>{{$props.label}}</h1>                       //2
+</template>
+<style scoped></style>

В этом простом компоненте в строке //1 мы объявляем один входной элемент с именем label. Не стоит пока беспокоиться о синтаксисе, поскольку мы подробно рассмотрим это в главе 4, Композиция пользовательского интерфейса с компонентами. В строке //2 мы интерполируем значение непосредственно внутри тегов h1, как и ожидалось.

Таким образом, чтобы создать декоратор для этого компонента, нам необходимо применить следующие простые правила:

В связи с этим мы можем создать компонент-декоратор, который перехватывает атрибут label, немного изменяет его, а также модифицирует визуальный вид целевого компонента:

./chapter 2/decorator-2.vue

vue
<script setup>
+    import HeaderH1 from "./decorator-1.vue"
+    const $props = defineProps(['label'])                //1
+</script>
+<template>
+    <div style="color: purple !important;">              //2
+         <HeaderH1 :title="$props.label+'!!!'">          //3
+         </HeaderH1>
+    </div>
+</template>
<script setup>
+    import HeaderH1 from "./decorator-1.vue"
+    const $props = defineProps(['label'])                //1
+</script>
+<template>
+    <div style="color: purple !important;">              //2
+         <HeaderH1 :title="$props.label+'!!!'">          //3
+         </HeaderH1>
+    </div>
+</template>

В этом коде в строке //1 видно, что мы сохраняем тот же интерфейс, что и у целевого компонента (который мы импортировали в предыдущей строке), затем в строке //2 мы изменяем (дополняем) атрибут color , а в строке //3 мы также изменяем данные, передаваемые целевому компоненту, добавляя три восклицательных знака. Выполнив эти простые задачи, мы сохранили условия для построения шаблона декоратора, экстраполированного на компоненты Vue 3. Совсем неплохо.

Декораторы очень полезны, но есть еще один прокси-подобный шаблон, который также очень распространен и удобен: шаблон фасада.

Шаблон Façade (фасад)

К настоящему времени вы, возможно, уже видели прогрессивный шаблон в этих, ну, шаблонах. Мы начали с прокси, действующего от имени другого объекта или сущности, дополнили его декораторами, сохранив при этом тот же API, и вот теперь настал черед шаблона façade.

Его задача, помимо функций прокси и декоратора, состоит в том, чтобы упростить API и скрыть за ним большую сложность. Итак, фасад располагается между клиентом и объектом, но теперь объект сложен - это система или даже несколько подсистем. Этот шаблон также используется для изменения API объекта или для ограничения его воздействия на клиента. Взаимодействие можно представить следующим образом:

Рисунок 2.8 - Фасадный объект, упрощающий взаимодействие со сложным API или системой.

Как видите, основное назначение фасада - предложить более простой подход к сложному взаимодействию или API. Мы неоднократно будем использовать этот шаблон в наших примерах для упрощения нативных реализаций в браузере с помощью более удобных для разработчика подходов. Мы будем использовать библиотеки для инкапсуляции использования IndexedDB и создадим собственное упрощенное взаимодействие с веб-рабочими в главе 8, Многопоточность с Web Workers.

Необходимо отметить, что вы уже видели этот шаблон в действии, поскольку он является одной из основополагающих концепций современных технологий. Скрытие сложности за простым интерфейсом (API) встречается повсеместно и является неотъемлемой частью веб-разработки. В конце концов, весь Интернет чрезвычайно сложен, в нем тысячи движущихся частей, а технология, с помощью которой создаются веб-страницы, близка к волшебству. Без этого шаблона мы бы до сих пор программировали с помощью нулей и единиц.

На практике вы будете добавлять уровни упрощения в свои собственные приложения, чтобы снизить сложность. Одним из способов сделать это является использование сторонних библиотек, предоставляющих упрощенный интерфейс. В следующих главах мы будем использовать некоторые из них, например, такие:

В целом, для большинства нативных реализаций веб-технологий существуют библиотеки фасадов, которые хорошо протестированы. Разработчики очень хорошо умеют упрощать их и делиться кодом с другими, благодаря движению open source. Тем не менее, используя чужие модули, убедитесь, что они "безопасны". Не изобретайте велосипед и не повторяйтесь Но теперь пора перейти к следующему шаблону в нашем списке.

Шаблон Callback (обратный вызов)

Шаблон обратного вызова прост для понимания. Он применяется в тех случаях, когда необходимо выполнить операцию после завершения синхронной или асинхронной операции. Для этого в вызов функции в качестве одного из параметров включается функция, которая должна быть выполнена по завершении операций. При этом необходимо различать следующие два типа потока кода:

Именно для асинхронных случаев особенно полезен шаблон callback. Вспомним, например, сетевой вызов. После вызова мы не знаем, сколько времени потребуется для получения ответа от сервера и будет ли он успешным, неудачным или приведет к ошибке. Если бы у нас не было асинхронных операций, наше приложение было бы заморожено, ожидая, пока произойдет разрешение. Это было бы не очень удобно для пользователя, хотя с вычислительной точки зрения это было бы правильно.

Одной из важных особенностей JavaScript является то, что, будучи однопоточными, асинхронные функции не блокируют основной поток, позволяя продолжить выполнение. Это важно, поскольку функции рендеринга браузера работают в одном потоке. Правда, это не бесплатно, так как они потребляют ресурсы, но зато не приводят к зависанию пользовательского интерфейса, по крайней мере, в теории. На практике это будет зависеть от ряда факторов, в значительной степени зависящих от среды браузера и аппаратного обеспечения. Тем не менее, давайте придерживаться теории.

Рассмотрим пример синхронной функции обратного вызова и превратим ее в асинхронную. Пример функции очень прост: мы будем вычислять значение Фибоначчи для заданного числа, используя шаблон обратного вызова. Но сначала напомним формулу вычисления:

js
F(0) = 0
+F(1) = 1
+F(n) = F(n-1)+F(n-2), причем n>=2
F(0) = 0
+F(1) = 1
+F(n) = F(n-1)+F(n-2), причем n>=2

Здесь представлена функция JavaScript, которая применяет формулу и получает обратный вызов для возврата значения. Обратите внимание, что эта функция является синхронной:

./chapter 2/callback-1.js - Синхронный Фибоначчи

js
function FibonacciSync(n, callback){
+     if (n < 2) {
+        callback(n)
+     } else {
+         let pre_1 = 0, pre_2 = 1, value;
+         for(let i=1; i<n; i++){
+            value = pre_1 + pre_2;
+            pre_1 = pre_2;
+            pre_2 = value;
+         }
+         callback(value).
+     }
+}
function FibonacciSync(n, callback){
+     if (n < 2) {
+        callback(n)
+     } else {
+         let pre_1 = 0, pre_2 = 1, value;
+         for(let i=1; i<n; i++){
+            value = pre_1 + pre_2;
+            pre_1 = pre_2;
+            pre_2 = value;
+         }
+         callback(value).
+     }
+}

Заметьте, что вместо того, чтобы вернуть значение с помощью return, мы передаем его в качестве параметра функции callback. Когда полезно использовать такое? Рассмотрим эти простые примеры:

js
FibonacciSync(8, console.log);
+// В консоль будет выведено 21
+FibonacciSync(8, alert)
+// Будет показано окошко с числом 21
FibonacciSync(8, console.log);
+// В консоль будет выведено 21
+FibonacciSync(8, alert)
+// Будет показано окошко с числом 21

Заменив функцию обратного вызова, мы можем существенно изменить представление результата. Однако у функции из примера есть фундаментальный недостаток, влияющий на пользовательский опыт. Будучи синхронной, время вычисления пропорционально переданному параметру: чем больше n, тем больше времени это займет. При достаточно большом числе мы легко можем "подвесить" браузер, но также, гораздо раньше, можем "заморозить" интерфейс. Проверить синхронность выполнения можно с помощью следующего фрагмента:

js
console.log("Before")
+FibonacciSync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// 34
+// After
console.log("Before")
+FibonacciSync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// 34
+// After

Чтобы превратить эту простую функцию в асинхронную, можно просто обернуть логику внутри вызова в setImmediate. Это выведет выполнение из обычного рабочего процесса. Теперь новая функция выглядит следующим образом:

js
function FibonacciAsync(n, callback){
+     setImmediate(()=>{
+         if (n<2){
+              callback(n)
+         } else {
+              let pre_1 = 0, pre_2 = 1,value;
+              for(let i=1; i<n; i++) {
+                  value = pre_1+pre_2;
+                  pre_1 = pre_2;
+                  pre_2 = value;
+              }
+              callback(value);
+         }
+    })
+}
function FibonacciAsync(n, callback){
+     setImmediate(()=>{
+         if (n<2){
+              callback(n)
+         } else {
+              let pre_1 = 0, pre_2 = 1,value;
+              for(let i=1; i<n; i++) {
+                  value = pre_1+pre_2;
+                  pre_1 = pre_2;
+                  pre_2 = value;
+              }
+              callback(value);
+         }
+    })
+}

Как видите, мы используем стрелочную функцию, чтобы завернуть код без каких-либо модификаций. Теперь посмотрите на разницу, когда мы выполним тот же сниппет, что и раньше, с этой функцией:

js
console.log("Before")
+FibonacciAsync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// After
+// 34
console.log("Before")
+FibonacciAsync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// After
+// 34

Как видно из вывода, сниппет выводит After раньше, чем 34. Это происходит потому, что наша асинхронная операция, как и ожидалось, была выведена из обычного потока. При вызове асинхронной функции выполнение не ожидает результата и продолжает выполнять следующую инструкцию. Это может иногда сбивать с толку, но является очень мощным и полезным.

Однако шаблон не предписывает, как обрабатывать ошибки или неудачные операции, как выстраивать цепочку или последовательно выполнять несколько вызовов. Существуют различные способы решения этих проблем, но они не являются частью шаблона. Существует другой способ обработки асинхронных операций, который обеспечивает большую гибкость и контроль: promises (обещания). Мы рассмотрим его далее, и в большинстве случаев вы можете использовать оба шаблона как взаимозаменяемые. Я говорю "в большинстве случаев", а не во всех!

Шаблон Promise (обещаниe)

Шаблон promise предназначен в первую очередь для работы с асинхронными операциями. Как и в случае с обратными вызовами, вызов обещанной функции выводит выполнение из обычного потока, но возвращает специальный объект Promise. Этот объект предоставляет простой API с тремя методами: then, catch и finally:

Во время выполнения обещания оно находится в неопределенном состоянии до тех пор, пока не будет разрешено или отклонено. Время ожидания обещания в этом состоянии не ограничено, что делает его особенно полезным для длительных операций, таких как сетевые вызовы и межпроцессные коммуникации (IPC).

Посмотрим, как реализовать предыдущий пример с рядом Фибоначчи с помощьюобещаний:

js
function FibonacciPromise(n) {
+     return new Promise((resolve, reject) => {          //1
+          if (n < 0) {
+              reject()           ;                      //2
+          } else {
+                 if (n < 2) {
+                  resolve(n)                            //3
+                } else {
+                     let pre_1 = 1, pre_2 = 1, value;
+                    for (let i = 2; i < n; i++) {
+                        значение = pre_1 + pre_2;
+                       pre_1 = pre_2;
+                       pre_2 = value;
+                     }
+                   resolve(value);
+                }
+          }
+      })
+}
function FibonacciPromise(n) {
+     return new Promise((resolve, reject) => {          //1
+          if (n < 0) {
+              reject()           ;                      //2
+          } else {
+                 if (n < 2) {
+                  resolve(n)                            //3
+                } else {
+                     let pre_1 = 1, pre_2 = 1, value;
+                    for (let i = 2; i < n; i++) {
+                        значение = pre_1 + pre_2;
+                       pre_1 = pre_2;
+                       pre_2 = value;
+                     }
+                   resolve(value);
+                }
+          }
+      })
+}

На первый взгляд легко заметить, что реализация немного изменилась. В строке //1 мы начинаем с того, что сразу возвращаем объект new Promise(). Этот конструктор получает функцию обратного вызова, которая, в свою очередь, получит два обратных вызова с именами resolve() и reject(). Их мы должны использовать в нашей логике для возврата значения в случае успеха (resolve) или неудачи (reject).

Также обратите внимание, что нам не нужно оборачивать наш код в функцию setImmediate, поскольку обещание по своей природе является асинхронным. Теперь мы проверяем наличие отрицательных чисел и в этом случае отклоняем операцию (строка //2). Другое изменение, которое мы делаем, - это замена callback() на resolve() (//4).

Вызов теперь также изменяется:

js
console.log("Before")
+FibonacciPromise(9).then(
+     value => console.log(value),
+     () => { console.log("Неопределено для отрицательных чисел!") }
+);
+console.log("After")
+// Будет выведено:
+// Before
+// After
+// 34
console.log("Before")
+FibonacciPromise(9).then(
+     value => console.log(value),
+     () => { console.log("Неопределено для отрицательных чисел!") }
+);
+console.log("After")
+// Будет выведено:
+// Before
+// After
+// 34

Как видите, мы выстраиваем цепочку к вызову, методу then, и передаем ему две функции для успеха и неудачи (resolve и reject в нашем коде). Как и раньше, мы получаем тот же самый результат. Теперь это может показаться более многословным (так оно и есть), но преимущества значительно перевешивают дополнительный набор текста. Обещания можно передавать по цепочке, то есть, при успешном выполнении операции можно вернуть новое обещание и таким образом получить последовательную операцию. Вот пример:

js
MyFunction()
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .catch(err=>{...})
MyFunction()
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .catch(err=>{...})

У конструктора Promise есть и другие методы, например .all, но для более глубокого изучения возможностей и синтаксиса я отсылаю вас к документации.

Тем не менее, получается довольно многословно. К счастью для нас, JavaScript предоставляет нам упрощенный синтаксис для работы с обещаниями, async/await, считая их способом кодирования более "традиционным" способом. Это относится только к вызову обещанных функций и может быть использовано только в функциях.

Для примера представим, что у нас есть три функции, возвращающие обещания, с именами MyFuncA, MyFuncB и MyFuncC (да, я знаю, не самые удачные имена). Каждая из них в случае успеха возвращает одно единственное значение (это условие). Затем они используются внутри MyProcessFunction с новым синтаксисом. Вот объявление:

js
async function myProcessFunction() {                    //1
+    try {                  ;                            //2
+        let     a = await MyFuncA(),                    //3
+                b = await MyFuncB(),
+                c = await MyFuncC()
+        console.log(a + b + c)                          //4
+    } catch {
+        console.log("Ошибка")
+    }
+}
+// Вызов функции в обычном режиме
+MyProcessFunction()                                      //5
async function myProcessFunction() {                    //1
+    try {                  ;                            //2
+        let     a = await MyFuncA(),                    //3
+                b = await MyFuncB(),
+                c = await MyFuncC()
+        console.log(a + b + c)                          //4
+    } catch {
+        console.log("Ошибка")
+    }
+}
+// Вызов функции в обычном режиме
+MyProcessFunction()                                      //5

Начнем с объявления нашей функции с ключевым словом async (строка //1). Это сигнализирует интерпретатору, что мы будем использовать синтаксис await внутри нашей функции. Одно из условий - обернуть код в блок try...catch. Тогда мы сможем использовать ключевое слово await перед вызовом каждой обещанной функции, как в строке //3. К строке //4 мы уверены, что каждая переменная получила свое значение. Безусловно, такой подход более удобен для восприятия.

Исследуем эквивалентности для строки:

js
let a = await MyFuncA()
let a = await MyFuncA()

Это будет соответствовать синтаксису thenable (с использованием .then):

js
let a;
+MyFuncA()
+    .then(result => { a = result; })
let a;
+MyFuncA()
+    .then(result => { a = result; })

Однако проблема с последним синтаксисом заключается в том, что нам необходимо убедиться, что все переменные a, b и c имеют значения, прежде чем мы сможет выполнить строку //4, console.log(a+b+c), что позволяет выстроить цепочку вызовов следующим образом:

js
let a,b,c;
+MyFuncA()
+    .then(result=>{ a=result; return MyFuncB()})
+    .then(result=>{ b=result; return MyFuncC()})
+    .then(result=>{ c=result; console.log(a+b+c)})
let a,b,c;
+MyFuncA()
+    .then(result=>{ a=result; return MyFuncB()})
+    .then(result=>{ b=result; return MyFuncC()})
+    .then(result=>{ c=result; console.log(a+b+c)})

Этот формат сложнее для понимания и, конечно, более многословен. Для таких случаев предпочтительнее использовать синтаксис async/await.

Использование обещаний отлично подходит для обертывания длинных или неопределенных операций и интеграции с другими рассмотренными нами шаблонами (façade, decorator и т.д.). Это важный шаблон, который мы будем широко использовать в наших приложениях.

Подведение итогов

В этой главе мы рассмотрели принципы разработки программного обеспечения и важные шаблоны проектирования, привели примеры на обычном JavaScript и, когда это было уместно, намекнули на реализацию с помощью Vue 3. Эти шаблоны могут быть сложны для восприятия при первом знакомстве с ними, но мы будем использовать их и возвращаться к ним в остальных частях книги, так что эта глава будет работать как справочник. Это позволит вам лучше понять, когда и как применять те или иные шаблоны в зависимости от потребностей вашего приложения.

В следующей главе мы начнем реализовывать проект с нуля и заложим основы для приложений, которые мы будем создавать в остальных частях книги. По мере продвижения вперед мы будем ссылаться на эти шаблоны, чтобы помочь вам закрепить их применение.

Вопросы для проверки

`,293),F=[d];function g(u,h,m,A,D,C){return n(),a("div",null,F)}const q=s(i,[["render",g]]);export{b as __pageData,q as default}; diff --git a/assets/book_ru_Chapter 2_ Software Design Principles and Patterns.md.a02b71d5.lean.js b/assets/book_ru_Chapter 2_ Software Design Principles and Patterns.md.a02b71d5.lean.js new file mode 100644 index 000000000..05350f245 --- /dev/null +++ b/assets/book_ru_Chapter 2_ Software Design Principles and Patterns.md.a02b71d5.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.477046d0.js";const p="/assets/Figure_2.01_B18602.373ad162.jpg",o="/assets/Figure_2.02_B18602.234e28ef.jpg",e="/assets/Figure_2.03_B18602.6231b535.jpg",t="/assets/Figure_2.04_B18602.fa796e98.jpg",c="/assets/Figure_2.05_B18602.5e3e06c6.jpg",r="/assets/Figure_2.06_B18602.7d26d857.jpg",E="/assets/Figure_2.07_B18602.e597f56b.jpg",y="/assets/Figure_2.08_B18602.0ad05159.jpg",b=JSON.parse('{"title":"Принципы и шаблоны проектирования программного обеспечения","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/Chapter 2_ Software Design Principles and Patterns.md","filePath":"book/ru/Chapter 2_ Software Design Principles and Patterns.md"}'),i={name:"book/ru/Chapter 2_ Software Design Principles and Patterns.md"},d=l("",293),F=[d];function g(u,h,m,A,D,C){return n(),a("div",null,F)}const q=s(i,[["render",g]]);export{b as __pageData,q as default}; diff --git a/assets/book_ru_index.md.99eee03a.js b/assets/book_ru_index.md.99eee03a.js deleted file mode 100644 index 58a0a4970..000000000 --- a/assets/book_ru_index.md.99eee03a.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as e,c as r,Q as s}from"./chunks/framework.477046d0.js";const o="/assets/book-face.41e33e05.jpg",m=JSON.parse('{"title":"О книге","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/index.md","filePath":"book/ru/index.md"}'),a={name:"book/ru/index.md"},n=s('

О книге

Vue.js 3 Design Patterns and Best Practices

Автор: Pablo Garaguso

В книге рассмотрен широкий спектр тем, начиная с самых основ Vue и заканчивая развертыванием конечного продукта.


Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

',11),i=[n];function l(c,g,p,d,_,u){return e(),r("div",null,i)}const b=t(a,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/book_ru_index.md.99eee03a.lean.js b/assets/book_ru_index.md.99eee03a.lean.js deleted file mode 100644 index 34d92bb60..000000000 --- a/assets/book_ru_index.md.99eee03a.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as e,c as r,Q as s}from"./chunks/framework.477046d0.js";const o="/assets/book-face.41e33e05.jpg",m=JSON.parse('{"title":"О книге","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/index.md","filePath":"book/ru/index.md"}'),a={name:"book/ru/index.md"},n=s("",11),i=[n];function l(c,g,p,d,_,u){return e(),r("div",null,i)}const b=t(a,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/book_ru_index.md.a0d63a87.js b/assets/book_ru_index.md.a0d63a87.js new file mode 100644 index 000000000..b7fe70ad3 --- /dev/null +++ b/assets/book_ru_index.md.a0d63a87.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,Q as r}from"./chunks/framework.477046d0.js";const o="/assets/book-face.41e33e05.jpg",g=JSON.parse('{"title":"Vue.js 3 Design Patterns and Best Practices","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/index.md","filePath":"book/ru/index.md"}'),s={name:"book/ru/index.md"},i=r('

Vue.js 3 Design Patterns and Best Practices

Автор: Pablo Garaguso

Предисловие

Vue 3 - это последняя и наиболее производительная итерация "прогрессивного фреймворка" для создания реактивных и отзывчивых пользовательских интерфейсов. Сам фреймворк представляет новые концепции и подходы к проектированию паттерны, которые могут быть необычными для других библиотек и фреймворков. Изучение основ фреймворка и понимание принципов проектирования и паттернов из области программной инженерии, поможет вам определить компромиссы каждого подхода и построить надежные приложения.

Книга начинается с базовых концепций, а затем с помощью примеров и сценариев кодирования ведет постепенно к построению более сложных архитектур. Вы начнете с простой страницы и закончите многопоточным приложением, автономным и устанавливаемым Progressive Web Application (PWA). Также рассматривается использование новых инструментов тестирования, доступных для Vue 3.

Помимо демонстрации того, как все делается, эта книга поможет вам научиться как "думать" и "подходить" к решению общих проблем, которые уже нашли свое решение в паттернах проектирования. Это позволит вам сэкономить время и сделать ваше программное обеспечение более приспособленным к будущим изменениям.

Для кого эта книга

Эта книга предназначена для разработчиков Vue, которые заботятся о принципах проектирования фреймворка Vue и использовании часто встречающихся паттернов проектирования при разработке веб-приложений. Вы узнаете, как использовать и настраивать новый бандлер (Vite), Pinia (управление состоянием), Router 4, web workers и другие технологии для создания производительных и надежных приложений.Предварительное знание JavaScirpt и базовые знания Vue будут полезны.

Чтобы получить максимальную пользу от этой книги

Эта книга предполагает, что вы знакомы с веб-технологиями, такими как JavaScript, HTML и технологиями, такими как JavaScript, HTML и CSS. Разработчики, заинтересованные в расширении своего понимания паттернов проектирования и архитектуры получат максимальную пользу от этой книги. Студенты и новички в мире веб-приложений, могут также следовать этой книге, уделяя пристальное внимание примерам кода и используя предоставленные проекты.

Программное/аппаратное обеспечение, рассматриваемое в книгеТребования к операционной системе
Official Vue 3 ecosystem:

• Vue 3 framework
• Pinia
• Vue Router
• Vite
• Vitest
• Vue Testing Tools
Windows, macOS, or Linux
Node.js (any version + v16 LTS)Windows, macOS, or Linux
Web servers: NGINX, ApacheWindows or Linux
Visual Studio CodeWindows, macOS, or Linux
Chrome browserWindows, macOS, or Linux

Особых требований к аппаратному обеспечению современных компьютеров нет, но рекомендуется иметь, по крайней мере, следующее:

Как правило, если на вашем компьютере может работать современный веб-браузер (Chrome/Chromium, Mozilla Firefox или Microsoft Edge), то он должен отвечать всем требованиям для установки и запуска всех инструментов разработчика, упомянутых в этой книге.

Скачать файлы кода примеров

Файлы кода примеров для этой книги можно загрузить с GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Код в действии

Видеоролики Код в действии для этой книги можно посмотреть на сайте https://packt.link/FtCMS.




Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

',25),n=[i];function d(c,l,p,u,h,b){return e(),a("div",null,n)}const _=t(s,[["render",d]]);export{g as __pageData,_ as default}; diff --git a/assets/book_ru_index.md.a0d63a87.lean.js b/assets/book_ru_index.md.a0d63a87.lean.js new file mode 100644 index 000000000..f56497df5 --- /dev/null +++ b/assets/book_ru_index.md.a0d63a87.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,Q as r}from"./chunks/framework.477046d0.js";const o="/assets/book-face.41e33e05.jpg",g=JSON.parse('{"title":"Vue.js 3 Design Patterns and Best Practices","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/index.md","filePath":"book/ru/index.md"}'),s={name:"book/ru/index.md"},i=r("",25),n=[i];function d(c,l,p,u,h,b){return e(),a("div",null,n)}const _=t(s,[["render",d]]);export{g as __pageData,_ as default}; diff --git a/assets/book_ru_summary.md.6874318f.js b/assets/book_ru_summary.md.6874318f.js new file mode 100644 index 000000000..74f8ad5ac --- /dev/null +++ b/assets/book_ru_summary.md.6874318f.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as r,Q as t}from"./chunks/framework.477046d0.js";const b=JSON.parse('{"title":"Что включает в себя эта книга","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/summary.md","filePath":"book/ru/summary.md"}'),o={name:"book/ru/summary.md"},h=t('

Что включает в себя эта книга

Глава 1, Фреймворк Vue 3

Что представляет собой прогрессивный фреймворк Vue 3? В этой главе представлены наиболее важные аспекты фреймворка и другие ключевые понятия.

Глава 2, Принципы проектирования программного обеспечения и паттерны

Принципы и шаблоны проектирования программного обеспечения являются визитной карточкой хорошей архитектуры программного обеспечения архитектуры. В этой главе рассказывается о них, приводятся примеры для реализации на JavaScript и Vue 3.

Глава 3, Создание рабочего проекта

После изучения необходимых вводных понятий в этой главе создается В этой главе мы создаем рабочий проект, который будет использоваться в качестве базовой основы для будущих проектов. будущих проектов. В ней вы шаг за шагом узнаете, как начать работу над проектом, используя нужные инструменты. как начать проект, используя необходимые инструменты.

Глава 4, Композиция пользовательского интерфейса с помощью компонентов

Эта глава знакомит с концепцией пользовательских интерфейсов и подводит к реализации веб-приложения. к реализации веб-приложения, начиная с концептуального визуального дизайна до разработки соответствующих компонентов.

Глава 5, Одностраничные приложения

Это ключевая глава, в которой представлен маршрутизатор Vue Router для создания одностраничных веб-приложений.

Глава 6, Прогрессивные веб-приложения

В этой главе на основе SPAs создаются PWA, а также представлены инструменты для оценки их готовности. использование инструментов для оценки их готовности и производительности.

Глава 7, Управление потоками данных

Эта глава знакомит с ключевыми концепциями проектирования и управления потоками данных и информации в приложении. потока данных и информации внутри приложения и между компонентами. компонентами. В ней представлена Pinia как официальный фреймворк управления состояниями для Vue 3. как официальный фреймворк управления состоянием для Vue 3.

Глава 8, Многопоточность с помощью веб-рабочих

Эта глава посвящена повышению производительности крупномасштабного приложения с помощью многопоточности с веб-рабочими. В ней также представлены дополнительные паттерны для создания простой в реализации и удобной в обслуживании архитектуры.

Глава 9, Тестирование и контроль исходных текстов

В этой главе мы знакомимся с официальными инструментами тестирования предоставляемыми командой Vue, а также с наиболее распространенной системой контроля версий: системой управления исходными текстами. системой контроля версий: Git. В главе показано, как создавать тестовые примеры для нашего отдельного JavaScript, а также компонентов Vue 3.

Глава 10, Развертывание приложения

В этой главе представлены концепции, необходимые для понимания того, как опубликовать приложение Vue 3 на живом рабочем сервере и как защитить его с помощью Let's Encence. защитить его с помощью сертификата Let's Encrypt.

Глава 11, бонусная глава - UX Patterns

Эта бонусная глава расширяет понятия пользовательского интерфейса и паттернов пользовательского опыта. чтобы обеспечить общий язык между разработчиком и дизайнером. В ней представлены общие шаблоны, предусмотренные стандартом HTML 5, и другие общие элементы.

Приложение: Миграция с Vue 2 на Vue 3

В этом приложении представлено руководство по изменениям и вариантам миграции для опытных разработчиков Vue 2.

',25),i=[h];function n(s,u,l,d,c,p){return e(),r("div",null,i)}const _=a(o,[["render",n]]);export{b as __pageData,_ as default}; diff --git a/assets/book_ru_summary.md.6874318f.lean.js b/assets/book_ru_summary.md.6874318f.lean.js new file mode 100644 index 000000000..005c3e2e6 --- /dev/null +++ b/assets/book_ru_summary.md.6874318f.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as r,Q as t}from"./chunks/framework.477046d0.js";const b=JSON.parse('{"title":"Что включает в себя эта книга","description":"","frontmatter":{},"headers":[],"relativePath":"book/ru/summary.md","filePath":"book/ru/summary.md"}'),o={name:"book/ru/summary.md"},h=t("",25),i=[h];function n(s,u,l,d,c,p){return e(),r("div",null,i)}const _=a(o,[["render",n]]);export{b as __pageData,_ as default}; diff --git a/assets/chunks/@localSearchIndexroot.82b40a0d.js b/assets/chunks/@localSearchIndexroot.82b40a0d.js deleted file mode 100644 index 0c1bd2e6a..000000000 --- a/assets/chunks/@localSearchIndexroot.82b40a0d.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":76,"nextId":76,"documentIds":{"0":"/backend/api.html#абстракция-канала-связи-с-бэкендом","1":"/backend/api.html#api-сервис","2":"/backend/auth.html#аутентификация-и-авторизация","3":"/backend/backend.html#варианты-задеиствовать-свои-бэкенд-для-фронтендера","4":"/backend/cors.html#cors","5":"/backend/protocols.html#протоколы-to-rest-или-не-rest","6":"/book/ru/Chapter 1_ The Vue 3 Framework.html#фреимворк-vue-3","7":"/book/ru/Chapter 1_ The Vue 3 Framework.html#прогрессивныи-фреимворк","8":"/book/ru/Chapter 1_ The Vue 3 Framework.html#использование-vue-в-веб-приложении","9":"/book/ru/Chapter 1_ The Vue 3 Framework.html#путь-сборщика-лучшии-путь","10":"/book/ru/Chapter 1_ The Vue 3 Framework.html#понимание-однофаиловых-компонентов","11":"/book/ru/Chapter 1_ The Vue 3 Framework.html#разные-варианты-options-composition-и-script-setup-api","12":"/book/ru/Chapter 1_ The Vue 3 Framework.html#изучение-встроенных-директив-в-vue-3","13":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-bind-сокращение","14":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-show","15":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-if-v-else-и-v-else-if","16":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-for-и-key","17":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-model","18":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-on-и-сокращение","19":"/book/ru/Chapter 1_ The Vue 3 Framework.html#встроенные-компоненты","20":"/book/ru/Chapter 1_ The Vue 3 Framework.html#кодовые-соглашения-code-conventions-в-книге","21":"/book/ru/Chapter 1_ The Vue 3 Framework.html#переменные-и-пропсы","22":"/book/ru/Chapter 1_ The Vue 3 Framework.html#константы","23":"/book/ru/Chapter 1_ The Vue 3 Framework.html#имена-классов-и-компонентов","24":"/book/ru/Chapter 1_ The Vue 3 Framework.html#функции-методы-события-и-имена-фаилов","25":"/book/ru/Chapter 1_ The Vue 3 Framework.html#экземпляры","26":"/book/ru/Chapter 1_ The Vue 3 Framework.html#подведение-итогов","27":"/book/ru/Chapter 1_ The Vue 3 Framework.html#вопросы-для-проверки","28":"/book/ru/#о-книге","29":"/book/ru/#vue-js-3-design-patterns-and-best-practices","30":"/book/ru/not-implemented.html#глава-еще-не-переведена","31":"/deployment/ci-cd.html#ci-cd","32":"/deployment/docker.html#docker","33":"/deployment/github-actions.html#github-actions","34":"/deployment/hosting.html#хостинг","35":"/development/assets.html#ресурсы-приложения","36":"/development/assets.html#baseicon","37":"/development/assets.html#icons-js","38":"/development/building.html#создание-и-сборка-приложения","39":"/development/ide.html#настроика-ide","40":"/development/libraries.html#подскажите-удобную-библиотеку","41":"/development/misc.html#полезные-советы","42":"/development/stores.html#state-management-во-vue-3","43":"/development/testing.html#тестирование","44":"/frontend/about-frameworks.html#о-фронтенд-фреимворках","45":"/frontend/architecture.html#архитектура-фронтэнд-приложении","46":"/frontend/architecture.html#избегаите-зависимостеи","47":"/frontend/architecture.html#используите-обертки-над-компонентами-ui-библиотек-и-сторонних-утилит","48":"/frontend/architecture.html#регулярныи-рефакторинг","49":"/frontend/architecture.html#используите-css3","50":"/frontend/architecture.html#используите-современные-стандарты-и-возможности-языков","51":"/frontend/architecture.html#документируите-проект","52":"/frontend/css-ui-libs.html#css-и-ui-библиотеки","53":"/frontend/learning.html#изучение-vue","54":"/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-и-seo","55":"/misc/CHANGELOG.html#история-изменении","56":"/misc/CHANGELOG.html#v1-3-10-10-2023","57":"/misc/CHANGELOG.html#изменено","58":"/misc/CHANGELOG.html#v1-2-27-09-2023","59":"/misc/CHANGELOG.html#новое","60":"/misc/CHANGELOG.html#изменено-1","61":"/misc/CHANGELOG.html#v1-1-15-09-2023","62":"/misc/CHANGELOG.html#новое-1","63":"/misc/CHANGELOG.html#изменено-2","64":"/misc/CHANGELOG.html#v1-0-11-09-2023","65":"/misc/CHANGELOG.html#новое-2","66":"/misc/cheat-sheets.html#шпаргалки-cheat-sheet","67":"/misc/cheat-sheets.html#vue","68":"/misc/cheat-sheets.html#javascript","69":"/misc/cheat-sheets.html#html","70":"/misc/cheat-sheets.html#css","71":"/misc/cheat-sheets.html#typescript","72":"/misc/cheat-sheets.html#markdown","73":"/misc/contribute.html#внесите-лепту-в-развитие-данного-faq","74":"/misc/glossary.html#глоссарии-и-сокращения","75":"/misc/introduction.html#предисловие"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,1],"1":[2,5,123],"2":[3,1,380],"3":[6,1,258],"4":[1,1,230],"5":[6,1,144],"6":[3,1,278],"7":[2,3,478],"8":[5,3,260],"9":[5,7,231],"10":[3,3,287],"11":[8,3,541],"12":[6,3,48],"13":[5,7,60],"14":[2,7,67],"15":[4,7,97],"16":[4,7,95],"17":[2,7,92],"18":[5,7,135],"19":[2,3,264],"20":[6,3,46],"21":[3,9,18],"22":[1,9,44],"23":[4,9,17],"24":[6,9,9],"25":[3,9,119],"26":[2,3,49],"27":[3,3,68],"28":[2,1,1],"29":[8,2,168],"30":[4,1,1],"31":[2,1,64],"32":[1,1,1],"33":[2,1,450],"34":[1,1,137],"35":[2,1,203],"36":[1,3,69],"37":[2,3,107],"38":[4,1,219],"39":[2,1,861],"40":[3,1,42],"41":[2,1,262],"42":[5,1,525],"43":[1,1,162],"44":[3,1,414],"45":[3,1,273],"46":[2,4,78],"47":[9,4,41],"48":[2,4,29],"49":[2,4,47],"50":[6,4,18],"51":[2,4,30],"52":[4,1,223],"53":[2,1,431],"54":[6,1,532],"55":[2,1,1],"56":[5,2,1],"57":[1,7,9],"58":[6,2,1],"59":[1,8,6],"60":[1,8,24],"61":[6,2,1],"62":[1,8,3],"63":[1,8,4],"64":[6,2,1],"65":[1,8,3],"66":[4,1,1],"67":[1,4,5],"68":[1,4,4],"69":[1,4,4],"70":[1,4,6],"71":[1,4,8],"72":[1,4,2],"73":[6,1,37],"74":[3,1,66],"75":[1,1,73]},"averageFieldLength":[3.1710526315789473,3.5,132.72368421052633],"storedFields":{"0":{"title":"Абстракция канала связи с бэкендом","titles":[]},"1":{"title":"API сервис","titles":["Абстракция канала связи с бэкендом"]},"2":{"title":"Аутентификация и авторизация","titles":[]},"3":{"title":"Варианты задействовать свой бэкенд для фронтендера","titles":[]},"4":{"title":"CORS","titles":[]},"5":{"title":"Протоколы. To REST или не REST?","titles":[]},"6":{"title":"Фреймворк Vue 3","titles":[]},"7":{"title":"Прогрессивный фреймворк","titles":["Фреймворк Vue 3"]},"8":{"title":"Использование Vue в веб-приложении","titles":["Фреймворк Vue 3"]},"9":{"title":"Путь сборщика, лучший путь...","titles":["Фреймворк Vue 3","Использование Vue в веб-приложении"]},"10":{"title":"Понимание однофайловых компонентов","titles":["Фреймворк Vue 3"]},"11":{"title":"Разные варианты - options, composition, и script setup API","titles":["Фреймворк Vue 3"]},"12":{"title":"Изучение встроенных директив в Vue 3","titles":["Фреймворк Vue 3"]},"13":{"title":"v-bind: (сокращение ":")","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"14":{"title":"v-show","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"15":{"title":"v-if, v-else и v-else-if","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"16":{"title":"v-for и :key","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"17":{"title":"v-model","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"18":{"title":"v-on: (и сокращение @)","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"19":{"title":"Встроенные компоненты","titles":["Фреймворк Vue 3"]},"20":{"title":"Кодовые соглашения (code conventions) в книге","titles":["Фреймворк Vue 3"]},"21":{"title":"Переменные и пропсы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"22":{"title":"Константы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"23":{"title":"Имена классов и компонентов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"24":{"title":"Функции, методы, события и имена файлов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"25":{"title":""Экземпляры","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"26":{"title":"Подведение итогов","titles":["Фреймворк Vue 3"]},"27":{"title":"Вопросы для проверки","titles":["Фреймворк Vue 3"]},"28":{"title":"О книге","titles":[]},"29":{"title":"Vue.js 3 Design Patterns and Best Practices","titles":["О книге"]},"30":{"title":"Глава еще не переведена","titles":[null]},"31":{"title":"CI/CD","titles":[]},"32":{"title":"Docker","titles":[]},"33":{"title":"Github Actions","titles":[]},"34":{"title":"Хостинг","titles":[]},"35":{"title":"Ресурсы приложения","titles":[]},"36":{"title":"BaseIcon","titles":["Ресурсы приложения",null,null]},"37":{"title":"icons.js","titles":["Ресурсы приложения",null,null]},"38":{"title":"Создание и сборка приложения","titles":[]},"39":{"title":"Настройка IDE","titles":[]},"40":{"title":"Подскажите удобную библиотеку","titles":[]},"41":{"title":"Полезные советы","titles":[]},"42":{"title":"State management во Vue 3","titles":[]},"43":{"title":"Тестирование","titles":[]},"44":{"title":"О фронтенд фреймворках","titles":[]},"45":{"title":"Архитектура фронтэнд приложений","titles":[]},"46":{"title":"Избегайте зависимостей","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"47":{"title":"Используйте обертки над компонентами UI библиотек и сторонних утилит","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"48":{"title":"Регулярный рефакторинг","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"49":{"title":"Используйте CSS3","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"50":{"title":"Используйте современные стандарты и возможности языков","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"51":{"title":"Документируйте проект","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"52":{"title":"CSS и UI библиотеки","titles":[]},"53":{"title":"Изучение Vue","titles":[]},"54":{"title":"SPA, PWA, SSG, SSR и SEO","titles":[]},"55":{"title":"История изменений","titles":[]},"56":{"title":"v1.3 (10-10-2023)","titles":["История изменений"]},"57":{"title":"Изменено","titles":["История изменений","v1.3 (10-10-2023)",null]},"58":{"title":"v1.2 (27-09-2023)","titles":["История изменений"]},"59":{"title":"Новое","titles":["История изменений","v1.2 (27-09-2023)",null]},"60":{"title":"Изменено","titles":["История изменений","v1.2 (27-09-2023)",null]},"61":{"title":"v1.1 (15-09-2023)","titles":["История изменений"]},"62":{"title":"Новое","titles":["История изменений","v1.1 (15-09-2023)"]},"63":{"title":"Изменено","titles":["История изменений","v1.1 (15-09-2023)"]},"64":{"title":"v1.0 (11-09-2023)","titles":["История изменений"]},"65":{"title":"Новое","titles":["История изменений","v1.0 (11-09-2023)"]},"66":{"title":"Шпаргалки (Cheat Sheet)","titles":[]},"67":{"title":"Vue","titles":["Шпаргалки (Cheat Sheet)",null]},"68":{"title":"JavaScript","titles":["Шпаргалки (Cheat Sheet)",null]},"69":{"title":"HTML","titles":["Шпаргалки (Cheat Sheet)",null]},"70":{"title":"CSS","titles":["Шпаргалки (Cheat Sheet)",null]},"71":{"title":"Typescript","titles":["Шпаргалки (Cheat Sheet)",null]},"72":{"title":"Markdown","titles":["Шпаргалки (Cheat Sheet)",null]},"73":{"title":"Внесите лепту в развитие данного FAQ","titles":[]},"74":{"title":"Глоссарий и сокращения","titles":[]},"75":{"title":"Предисловие","titles":[]}},"dirtCount":0,"index":[[">",{"2":{"73":2}}],["qbutton",{"2":{"52":2}}],["questions",{"2":{"75":1}}],["query",{"2":{"50":1}}],["queuebuilder",{"2":{"23":1}}],["quasar",{"2":{"39":4,"40":1}}],["quiet",{"2":{"39":2}}],["quicktime",{"2":{"6":1}}],["quot",{"0":{"13":2,"25":1},"2":{"1":40,"2":2,"3":4,"7":6,"8":22,"9":2,"10":4,"11":32,"13":4,"14":4,"16":8,"17":8,"18":8,"19":28,"27":2,"33":92,"35":28,"36":60,"37":32,"38":48,"39":1298,"41":4,"42":8,"44":4,"45":4,"49":2,"53":3,"54":6}}],["ютюбе",{"2":{"53":1}}],["ютюба",{"2":{"53":1}}],["ю",{"2":{"44":1}}],["юзер",{"2":{"2":1}}],["karma",{"2":{"39":20}}],["keepalive",{"2":{"19":2}}],["keys",{"2":{"42":1}}],["key=",{"2":{"16":2}}],["key",{"0":{"16":1},"2":{"16":1,"19":1,"33":17}}],["^",{"2":{"39":2}}],["^20",{"2":{"38":2}}],["zero",{"2":{"39":2}}],["`~",{"2":{"39":2}}],["`$",{"2":{"36":8}}],["`",{"2":{"33":6,"35":2}}],["|",{"2":{"33":8,"39":2}}],["yarnrc",{"2":{"39":4}}],["yarn",{"2":{"38":1,"39":8}}],["yamllint",{"2":{"39":4}}],["yaml",{"2":{"33":10,"39":14}}],["y",{"2":{"33":2}}],["yourself",{"2":{"39":2}}],["your",{"2":{"33":23,"42":2}}],["🚀",{"2":{"33":2}}],["🛎️",{"2":{"33":2}}],["09",{"0":{"58":1,"61":1,"64":1},"1":{"59":1,"60":1,"62":1,"63":1,"65":1}}],["04",{"2":{"39":2}}],["0",{"0":{"64":1},"1":{"65":1},"2":{"33":10,"54":2}}],["8",{"2":{"29":1,"33":4}}],["6",{"2":{"29":1}}],["$dirs",{"2":{"33":2}}],["$root",{"2":{"33":6}}],["$router",{"2":{"22":1}}],["$backup",{"2":{"33":12}}],["$env",{"2":{"33":2}}],["$project",{"2":{"33":6}}],["$github",{"2":{"33":10}}],["$target",{"2":{"33":16}}],["$store=usestore",{"2":{"22":1}}],["$notifications",{"2":{"22":1}}],["$modals",{"2":{"22":1}}],["$",{"2":{"22":1,"33":30,"35":2,"39":192}}],["50кб",{"2":{"41":1}}],["58",{"2":{"39":2}}],["5",{"2":{"16":3,"29":1,"33":5}}],["цитата",{"2":{"52":1}}],["цикл",{"2":{"16":1}}],["циклу",{"2":{"16":1}}],["цикла",{"2":{"11":1,"16":1}}],["цукерберг",{"2":{"44":1}}],["цепочке",{"2":{"8":1}}],["целесообразно",{"2":{"45":1}}],["целесообразность",{"2":{"43":1}}],["целей",{"2":{"6":1}}],["целом",{"2":{"39":1,"52":1,"53":1,"54":2}}],["целое",{"2":{"9":1}}],["цели",{"2":{"33":1,"42":1}}],["цель",{"2":{"8":1}}],["центр",{"2":{"2":1}}],["70",{"2":{"53":2}}],["7",{"2":{"11":1,"29":1}}],["4",{"2":{"10":2,"16":1,"17":1,"29":1,"37":4,"39":2}}],["401",{"2":{"2":2}}],["+page",{"2":{"39":12}}],["+layout",{"2":{"39":14}}],["+$backups",{"2":{"33":2}}],["+",{"2":{"7":2,"33":2,"37":4}}],["щепоткой",{"2":{"7":1}}],["9",{"2":{"29":1}}],["99",{"2":{"5":1,"42":3}}],["95",{"2":{"2":1,"40":1}}],["шпаргалки",{"0":{"66":1},"1":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1}}],["штатном",{"2":{"39":1}}],["штука",{"2":{"5":1}}],["шаг",{"2":{"54":1}}],["шагах",{"2":{"29":1}}],["шаблону",{"2":{"42":1}}],["шаблон",{"2":{"11":1,"42":1,"44":2,"45":1,"52":1}}],["шаблоне",{"2":{"11":5,"35":1}}],["шаблонам",{"2":{"54":1}}],["шаблона",{"2":{"11":1}}],["шаблоны",{"2":{"6":1,"19":1}}],["широкий",{"2":{"29":1}}],["шина",{"2":{"5":1}}],["300",{"2":{"39":2}}],["30",{"2":{"39":2}}],["39",{"2":{"19":4,"33":12,"35":4,"39":22}}],["3",{"0":{"6":1,"12":1,"29":1,"42":1,"56":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"57":1},"2":{"4":2,"6":3,"7":1,"8":3,"9":3,"10":2,"11":4,"16":1,"18":1,"19":2,"20":1,"26":1,"29":2,"38":2,"39":2,"41":3,"42":9,"44":3,"45":2,"52":1,"53":4,"67":1,"75":1}}],["27",{"0":{"58":1},"1":{"59":1,"60":1}}],["22+",{"2":{"39":1}}],["29",{"2":{"39":2}}],["24",{"2":{"36":4}}],["26",{"2":{"35":2}}],["2022",{"2":{"75":1}}],["2023",{"0":{"56":1,"58":1,"61":1,"64":1},"1":{"57":1,"59":1,"60":1,"62":1,"63":1,"65":1},"2":{"39":2,"53":1,"75":1}}],["2016",{"2":{"53":1}}],["20~30",{"2":{"38":1}}],["200",{"2":{"34":1,"39":2,"54":1}}],["20",{"2":{"33":2,"42":1,"53":1}}],["2",{"0":{"58":1},"1":{"59":1,"60":1},"2":{"4":2,"5":1,"6":1,"11":4,"16":1,"29":1,"39":6,"41":7,"42":2,"44":1,"52":1,"53":3,"54":1,"70":2}}],["way",{"2":{"73":1}}],["watch",{"2":{"44":1}}],["watchman",{"2":{"39":4}}],["windi",{"2":{"39":20}}],["window",{"2":{"33":2,"39":8}}],["width",{"2":{"36":14}}],["wide",{"2":{"6":1}}],["with",{"2":{"33":16,"37":2,"39":2}}],["words",{"2":{"42":1}}],["wordseparators",{"2":{"39":2}}],["workbox",{"2":{"54":2}}],["workbench",{"2":{"39":22}}],["worker",{"2":{"54":3,"74":1}}],["workers",{"2":{"29":1}}],["workspace",{"2":{"39":6}}],["workingissueformatscm",{"2":{"39":2}}],["work",{"2":{"33":2,"39":4}}],["workflow",{"2":{"33":3}}],["workflows",{"2":{"33":5}}],["world",{"2":{"6":1,"8":2,"10":2,"11":7}}],["write",{"2":{"10":2,"33":2,"42":1}}],["we",{"2":{"10":2}}],["webdriverio",{"2":{"43":1}}],["webpack",{"2":{"38":4,"39":26}}],["webp",{"2":{"37":1}}],["webstorm",{"2":{"39":2}}],["website",{"2":{"33":2,"34":5}}],["websocket",{"2":{"5":1}}],["websockets",{"2":{"1":1,"5":3,"53":1}}],["web",{"2":{"6":1,"29":1,"54":4}}],["www",{"2":{"4":1,"29":1,"33":12}}],["huskyrc",{"2":{"39":4}}],["hxx",{"2":{"39":6}}],["hpp",{"2":{"39":6}}],["histoire",{"2":{"39":20}}],["history",{"2":{"39":10}}],["highlightmodifiedtabs",{"2":{"39":2}}],["hmr",{"2":{"38":1}}],["h",{"2":{"33":2,"39":8}}],["holding",{"2":{"42":2}}],["houdini",{"2":{"39":2}}],["hover",{"2":{"39":2}}],["hooks",{"2":{"11":1,"39":8}}],["hosts",{"2":{"42":1}}],["host",{"2":{"4":2,"33":14}}],["h1",{"2":{"10":6}}],["heidisql",{"2":{"39":1}}],["height",{"2":{"36":14}}],["heex",{"2":{"39":2}}],["hexcolorlength",{"2":{"39":2}}],["helps",{"2":{"37":2}}],["hello=",{"2":{"11":1}}],["hello",{"2":{"8":2,"10":2,"11":19}}],["heroku",{"2":{"34":1}}],["here",{"2":{"10":2}}],["header",{"2":{"50":1}}],["headless",{"2":{"43":1,"52":1}}],["head",{"2":{"8":5}}],["htmlnanorc",{"2":{"39":40}}],["html=",{"2":{"36":2}}],["html5",{"2":{"6":1,"50":1,"69":1}}],["html",{"0":{"69":1},"2":{"4":1,"6":5,"7":2,"8":7,"9":2,"10":7,"11":1,"12":2,"13":4,"17":2,"18":4,"19":4,"33":2,"34":1,"35":2,"39":11,"44":3,"53":1,"54":10}}],["https",{"2":{"4":10,"8":2,"18":1,"19":2,"34":1,"39":4,"54":1}}],["httponly",{"2":{"2":3}}],["http",{"2":{"1":21,"3":1,"4":4,"35":1}}],["12",{"2":{"53":1}}],["15",{"0":{"61":1},"1":{"62":1,"63":1},"2":{"46":1}}],["16гб",{"2":{"39":1}}],["11",{"0":{"64":1},"1":{"65":1},"2":{"29":1}}],["1000",{"2":{"42":1}}],["100",{"2":{"36":4,"54":1}}],["10",{"0":{"56":2},"1":{"57":2},"2":{"29":1,"39":2,"52":1,"53":2}}],["1",{"0":{"61":1},"1":{"62":1,"63":1},"2":{"4":11,"5":1,"9":2,"16":1,"29":1,"37":4,"38":2,"41":4,"42":1,"54":1}}],["хранятся",{"2":{"53":1}}],["хранит",{"2":{"41":1}}],["хранить",{"2":{"2":1,"33":1,"42":1}}],["хедером",{"2":{"45":1}}],["хватает",{"2":{"40":1}}],["хэш",{"2":{"35":1}}],["хочу",{"2":{"45":2,"53":1}}],["хочет",{"2":{"3":2}}],["хотя",{"2":{"53":1}}],["хоть",{"2":{"44":2}}],["хотите",{"2":{"7":1,"10":2,"41":1}}],["хостите",{"2":{"34":1}}],["хостинг",{"0":{"34":1},"2":{"34":1}}],["хост",{"2":{"33":2}}],["хостеры",{"2":{"34":1}}],["хосте",{"2":{"33":1}}],["хорош",{"2":{"46":1}}],["хорошее",{"2":{"29":1}}],["хорошей",{"2":{"20":1}}],["хорошие",{"2":{"44":1,"52":2}}],["хороших",{"2":{"29":1}}],["хороший",{"2":{"7":1,"39":1}}],["хорошая",{"2":{"10":1,"43":1,"45":2}}],["хорошо",{"2":{"6":1,"11":1,"39":1,"52":1}}],["я",{"2":{"8":1,"11":2,"19":1,"29":1,"45":2,"53":2}}],["языков",{"0":{"50":1},"2":{"7":1,"41":1,"45":1}}],["язык",{"2":{"5":1,"6":2,"25":1,"42":1,"53":1}}],["языках",{"2":{"44":1,"45":1}}],["языками",{"2":{"10":1}}],["языка",{"2":{"4":1,"41":1,"53":1}}],["языке",{"2":{"3":2,"11":1,"53":1}}],["явно",{"2":{"11":1,"19":1}}],["явном",{"2":{"10":1}}],["явным",{"2":{"1":1}}],["является",{"2":{"3":1,"7":1,"8":1,"10":3,"11":4,"13":1,"27":1,"42":1,"44":2,"45":1,"54":1}}],["являются",{"2":{"3":1,"20":1,"25":1,"41":1}}],["like",{"2":{"42":2}}],["license",{"2":{"39":2}}],["lighthouserc",{"2":{"39":40}}],["linux",{"2":{"39":1}}],["lintstagedrc",{"2":{"39":4}}],["lint",{"2":{"39":8}}],["line",{"2":{"39":2}}],["linenumbers",{"2":{"39":2}}],["limit",{"2":{"39":6}}],["lib",{"2":{"39":2}}],["list",{"2":{"38":2,"39":2}}],["life",{"2":{"11":1}}],["learn",{"2":{"53":1}}],["lerna",{"2":{"39":4}}],["leex",{"2":{"39":2}}],["less",{"2":{"39":2}}],["length",{"2":{"37":4}}],["let",{"2":{"37":2}}],["layouts",{"2":{"45":1}}],["last",{"2":{"39":2}}],["lastindexof",{"2":{"37":4}}],["latexmk",{"2":{"39":2}}],["latest",{"2":{"33":4}}],["language",{"2":{"22":1,"39":2}}],["lang=",{"2":{"10":1,"36":2}}],["lamda",{"2":{"3":1}}],["lambda",{"2":{"3":1}}],["lt",{"2":{"8":24,"10":16,"11":16,"13":2,"14":4,"16":4,"17":2,"18":8,"19":16,"35":8,"36":16,"39":3,"52":8}}],["lot",{"2":{"39":2}}],["lof",{"2":{"39":2}}],["lock",{"2":{"39":26}}],["location",{"2":{"33":2}}],["localstoragename",{"2":{"33":6}}],["localstorage",{"2":{"2":1,"33":5}}],["loadicons",{"2":{"37":4}}],["loading",{"2":{"1":4,"14":4}}],["logic",{"2":{"42":2}}],["login",{"2":{"42":1}}],["logs",{"2":{"33":2,"39":2}}],["log",{"2":{"33":2,"39":2}}],["logout",{"2":{"1":2,"42":1}}],["certification",{"2":{"53":1}}],["certbot",{"2":{"34":1}}],["czrc",{"2":{"39":4}}],["cz",{"2":{"39":4}}],["cypress",{"2":{"39":20,"43":1}}],["cycle",{"2":{"11":1}}],["cmakepresets",{"2":{"39":2}}],["cmake",{"2":{"39":6}}],["cmakelists",{"2":{"39":2}}],["cxx",{"2":{"39":2}}],["cjs",{"2":{"39":8}}],["cc",{"2":{"39":2}}],["csproj",{"2":{"39":2}}],["cspell",{"2":{"39":4}}],["cshtml",{"2":{"39":4}}],["cs",{"2":{"39":24}}],["css3",{"0":{"49":1},"2":{"49":1,"50":1,"52":1}}],["cssnano",{"2":{"39":20}}],["cssnanorc",{"2":{"39":20}}],["css",{"0":{"52":1,"70":1},"2":{"6":4,"8":1,"9":1,"10":4,"14":1,"19":1,"34":1,"39":10,"40":1,"44":1,"49":1,"52":9,"53":1,"54":1}}],["custom",{"2":{"39":4}}],["cursorstyle",{"2":{"39":2}}],["cursorsmoothcaretanimation",{"2":{"39":2}}],["cursorblinking",{"2":{"39":2}}],["currentcolor",{"2":{"36":4}}],["ctrlcmd",{"2":{"39":2}}],["cpp",{"2":{"39":2}}],["cp",{"2":{"33":2}}],["cheat",{"0":{"66":1},"1":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"67":1,"68":1,"69":1,"70":4}}],["check",{"2":{"39":2}}],["checkout",{"2":{"33":7}}],["chrome",{"2":{"54":1}}],["changelog",{"2":{"39":2}}],["chgrp",{"2":{"33":4}}],["choice",{"2":{"33":2}}],["cd",{"0":{"31":1},"2":{"31":5,"33":7,"43":1,"53":1,"60":1}}],["cdn",{"2":{"8":1}}],["citation",{"2":{"39":2}}],["circleci",{"2":{"39":4}}],["ci",{"0":{"31":1},"2":{"31":5,"33":1,"43":1,"53":1,"60":1}}],["c",{"2":{"7":3,"11":1,"39":2}}],["can",{"2":{"42":1}}],["cache",{"2":{"39":2}}],["cargo",{"2":{"39":4}}],["capture",{"2":{"39":190}}],["camelcase",{"2":{"24":1}}],["case",{"2":{"22":1,"51":1}}],["ca",{"2":{"7":1}}],["clangd",{"2":{"39":2}}],["clang",{"2":{"39":4}}],["classes",{"2":{"71":1}}],["classpath",{"2":{"39":2}}],["class",{"2":{"39":2}}],["class=",{"2":{"36":2}}],["closeonfiledelete",{"2":{"39":2}}],["cloud",{"2":{"3":2,"53":1}}],["clean",{"2":{"33":2}}],["clippy",{"2":{"39":4}}],["clipboard",{"2":{"39":8}}],["cli",{"2":{"38":1,"39":4}}],["click=",{"2":{"18":4,"19":2}}],["click",{"2":{"18":2}}],["client",{"2":{"4":11}}],["crowdin",{"2":{"39":4}}],["cross",{"2":{"4":1,"39":2}}],["credits",{"2":{"39":2}}],["credo",{"2":{"39":2}}],["create",{"2":{"38":2,"73":1}}],["createapp",{"2":{"8":6}}],["crud",{"2":{"3":1}}],["copying",{"2":{"39":2}}],["count`",{"2":{"33":2}}],["count=5",{"2":{"33":2}}],["count",{"2":{"21":1}}],["codesandbox",{"2":{"39":1}}],["codeowners",{"2":{"39":2}}],["codecov",{"2":{"39":20}}],["codelens",{"2":{"39":8}}],["codeaction",{"2":{"39":2}}],["codeactions",{"2":{"39":2}}],["codeactionsonsave",{"2":{"39":4}}],["codeium",{"2":{"39":1}}],["code",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"11":1,"22":1,"39":11,"44":1}}],["colortheme",{"2":{"39":2}}],["color",{"2":{"10":2,"36":6}}],["cors",{"0":{"4":1},"2":{"4":10,"57":1}}],["commands",{"2":{"39":2}}],["commitlint",{"2":{"39":8}}],["commit",{"2":{"31":1}}],["compile",{"2":{"39":2}}],["compileroptions",{"2":{"38":2}}],["completion",{"2":{"39":2}}],["compare",{"2":{"39":12}}],["computed",{"2":{"11":1,"36":6}}],["component",{"2":{"19":5,"39":14,"42":3}}],["components",{"2":{"11":1,"19":1,"38":2,"39":2,"45":1}}],["composable",{"2":{"42":9,"44":2}}],["composables",{"2":{"1":2,"11":1,"42":1,"45":1}}],["compose",{"2":{"39":2}}],["composer",{"2":{"39":4}}],["composition",{"0":{"11":1},"2":{"11":10,"41":3,"53":1,"60":1}}],["comaccess",{"2":{"4":2}}],["comget",{"2":{"4":1}}],["com",{"2":{"3":1,"4":12,"8":2,"29":1,"33":17,"34":5,"39":4}}],["connection",{"2":{"39":1}}],["conduct",{"2":{"39":2}}],["conf",{"2":{"39":2}}],["confirmsync",{"2":{"39":2}}],["confirmdraganddrop",{"2":{"39":2}}],["confirmdelete",{"2":{"39":2}}],["configs",{"2":{"39":2}}],["config",{"2":{"38":3,"39":449}}],["console",{"2":{"33":2}}],["constant",{"2":{"11":2}}],["const",{"2":{"1":6,"8":2,"11":4,"19":2,"22":1,"25":1,"33":1,"36":6,"37":11,"41":3,"42":2}}],["container",{"2":{"50":1}}],["contributors",{"2":{"39":2}}],["contributing",{"2":{"39":2}}],["controller",{"2":{"39":2,"42":3,"44":2}}],["control",{"2":{"2":1,"4":7,"71":1}}],["contentlayer",{"2":{"39":20}}],["contents",{"2":{"33":2}}],["continuous",{"2":{"31":2}}],["conventions",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1}}],["convention",{"2":{"11":1}}],["cookie",{"2":{"2":3}}],["mjs",{"2":{"39":8}}],["multicursormodifier",{"2":{"39":2}}],["m",{"2":{"33":4}}],["mdsvex",{"2":{"39":2}}],["md",{"2":{"33":2,"39":6}}],["mkdir",{"2":{"33":4}}],["mvp",{"2":{"43":1}}],["mvc",{"2":{"42":1,"44":1}}],["mv",{"2":{"33":2}}],["moment",{"2":{"40":1}}],["mocha",{"2":{"39":20}}],["monospace",{"2":{"39":2}}],["mono",{"2":{"39":2}}],["mod",{"2":{"39":2}}],["module",{"2":{"39":2}}],["modules",{"2":{"37":12,"38":1,"39":4}}],["mode",{"2":{"39":2}}],["modern",{"2":{"39":2}}],["model=",{"2":{"17":2}}],["model",{"0":{"17":1},"2":{"14":1,"25":1,"42":1,"44":1}}],["mount",{"2":{"8":4}}],["mysql",{"2":{"39":1,"53":1}}],["my",{"2":{"13":4}}],["mymethod",{"2":{"11":1}}],["management",{"0":{"42":1},"2":{"42":2}}],["manually",{"2":{"39":2}}],["mailmap",{"2":{"39":2}}],["maintainers",{"2":{"39":2}}],["main",{"2":{"9":1,"33":9}}],["markdownlint",{"2":{"39":4}}],["markdown",{"0":{"72":1},"2":{"39":2,"72":1}}],["macos",{"2":{"39":2}}],["macromedia",{"2":{"6":1}}],["map",{"2":{"37":4,"39":14}}],["mastery",{"2":{"53":1}}],["master",{"2":{"33":5,"39":2}}],["menus",{"2":{"39":2}}],["methods",{"2":{"11":1}}],["metadata",{"2":{"39":2}}],["meta",{"2":{"1":2,"36":1,"37":4}}],["message",{"2":{"8":6}}],["mix",{"2":{"39":6}}],["might",{"2":{"39":2}}],["minheight",{"2":{"36":2}}],["minwidth",{"2":{"36":2}}],["mitt",{"2":{"5":1}}],["microsoft",{"2":{"3":1,"34":1,"39":1}}],["зерна",{"2":{"53":1}}],["зря",{"2":{"52":1}}],["зрения",{"2":{"29":1,"42":3,"74":1}}],["змеином",{"2":{"22":1}}],["звучит",{"2":{"9":1}}],["зона",{"2":{"7":1}}],["здесь",{"2":{"5":1,"6":1,"9":1,"10":2,"11":2,"18":1,"19":2,"42":1}}],["знаний",{"2":{"53":1}}],["знанию",{"2":{"53":1}}],["знания",{"2":{"6":1,"53":2}}],["знал",{"2":{"53":1}}],["знающих",{"2":{"53":1}}],["знают",{"2":{"52":1}}],["знатоков",{"2":{"39":1}}],["знать",{"2":{"7":1,"9":1,"11":1,"38":1,"53":2}}],["знаем",{"2":{"11":1}}],["знает",{"2":{"9":1,"11":2}}],["знаете",{"2":{"3":1}}],["знака",{"2":{"22":1}}],["знаком",{"2":{"21":1}}],["знакомым",{"2":{"10":1}}],["знак",{"2":{"8":1}}],["значению",{"2":{"11":2}}],["значений",{"2":{"11":1}}],["значением",{"2":{"13":1,"44":1}}],["значение",{"2":{"7":4,"8":1,"11":7,"13":2,"14":2,"16":1,"17":2,"19":1,"33":1}}],["значения",{"2":{"7":1,"8":1,"11":1,"13":1,"15":1,"17":1,"19":1,"22":1,"44":1}}],["значении",{"2":{"3":1}}],["значительный",{"2":{"7":1,"54":1}}],["значительные",{"2":{"6":1}}],["значительную",{"2":{"7":1}}],["значительное",{"2":{"41":1}}],["значительно",{"2":{"7":1,"8":1,"39":1,"45":1,"52":1,"54":1}}],["значительной",{"2":{"6":1}}],["зазываниях",{"2":{"46":1}}],["затрагиваемым",{"2":{"75":1}}],["затратами",{"2":{"45":1}}],["затем",{"2":{"2":1,"3":1,"9":2,"37":1,"54":3}}],["зажимает",{"2":{"44":1}}],["зависящие",{"2":{"44":1}}],["зависимое",{"2":{"7":1}}],["зависимость",{"2":{"42":1,"46":1,"52":2}}],["зависимостей",{"0":{"46":1},"2":{"7":1,"22":1,"41":1,"44":2}}],["зависимости",{"2":{"2":1,"7":2,"10":1,"11":1,"15":1,"35":1,"54":1}}],["зависит",{"2":{"4":1,"7":1,"8":1}}],["занять",{"2":{"43":1}}],["занимающие",{"2":{"41":1}}],["занимаются",{"2":{"43":1}}],["занимают",{"2":{"38":1}}],["занимает",{"2":{"6":1}}],["зачастую",{"2":{"43":1}}],["зачем",{"2":{"42":1}}],["забыл",{"2":{"49":1}}],["забыть",{"2":{"41":1}}],["заботу",{"2":{"44":1}}],["заботитесь",{"2":{"37":1}}],["загуглите",{"2":{"46":1}}],["заглянуть",{"2":{"39":1}}],["заглавными",{"2":{"22":1,"25":1}}],["загромождает",{"2":{"11":1}}],["загружаясь",{"2":{"35":1}}],["загружать",{"2":{"9":1,"19":1}}],["загрузке",{"2":{"33":1,"39":1,"54":1}}],["загрузки",{"2":{"33":2,"35":1,"41":1}}],["загрузка",{"2":{"33":1}}],["загрузит",{"2":{"9":2}}],["заголовков",{"2":{"4":1}}],["захостите",{"2":{"53":1}}],["захостить",{"2":{"3":1,"34":1}}],["захотеть",{"2":{"7":1}}],["закэшировать",{"2":{"54":1}}],["заказчик",{"2":{"45":1,"49":1}}],["заканчивая",{"2":{"10":1,"29":1}}],["закрытый",{"2":{"33":1}}],["закрепить",{"2":{"27":1}}],["заключенного",{"2":{"9":1}}],["заключается",{"2":{"7":4,"11":1,"19":1}}],["законченный",{"2":{"53":1}}],["закон",{"2":{"7":1}}],["заранее",{"2":{"54":1}}],["зарегистрируйте",{"2":{"53":1}}],["зарегистрироваться",{"2":{"53":1}}],["зарезервированное",{"2":{"11":1}}],["зарекомендовавшие",{"2":{"6":1}}],["зародились",{"2":{"6":1}}],["защиты",{"2":{"4":1,"29":1}}],["задаваемые",{"2":{"75":1}}],["задачей",{"2":{"44":1}}],["задача",{"2":{"39":1}}],["задает",{"2":{"41":1}}],["заданном",{"2":{"9":1}}],["заданному",{"2":{"3":1}}],["задать",{"2":{"2":1,"44":2}}],["задействовать",{"0":{"3":1},"2":{"54":1}}],["за",{"2":{"2":1,"5":1,"6":1,"7":1,"11":1,"15":1,"19":3,"25":1,"29":2,"39":1,"41":2,"42":4,"44":6,"53":1}}],["заставлять",{"2":{"2":1}}],["заметки",{"2":{"54":1}}],["заметить",{"2":{"11":1}}],["замечательным",{"2":{"8":1}}],["замена",{"2":{"41":1}}],["замены",{"2":{"41":1}}],["замену",{"2":{"41":2,"44":1,"47":1}}],["заменяются",{"2":{"21":1}}],["заменится",{"2":{"19":1}}],["замените",{"2":{"18":1}}],["заменить",{"2":{"1":1,"45":1,"52":2}}],["заменено",{"2":{"8":1}}],["заморачиваться",{"2":{"3":1}}],["заморочки",{"2":{"2":1}}],["заполнено",{"2":{"42":1}}],["запомните",{"2":{"10":1}}],["запущен",{"2":{"43":1}}],["запутывающее",{"2":{"42":1}}],["запуск",{"2":{"65":1}}],["запуске",{"2":{"54":2}}],["запускалось",{"2":{"54":1}}],["запускаются",{"2":{"11":1,"39":1}}],["запускается",{"2":{"38":1}}],["запускает",{"2":{"9":1}}],["запустим",{"2":{"9":1}}],["запустить",{"2":{"3":2,"39":1}}],["запасного",{"2":{"19":1}}],["записываются",{"2":{"23":1}}],["записанный",{"2":{"2":1}}],["записи",{"2":{"2":1,"11":1}}],["запрошен",{"2":{"4":1}}],["запросом",{"2":{"54":1}}],["запросов",{"2":{"1":1,"4":1,"5":2}}],["запросы",{"2":{"5":1,"39":1,"54":2}}],["запрос",{"2":{"4":3}}],["запросе",{"2":{"2":2}}],["запросам",{"2":{"4":1}}],["запроса",{"2":{"1":1,"4":4,"54":1}}],["запрашивает",{"2":{"4":1}}],["запрашиваемого",{"2":{"4":1}}],["запрашиваемому",{"2":{"2":1}}],["запрашивать",{"2":{"3":1}}],["запрашивающий",{"2":{"2":1}}],["запрещены",{"2":{"2":1}}],["залогинился",{"2":{"2":1,"42":1}}],["nls",{"2":{"39":4}}],["nx",{"2":{"39":4}}],["nvmrc",{"2":{"39":4}}],["nix",{"2":{"39":6}}],["nativetabs",{"2":{"39":2}}],["named",{"2":{"37":2}}],["name=",{"2":{"35":2}}],["name",{"2":{"11":3,"17":3,"33":24,"35":4,"36":8,"37":16}}],["null",{"2":{"39":2}}],["nuxt",{"2":{"7":1,"39":4}}],["npx",{"2":{"38":4}}],["npm",{"2":{"38":1,"39":8,"41":1,"46":1}}],["n",{"2":{"33":2,"39":2}}],["nest",{"2":{"39":4}}],["nesting",{"2":{"39":4}}],["next",{"2":{"39":4}}],["never",{"2":{"39":2}}],["netlify",{"2":{"34":1,"39":4}}],["network",{"2":{"3":1}}],["newitem",{"2":{"44":6}}],["new",{"2":{"33":4,"37":4}}],["nginx",{"2":{"3":1,"34":1}}],["nodе",{"2":{"39":1}}],["nodemon",{"2":{"39":8}}],["node",{"2":{"3":2,"33":4,"38":5,"39":11,"53":1,"54":1}}],["not",{"2":{"39":2,"41":2}}],["notificationinterceptor",{"2":{"1":4}}],["nosql",{"2":{"3":1,"42":1}}],["bit",{"2":{"42":1}}],["bind",{"0":{"13":1},"2":{"13":1}}],["bzl",{"2":{"39":2}}],["bbl",{"2":{"39":2}}],["blg",{"2":{"39":2}}],["bloc",{"2":{"39":2}}],["blame",{"2":{"39":6}}],["bound",{"2":{"42":2}}],["boundary",{"2":{"39":2}}],["bower",{"2":{"39":6}}],["body",{"2":{"8":6}}],["be",{"2":{"33":4,"39":2}}],["best",{"0":{"29":1},"2":{"53":1}}],["by",{"2":{"33":2}}],["bracketpairs",{"2":{"39":2}}],["branch",{"2":{"33":2}}],["branches",{"2":{"33":4}}],["browserslist",{"2":{"39":4}}],["browser",{"2":{"2":1,"39":2}}],["builddata",{"2":{"33":8}}],["build",{"2":{"33":19,"38":2,"39":8}}],["built",{"2":{"18":1,"19":2}}],["button",{"2":{"18":8,"19":4,"52":1}}],["bundleconfig",{"2":{"39":4}}],["bundle",{"2":{"9":1,"38":6}}],["bundler",{"2":{"9":1}}],["business",{"2":{"42":2}}],["bus",{"2":{"5":1}}],["b",{"2":{"7":4,"41":4}}],["babel",{"2":{"39":20}}],["babelrc",{"2":{"39":20}}],["bazelproject",{"2":{"39":2}}],["bazelignore",{"2":{"39":2}}],["bazelrc",{"2":{"39":2}}],["bazel",{"2":{"39":6}}],["baseinput",{"2":{"47":1}}],["baseicon",{"0":{"36":1},"2":{"35":3,"38":4}}],["basebutton",{"2":{"45":1,"47":1,"52":3}}],["base",{"2":{"36":2}}],["base64",{"2":{"35":1}}],["based",{"2":{"2":3}}],["banner",{"2":{"35":1}}],["backers",{"2":{"39":2}}],["backend",{"2":{"3":1}}],["backups",{"2":{"33":2}}],["backup",{"2":{"33":15}}],["baas",{"2":{"3":5}}],["эстетики",{"2":{"74":1}}],["эволюция",{"2":{"52":1}}],["эван",{"2":{"44":1}}],["эффективно",{"2":{"45":1}}],["эффективности",{"2":{"41":1}}],["эффективного",{"2":{"16":1}}],["эффективней",{"2":{"41":1,"44":2,"54":1}}],["экран",{"2":{"54":1}}],["экране",{"2":{"19":1}}],["экосистеме",{"2":{"39":1}}],["экономичным",{"2":{"3":1}}],["экспериментировал",{"2":{"44":1}}],["экспериментальной",{"2":{"19":1}}],["экспорт",{"2":{"11":1}}],["экспортируете",{"2":{"42":1}}],["экспортирует",{"2":{"10":1}}],["эквивалентна",{"2":{"14":1}}],["экземпляров",{"2":{"42":1}}],["экземпляры",{"0":{"25":1},"2":{"19":1,"25":1}}],["экземпляру",{"2":{"11":1}}],["экземпляр",{"2":{"8":1}}],["элементом",{"2":{"17":1}}],["элементов",{"2":{"2":1,"6":1,"15":2,"16":2,"19":5,"41":4,"43":1}}],["элементу",{"2":{"17":1}}],["элементарное",{"2":{"53":1}}],["элементарно",{"2":{"35":1}}],["элементами",{"2":{"15":1,"18":1}}],["элемента",{"2":{"10":1,"12":2,"16":2,"44":1,"54":1}}],["элемент",{"2":{"8":4,"14":2,"15":4,"19":1,"74":1}}],["элементы",{"2":{"6":1,"10":1,"19":1,"31":1,"44":1,"50":1,"54":1}}],["эти",{"2":{"9":2,"10":1,"11":2,"15":1,"16":1,"25":1,"26":1,"27":1,"42":2}}],["этим",{"2":{"7":1,"10":1}}],["этих",{"2":{"4":1,"6":1,"7":4,"17":1,"43":1,"53":1,"54":1}}],["этапе",{"2":{"45":1}}],["эта",{"2":{"7":1,"11":1,"14":1,"17":1,"18":1,"39":1}}],["эту",{"2":{"5":1,"11":1,"35":1,"43":1,"53":1}}],["этого",{"2":{"9":1,"10":3,"11":1,"12":1,"15":1,"34":1,"38":1,"41":1,"42":1,"44":1,"45":1,"53":2,"54":2}}],["этому",{"2":{"53":1}}],["этом",{"2":{"7":2,"8":2,"9":1,"11":2,"17":1,"19":1,"34":1,"35":1,"38":1,"42":2,"43":2,"44":3,"53":1}}],["этой",{"2":{"2":1,"6":4,"7":1,"11":3,"18":2,"19":1,"20":2,"26":1,"27":1,"29":2,"33":1,"40":1,"41":1,"42":1,"52":1}}],["этот",{"2":{"2":1,"7":2,"8":2,"9":1,"11":3,"14":1,"33":1,"39":1,"45":2,"53":2}}],["это",{"2":{"2":3,"3":3,"4":3,"6":1,"7":9,"8":4,"9":1,"10":7,"11":16,"15":1,"16":1,"17":1,"18":1,"19":4,"25":2,"31":1,"34":1,"35":2,"38":1,"42":8,"43":1,"44":10,"45":6,"46":2,"47":1,"48":1,"49":1,"51":1,"52":1,"53":4,"54":4}}],["эндпойнту",{"2":{"3":2}}],["эндпойнтам",{"2":{"3":1}}],["эндпойнтов",{"2":{"3":1}}],["other",{"2":{"42":1}}],["ok",{"2":{"41":4}}],["observer",{"2":{"41":1}}],["object",{"2":{"14":1,"37":2}}],["overrides",{"2":{"39":2}}],["openclose",{"2":{"39":2}}],["option",{"2":{"22":1}}],["options",{"0":{"11":1},"2":{"11":6,"33":2,"39":2,"41":1}}],["out",{"2":{"39":4}}],["output",{"2":{"39":2}}],["our",{"2":{"10":2}}],["off",{"2":{"39":2,"42":1}}],["of",{"2":{"35":2,"39":2,"54":1}}],["oreilly",{"2":{"53":1}}],["organizeimports",{"2":{"39":2}}],["org",{"2":{"18":1,"19":2}}],["origin",{"2":{"4":11}}],["oracle",{"2":{"3":1,"34":1}}],["one",{"2":{"54":1}}],["ontaskerrors",{"2":{"39":2}}],["onlyenabledextensions",{"2":{"39":2}}],["only",{"2":{"39":4}}],["on",{"0":{"18":1},"2":{"2":1,"18":3,"33":10,"39":4}}],["oauth",{"2":{"2":2}}],["dx",{"2":{"52":1,"74":1}}],["dropdown",{"2":{"52":1}}],["drive",{"2":{"2":3}}],["dprint",{"2":{"39":8}}],["dlint",{"2":{"39":8}}],["day",{"2":{"40":2}}],["dangerfile",{"2":{"39":4}}],["dart",{"2":{"39":12}}],["dark",{"2":{"39":2}}],["date=`date",{"2":{"33":2}}],["date",{"2":{"33":14,"39":2}}],["datanpx",{"2":{"38":1}}],["data",{"2":{"8":3,"11":7,"33":4,"38":1}}],["dynamic",{"2":{"35":2}}],["dt",{"2":{"33":2}}],["d",{"2":{"33":2,"39":32}}],["docs",{"2":{"33":2,"34":1}}],["dockerignore",{"2":{"39":2}}],["dockerfile",{"2":{"39":4}}],["docker",{"0":{"32":1},"2":{"39":3}}],["document",{"2":{"14":1,"53":1}}],["dosubscribe",{"2":{"24":1}}],["dom",{"2":{"14":1,"15":2,"17":1}}],["dialyzer",{"2":{"39":2}}],["dialogstyle",{"2":{"39":2}}],["diffeditor",{"2":{"39":2}}],["diffdecorationsgutterwidth",{"2":{"39":2}}],["dirname",{"2":{"38":2}}],["dirs",{"2":{"33":2}}],["dir=`echo",{"2":{"33":4}}],["dir=your",{"2":{"33":2}}],["dir=dev",{"2":{"33":2}}],["dir=",{"2":{"33":4}}],["dir",{"2":{"33":48}}],["directives",{"2":{"18":1}}],["dispatch",{"2":{"33":3}}],["displaylanguage",{"2":{"39":2}}],["display",{"2":{"14":1}}],["dist",{"2":{"33":4,"35":1,"39":2}}],["div",{"2":{"8":6,"11":4,"14":5,"36":2}}],["details",{"2":{"50":1}}],["debounce",{"2":{"46":1}}],["debuganyway",{"2":{"39":2}}],["debug",{"2":{"39":2}}],["deno",{"2":{"39":4}}],["deep",{"2":{"36":2}}],["defineconfig",{"2":{"38":2}}],["defineprops",{"2":{"36":2}}],["defaultformatter",{"2":{"39":8}}],["default",{"2":{"1":2,"11":4,"33":4,"36":12,"38":2,"39":4}}],["description",{"2":{"33":2}}],["designer",{"2":{"39":4}}],["design",{"0":{"29":1},"2":{"53":1}}],["deprecated",{"2":{"42":1}}],["dependencies",{"2":{"33":4}}],["deploy",{"2":{"33":27}}],["delivery",{"2":{"31":1}}],["developer",{"2":{"74":1}}],["devdependencies",{"2":{"38":2,"39":1}}],["dev",{"2":{"4":1,"33":15,"34":2,"38":1,"54":1}}],["devtools",{"2":{"3":1,"42":2}}],["guide",{"2":{"53":2}}],["guides",{"2":{"39":2}}],["gui",{"2":{"44":1}}],["gulp",{"2":{"39":4}}],["generation",{"2":{"54":1}}],["gemfile",{"2":{"39":4}}],["getimageurl",{"2":{"36":4,"37":4}}],["getitem",{"2":{"33":2}}],["getsvgicon",{"2":{"36":6,"37":4}}],["gets",{"2":{"35":4}}],["get",{"2":{"1":2,"4":1,"37":4}}],["gettoken",{"2":{"1":2}}],["getuserdata",{"2":{"1":4}}],["gql",{"2":{"39":4}}],["gz",{"2":{"39":2}}],["gls",{"2":{"39":2}}],["glo",{"2":{"39":2}}],["global",{"2":{"42":1}}],["glob",{"2":{"36":1,"37":4}}],["glg",{"2":{"39":2}}],["governance",{"2":{"39":2}}],["go",{"2":{"39":12}}],["google",{"2":{"2":8,"3":2,"34":1,"53":1,"54":3}}],["g",{"2":{"39":2}}],["grid",{"2":{"50":1,"70":2}}],["grunt",{"2":{"39":4}}],["great",{"2":{"39":2}}],["graphgl",{"2":{"5":1}}],["gh",{"2":{"33":3}}],["gitpod",{"2":{"39":4}}],["gitmessage",{"2":{"39":2}}],["gitmodules",{"2":{"39":2}}],["gitattributes",{"2":{"39":2}}],["gitlens",{"2":{"39":8}}],["gitlab",{"2":{"31":1,"39":4}}],["gitignore",{"2":{"33":2,"39":2}}],["githubpullrequests",{"2":{"39":2}}],["githubissues",{"2":{"39":2}}],["github",{"0":{"33":1},"2":{"31":2,"33":27,"34":3,"39":12,"53":2,"59":1,"73":1}}],["git",{"2":{"31":1,"33":4,"39":20}}],["gatsby",{"2":{"39":10}}],["gateway",{"2":{"3":1}}],["garaguso",{"2":{"29":1}}],["gt",{"2":{"8":24,"10":16,"11":16,"13":2,"14":4,"16":4,"17":2,"18":8,"19":16,"33":27,"35":8,"36":20,"39":3,"52":8,"54":2}}],["gmail",{"2":{"2":1}}],["x",{"2":{"41":4}}],["xshell",{"2":{"39":1}}],["xss",{"2":{"2":1}}],["xo",{"2":{"39":8}}],["xmlhttprequest",{"2":{"54":1}}],["xml",{"2":{"39":8}}],["xaml",{"2":{"39":4}}],["xdv",{"2":{"39":2}}],["xhr",{"2":{"1":1}}],["жизнь",{"2":{"33":1,"44":1}}],["жизненного",{"2":{"11":1}}],["жизни",{"2":{"2":4}}],["жить",{"2":{"7":1}}],["живущий",{"2":{"2":1}}],["железу",{"2":{"54":1}}],["железо",{"2":{"54":1}}],["желательно",{"2":{"53":1}}],["желаю",{"2":{"29":1}}],["жестко",{"2":{"44":1}}],["жесткие",{"2":{"38":1}}],["же",{"2":{"2":2,"7":4,"9":1,"11":3,"15":1,"17":1,"33":1,"34":1,"39":1,"41":1,"42":3,"43":2,"44":1,"45":1,"47":1,"53":1,"54":1}}],["флексбокса",{"2":{"49":1}}],["флагманом",{"2":{"44":1}}],["фоне",{"2":{"44":1}}],["фон",{"2":{"37":1}}],["форсирует",{"2":{"33":1}}],["формочки",{"2":{"54":1}}],["формы",{"2":{"42":1}}],["формальный",{"2":{"11":1}}],["форматировании",{"2":{"54":1}}],["форматирование",{"2":{"39":1}}],["форматирует",{"2":{"39":1}}],["формат",{"2":{"11":1,"37":1}}],["формата",{"2":{"5":1,"54":1}}],["формате",{"2":{"3":1,"11":1,"37":1,"54":1}}],["формируя",{"2":{"9":1}}],["формирует",{"2":{"3":1,"54":1}}],["формирование",{"2":{"1":1}}],["формулу",{"2":{"7":1}}],["форму",{"2":{"2":1,"73":1}}],["фактор",{"2":{"44":1}}],["факт",{"2":{"42":1}}],["фактического",{"2":{"33":1,"54":1}}],["файле",{"2":{"10":1}}],["файлы",{"2":{"9":1,"33":1,"35":1,"38":1,"54":1}}],["файл",{"2":{"9":3,"10":3,"33":4,"36":1,"39":1,"54":2}}],["файлов",{"0":{"24":1},"2":{"9":1,"33":1,"34":1,"36":1,"38":1}}],["файлах",{"2":{"39":1}}],["файла",{"2":{"4":1,"33":3,"54":1}}],["фиксит",{"2":{"45":1}}],["фиксации",{"2":{"25":1}}],["финальном",{"2":{"45":1}}],["фигурные",{"2":{"8":1}}],["футером",{"2":{"45":1}}],["фундаментальное",{"2":{"44":1}}],["фундаментальной",{"2":{"7":1}}],["функционал",{"2":{"45":1,"51":1}}],["функциональной",{"2":{"42":1}}],["функциональностью",{"2":{"11":1}}],["функциональность",{"2":{"7":1,"11":1,"12":1}}],["функциональности",{"2":{"7":3,"25":1}}],["функционала",{"2":{"41":2,"52":1}}],["функциях",{"2":{"44":1}}],["функциями",{"2":{"42":1}}],["функция",{"2":{"11":1,"18":1,"41":1,"42":1,"45":1,"46":1}}],["функцией",{"2":{"11":1,"18":1}}],["функцию",{"2":{"8":1,"18":1,"36":1,"42":1,"46":1}}],["функций",{"2":{"7":2,"11":1,"42":3}}],["функции",{"0":{"24":1},"2":{"3":2,"7":1,"8":1,"11":6,"22":1,"25":1,"29":1,"42":6,"44":1}}],["фулстек",{"2":{"5":1,"39":1}}],["фулстеков",{"2":{"5":1}}],["фрагмента",{"2":{"8":1}}],["фреймворку",{"2":{"15":1}}],["фреймворке",{"2":{"7":1,"41":1,"44":1}}],["фреймворком",{"2":{"6":1,"10":1,"12":1,"25":1,"27":2,"41":1}}],["фреймворков",{"2":{"6":1,"7":2,"26":1,"44":1}}],["фреймворки",{"2":{"6":1,"7":2,"9":1,"19":1,"44":2}}],["фреймворк",{"0":{"6":1,"7":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1},"2":{"6":1,"7":6,"8":1,"9":1,"18":2,"19":1,"29":1,"42":1}}],["фреймворках",{"0":{"44":1},"2":{"60":1}}],["фреймворка",{"2":{"4":1,"6":1,"7":3,"8":1,"41":2}}],["фронтенда",{"2":{"42":3}}],["фронтенде",{"2":{"42":2,"43":1,"44":2,"45":1,"53":1}}],["фронтендеру",{"2":{"31":1}}],["фронтендера",{"0":{"3":1}}],["фронтендом",{"2":{"4":1}}],["фронтенд",{"0":{"44":1},"2":{"3":1,"34":1,"39":1,"43":1,"44":1,"45":1,"54":1,"57":1,"60":2}}],["фронте",{"2":{"2":3,"5":2,"43":2,"44":1,"45":2,"53":1}}],["фронту",{"2":{"2":1,"3":1}}],["фронт",{"2":{"2":3,"3":2,"39":1}}],["фронта",{"2":{"2":1,"3":1,"44":1}}],["фронтэнде",{"2":{"44":1}}],["фронтэндер",{"2":{"3":1}}],["фронтэнд",{"0":{"45":1},"1":{"46":1,"47":1,"48":1,"49":1,"50":1,"51":1},"2":{"2":1,"3":1,"5":1,"75":1}}],["ей",{"2":{"52":1}}],["единый",{"2":{"52":1}}],["единственный",{"2":{"11":2}}],["единое",{"2":{"9":1}}],["еще",{"0":{"30":1},"2":{"7":1,"9":1,"18":1,"19":1,"26":1,"39":4,"41":1,"44":1,"53":1,"54":2}}],["ее",{"2":{"7":1,"8":1,"10":2,"11":2,"13":1,"45":1}}],["еvent",{"2":{"5":1}}],["ему",{"2":{"2":1,"31":1,"42":1,"54":1}}],["естественно",{"2":{"33":1,"42":1}}],["есть",{"2":{"2":3,"3":4,"6":1,"7":4,"10":2,"11":3,"19":1,"27":1,"33":3,"37":1,"39":1,"40":2,"42":3,"44":3,"45":2,"46":1,"52":1,"53":6,"54":3}}],["если",{"2":{"2":5,"3":2,"4":5,"6":1,"7":1,"9":1,"10":4,"11":2,"13":2,"15":2,"16":1,"19":1,"25":1,"27":2,"33":1,"34":1,"35":2,"37":1,"38":3,"39":1,"41":1,"42":5,"46":2,"47":1,"49":1,"52":1,"53":4,"54":2}}],["её",{"2":{"2":2,"35":1,"44":2,"46":2}}],["его",{"2":{"2":9,"3":2,"4":1,"7":2,"8":2,"10":1,"11":5,"14":2,"18":1,"19":1,"20":1,"33":1,"38":1,"39":2,"42":1,"44":1,"45":3,"51":1,"52":1,"53":1,"54":7,"74":2}}],["jest",{"2":{"39":20,"43":1}}],["jenkins",{"2":{"31":1,"39":4}}],["j",{"2":{"38":1}}],["jpg",{"2":{"37":1}}],["jpeg",{"2":{"34":1}}],["jasmine",{"2":{"39":20}}],["jamesives",{"2":{"33":4}}],["java",{"2":{"6":1,"11":1,"39":2}}],["javascript",{"0":{"68":1},"2":{"3":1,"6":3,"7":2,"8":3,"9":4,"10":6,"11":4,"13":1,"15":1,"16":1,"17":2,"18":2,"25":1,"35":1,"38":2,"39":4,"40":1,"41":2,"42":2,"44":1,"45":1,"52":3,"53":6,"54":4,"68":1}}],["jobs",{"2":{"33":4}}],["jwt",{"2":{"2":4,"74":2}}],["jslint",{"2":{"39":4}}],["jsconfig",{"2":{"39":22}}],["jsconst",{"2":{"33":1,"37":1,"41":1}}],["jsx",{"2":{"39":6}}],["json5",{"2":{"39":2}}],["jsonc",{"2":{"39":2}}],["jsonplaceholder",{"2":{"3":1}}],["json",{"2":{"1":1,"3":1,"5":8,"33":7,"35":1,"37":7,"38":5,"39":96,"53":1,"54":2}}],["jsimport",{"2":{"1":3,"35":1,"38":1}}],["js",{"0":{"29":1,"37":1},"2":{"1":4,"3":3,"9":2,"11":1,"34":1,"35":4,"37":1,"38":5,"39":39,"40":2,"42":1,"44":3,"45":1,"53":3,"54":1}}],["рисуйте",{"2":{"51":1}}],["рисунок",{"2":{"9":1}}],["русском",{"2":{"53":2}}],["рутинного",{"2":{"44":1}}],["рука",{"2":{"39":1}}],["руководству",{"2":{"7":1}}],["рублей",{"2":{"34":1}}],["ручном",{"2":{"33":1,"39":1}}],["ряд",{"2":{"11":2}}],["ряда",{"2":{"9":1}}],["родился",{"2":{"54":1}}],["родительскому",{"2":{"11":1}}],["родительского",{"2":{"10":1,"11":1}}],["роста",{"2":{"11":1,"48":1}}],["роли",{"2":{"44":1}}],["роль",{"2":{"42":1,"44":1,"53":1}}],["ролью",{"2":{"2":1}}],["ролям",{"2":{"2":1}}],["рывка",{"2":{"7":1}}],["резюме",{"2":{"53":1}}],["результирующее",{"2":{"7":1}}],["результат",{"2":{"3":1,"11":1}}],["рефакторинг",{"0":{"48":1},"2":{"48":1}}],["регулярный",{"0":{"48":1}}],["регистрирует",{"2":{"44":1}}],["регистра",{"2":{"23":1}}],["регистре",{"2":{"21":1,"22":1}}],["рекламных",{"2":{"46":1}}],["рекомендует",{"2":{"39":1}}],["рекомендуется",{"2":{"34":1,"38":1}}],["рекомендаций",{"2":{"20":1}}],["реконнект",{"2":{"5":1}}],["редактор",{"2":{"39":1}}],["редакторе",{"2":{"39":1}}],["редко",{"2":{"2":1}}],["режиме",{"2":{"33":1,"39":2,"42":1,"43":1}}],["режима",{"2":{"4":1}}],["репозиторий",{"2":{"39":1}}],["репозитория",{"2":{"33":4}}],["репозитории",{"2":{"31":1}}],["рендерингу",{"2":{"19":1}}],["рендеринге",{"2":{"13":1}}],["реактивная",{"2":{"11":1,"13":2,"41":1,"44":1}}],["реактивный",{"2":{"42":2,"44":2}}],["реактивных",{"2":{"11":1,"41":1,"44":1}}],["реактивным",{"2":{"11":2}}],["реактивными",{"2":{"11":1}}],["реактивные",{"2":{"8":1,"11":2,"22":1,"42":3,"44":2}}],["реактивной",{"2":{"11":1,"13":1}}],["реактивном",{"2":{"7":2,"44":1}}],["реактивностью",{"2":{"44":2}}],["реактивность",{"2":{"7":1,"44":2}}],["реактивности",{"2":{"6":1,"44":2}}],["реактивную",{"2":{"6":1,"11":2,"42":1,"44":1}}],["реально",{"2":{"46":1}}],["реальный",{"2":{"53":1}}],["реальные",{"2":{"43":1}}],["реальным",{"2":{"26":1}}],["реальными",{"2":{"3":1}}],["реальных",{"2":{"7":1}}],["реализацию",{"2":{"46":1}}],["реализация",{"2":{"41":1}}],["реализации",{"2":{"5":1,"19":1,"26":1,"41":2,"51":1}}],["реализованы",{"2":{"6":1,"7":1}}],["решили",{"2":{"45":3}}],["решить",{"2":{"33":1,"35":1}}],["решений",{"2":{"33":1,"54":1}}],["решения",{"2":{"19":1,"54":1}}],["решением",{"2":{"3":1,"39":1}}],["решение",{"2":{"3":1,"4":2,"5":1,"7":1,"44":1,"53":1}}],["решётки",{"2":{"8":1}}],["решали",{"2":{"6":1}}],["решает",{"2":{"2":1,"7":1,"42":1}}],["релевантные",{"2":{"3":1}}],["ресурсы",{"0":{"35":1},"1":{"36":1,"37":1},"2":{"35":4,"38":1,"45":1,"53":1}}],["ресурса",{"2":{"35":1}}],["ресурсах",{"2":{"29":1}}],["ресурсами",{"2":{"3":1,"35":1,"54":2}}],["ресурсам",{"2":{"2":1,"35":1}}],["ресурсов",{"2":{"4":2,"35":1,"54":1}}],["ресурсу",{"2":{"2":1,"4":2}}],["ресурс",{"2":{"2":2,"4":2,"53":1}}],["рано",{"2":{"46":1}}],["раньше",{"2":{"39":1}}],["ранее",{"2":{"10":1,"33":1}}],["равна",{"2":{"14":1}}],["равно",{"2":{"11":1,"14":1,"53":1}}],["рабочий",{"2":{"9":1,"29":1,"31":2}}],["рабочего",{"2":{"8":1,"9":1,"10":1,"11":1,"29":1}}],["работу",{"2":{"43":1}}],["работе",{"2":{"19":1,"27":1,"39":2,"44":2}}],["работали",{"2":{"11":1}}],["работают",{"2":{"3":1,"10":1,"42":1}}],["работать",{"2":{"3":1,"5":1,"7":1,"9":1,"19":1,"39":2,"42":1,"54":1}}],["работает",{"2":{"2":2,"39":1,"41":3,"44":1,"46":1,"53":1,"54":2}}],["работы",{"2":{"2":1,"3":1,"4":1,"7":1,"10":1,"18":1,"26":1,"27":1,"35":1,"40":1,"54":2,"74":3}}],["рамками",{"2":{"10":1}}],["рамках",{"2":{"7":1,"12":1}}],["рамки",{"2":{"6":1,"7":1}}],["расшаривать",{"2":{"42":1}}],["расширить",{"2":{"53":1}}],["расширяемость",{"2":{"52":1}}],["расширять",{"2":{"7":1,"38":1}}],["расширении",{"2":{"44":1}}],["расширений",{"2":{"39":1}}],["расширением",{"2":{"10":1}}],["расширения",{"2":{"4":1,"39":2}}],["располагались",{"2":{"52":1}}],["расползлись",{"2":{"42":1}}],["располнела",{"2":{"41":1}}],["распределение",{"2":{"54":1}}],["распределяются",{"2":{"2":1}}],["распространяющихся",{"2":{"10":1}}],["распространены",{"2":{"53":1}}],["распространенного",{"2":{"52":1}}],["распространенность",{"2":{"44":1}}],["распространенные",{"2":{"44":1}}],["распространенными",{"2":{"6":1}}],["распространенный",{"2":{"2":1}}],["распространения",{"2":{"8":1}}],["раскрывает",{"2":{"8":1}}],["рассказано",{"2":{"17":1}}],["рассказать",{"2":{"7":1}}],["рассмотрен",{"2":{"29":1}}],["рассмотрим",{"2":{"6":1,"7":1,"8":1,"10":2,"11":1,"12":1,"17":1,"19":2,"29":1}}],["рассматривает",{"2":{"54":1}}],["рассматривать",{"2":{"9":1,"11":1}}],["рассматриваться",{"2":{"8":1}}],["рассматриваются",{"2":{"6":1}}],["раздаются",{"2":{"54":1}}],["разделять",{"2":{"42":1}}],["разделах",{"2":{"10":1,"60":1}}],["раздела",{"2":{"10":1}}],["разделив",{"2":{"7":1}}],["разделение",{"2":{"52":1}}],["разделения",{"2":{"10":1}}],["разделенных",{"2":{"4":1}}],["разделе",{"2":{"4":1,"8":1,"18":1}}],["разделы",{"2":{"2":1}}],["разбираться",{"2":{"54":1}}],["разбивается",{"2":{"45":1}}],["разбиения",{"2":{"44":2}}],["раза",{"2":{"42":1}}],["развитие",{"0":{"73":1}}],["развития",{"2":{"6":1}}],["развивается",{"2":{"44":1}}],["развертывания",{"2":{"31":1,"33":1}}],["развертывание",{"2":{"29":1}}],["развертыванием",{"2":{"29":1,"33":1}}],["размонтировании",{"2":{"19":1}}],["разместить",{"2":{"34":3}}],["разместим",{"2":{"10":1}}],["размер",{"2":{"11":1,"35":2,"46":1}}],["размера",{"2":{"7":3,"35":1}}],["размещено",{"2":{"8":1}}],["размещения",{"2":{"3":1,"8":1,"34":1,"54":1}}],["разметки",{"2":{"6":1}}],["различающихся",{"2":{"42":1}}],["различный",{"2":{"10":1}}],["различные",{"2":{"6":2}}],["различных",{"2":{"6":1,"53":1}}],["различными",{"2":{"3":1,"29":1,"44":1}}],["различие",{"2":{"6":1,"7":1}}],["разряда",{"2":{"49":1}}],["разрабатываешь",{"2":{"45":1}}],["разрабатываемого",{"2":{"31":1}}],["разрабатывать",{"2":{"44":1,"45":1,"54":1}}],["разработка",{"2":{"43":1,"60":1,"62":1,"63":1}}],["разработкой",{"2":{"43":1}}],["разработку",{"2":{"7":1,"44":1,"52":2}}],["разработки",{"2":{"7":2,"11":1,"34":1,"39":3,"43":1,"44":1,"45":1}}],["разработке",{"2":{"4":1,"27":1,"39":1,"54":1}}],["разработан",{"2":{"7":1}}],["разработчиком",{"2":{"53":1}}],["разработчиков",{"2":{"20":1,"43":1,"53":1,"75":1}}],["разработчики",{"2":{"52":2}}],["разработчику",{"2":{"52":1,"53":1}}],["разработчика",{"2":{"8":1,"42":2,"51":1,"53":1,"74":1}}],["разработчик",{"2":{"3":1,"7":1,"42":1}}],["разрешили",{"2":{"54":1}}],["разрешает",{"2":{"4":1}}],["разрешать",{"2":{"2":1}}],["разрешен",{"2":{"4":3}}],["разрешений",{"2":{"45":1}}],["разрешения",{"2":{"2":1}}],["разрешение",{"2":{"2":2}}],["разному",{"2":{"54":1}}],["разного",{"2":{"44":1}}],["разницей",{"2":{"15":1}}],["разница",{"2":{"7":1,"27":1,"53":1}}],["разницы",{"2":{"2":1}}],["разных",{"2":{"4":1,"42":1,"45":1,"60":1}}],["разный",{"2":{"2":1}}],["разные",{"0":{"11":1},"2":{"2":1,"38":1,"45":1,"54":1}}],["раз",{"2":{"2":3,"7":1,"11":1,"13":1,"38":2,"42":1,"54":1}}],["sw",{"2":{"54":1,"74":1}}],["swagger",{"2":{"53":1}}],["svelte",{"2":{"39":6,"44":3}}],["svgo",{"2":{"39":20}}],["svgresources",{"2":{"37":8}}],["svg",{"2":{"36":4,"37":3,"38":1,"39":4}}],["synctex",{"2":{"39":2}}],["sass",{"2":{"39":2}}],["save",{"2":{"39":2}}],["smoothscrolling",{"2":{"39":2}}],["sftp",{"2":{"39":1}}],["sfc",{"2":{"10":3,"18":1,"19":1,"39":2,"44":1}}],["s3",{"2":{"34":1}}],["s",{"2":{"33":2,"35":1,"38":1,"42":1}}],["solvery",{"2":{"53":1}}],["somearr",{"2":{"44":8}}],["someimage",{"2":{"35":2}}],["somefunc",{"2":{"3":1}}],["social",{"2":{"35":1}}],["source",{"2":{"33":2,"39":6}}],["snickerbockers",{"2":{"33":3}}],["snake",{"2":{"22":1}}],["ssg",{"0":{"54":1},"2":{"54":3}}],["ssd",{"2":{"39":1}}],["ssr",{"0":{"54":1},"2":{"39":2,"42":2,"54":9}}],["ss06",{"2":{"39":2}}],["ss03",{"2":{"39":2}}],["ss02",{"2":{"39":2}}],["ss01",{"2":{"39":2}}],["ssl",{"2":{"34":2}}],["ssh",{"2":{"33":23,"39":2}}],["sso",{"2":{"2":2}}],["store",{"2":{"42":2}}],["story",{"2":{"39":2}}],["sticky",{"2":{"39":2}}],["stickyscroll",{"2":{"39":2}}],["staged",{"2":{"39":4}}],["staging",{"2":{"33":6}}],["stackblitz",{"2":{"39":5}}],["stateful",{"2":{"42":1}}],["state",{"0":{"42":1},"2":{"39":2,"42":5}}],["static",{"2":{"35":2,"54":1}}],["stash",{"2":{"39":6}}],["stringhelpers",{"2":{"45":1}}],["string",{"2":{"35":2,"36":12}}],["steps",{"2":{"33":4}}],["stylelint",{"2":{"39":8}}],["styleci",{"2":{"39":4}}],["style=",{"2":{"36":4}}],["style",{"2":{"10":5,"36":4,"39":1,"53":2}}],["sponsors",{"2":{"39":2}}],["spec",{"2":{"39":2}}],["special",{"2":{"19":1}}],["span",{"2":{"16":5}}],["spa",{"0":{"54":1},"2":{"2":1,"54":10}}],["sum",{"2":{"39":4}}],["suggestselection",{"2":{"39":2}}],["substring",{"2":{"37":4}}],["submodules",{"2":{"33":6}}],["sudo",{"2":{"33":6}}],["suspense",{"2":{"19":1}}],["supabase",{"2":{"3":2,"53":1}}],["sheet",{"0":{"66":1},"1":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"67":1,"68":1,"69":1,"70":4}}],["shell",{"2":{"39":2,"45":1}}],["shims",{"2":{"39":2}}],["sh",{"2":{"39":4}}],["shrinkwrap",{"2":{"39":4}}],["shnpx",{"2":{"38":1}}],["shpnpm",{"2":{"38":1}}],["showdocumentation",{"2":{"39":2}}],["showsuggestionsassnippets",{"2":{"39":2}}],["show=",{"2":{"14":2}}],["show",{"0":{"14":1},"2":{"14":1,"15":3,"19":1}}],["shallowref",{"2":{"41":2}}],["shaking",{"2":{"37":2,"46":1}}],["sha",{"2":{"7":1}}],["sharing",{"2":{"4":1}}],["src",{"2":{"13":1,"35":1,"38":4}}],["src=",{"2":{"8":2,"13":2,"35":6,"36":2}}],["scmitem",{"2":{"39":2}}],["scmgroupinline",{"2":{"39":2}}],["scmgroup",{"2":{"39":2}}],["scm",{"2":{"39":4}}],["scss",{"2":{"36":2,"39":2}}],["scoped",{"2":{"10":4,"36":2}}],["scripts",{"2":{"33":2}}],["script",{"0":{"11":1},"2":{"8":10,"10":5,"11":15,"19":4,"33":4,"36":4,"39":1,"41":1}}],["sql",{"2":{"5":1,"33":2,"39":1,"42":2,"53":1}}],["side",{"2":{"54":1}}],["simple",{"2":{"39":8}}],["simpledialog",{"2":{"39":2}}],["size",{"2":{"36":10}}],["size=",{"2":{"35":2}}],["site",{"2":{"4":4,"33":25,"54":1}}],["sign",{"2":{"2":1}}],["singlequote",{"2":{"39":2}}],["singleclick",{"2":{"39":2}}],["single",{"2":{"2":1,"54":1}}],["seo",{"0":{"54":1},"2":{"54":1}}],["section",{"2":{"50":1}}],["security",{"2":{"39":2}}],["secrets",{"2":{"33":3}}],["sentry",{"2":{"39":4}}],["semi",{"2":{"39":2}}],["search",{"2":{"39":2}}],["separate",{"2":{"39":2}}],["select",{"2":{"17":1,"52":2}}],["server",{"2":{"4":4,"33":5,"39":10,"54":1}}],["service",{"2":{"3":1,"25":1,"39":2,"54":3,"74":1}}],["services",{"2":{"1":2}}],["setsomearr",{"2":{"44":2}}],["setitem",{"2":{"33":2}}],["setting",{"2":{"33":2,"39":1}}],["settings",{"2":{"33":1,"39":1}}],["settokencallback",{"2":{"1":2}}],["setup",{"0":{"11":1},"2":{"10":3,"11":8,"19":2,"33":7,"36":2,"39":1,"41":1}}],["setlogoutcallback",{"2":{"1":2}}],["set",{"2":{"1":2,"37":4}}],["setbaseurl",{"2":{"1":2}}],["пытаться",{"2":{"45":1}}],["пытаются",{"2":{"45":1}}],["пытается",{"2":{"39":1}}],["п",{"2":{"43":1,"45":1,"74":1}}],["пк",{"2":{"39":2}}],["песочницы",{"2":{"39":1}}],["песочнице",{"2":{"38":1}}],["пет",{"2":{"33":1}}],["первых",{"2":{"53":1,"75":1}}],["первый",{"2":{"11":1}}],["первой",{"2":{"53":1,"54":1}}],["первоначальном",{"2":{"13":1}}],["первого",{"2":{"8":1}}],["первоклассные",{"2":{"6":1}}],["первом",{"2":{"2":2,"54":1}}],["переименовывая",{"2":{"48":1}}],["переименовываются",{"2":{"35":1}}],["перемещая",{"2":{"48":1}}],["переменным",{"2":{"11":2}}],["переменными",{"2":{"11":1}}],["переменные",{"0":{"21":1},"2":{"8":1,"10":1,"11":4,"42":1,"44":2}}],["переменных",{"2":{"7":1,"11":1,"19":1,"41":1}}],["переменной",{"2":{"7":2,"8":1,"11":3,"13":2,"17":2,"19":2,"41":2,"42":1,"44":2}}],["переменная",{"2":{"7":2,"8":1,"11":1,"13":3,"14":2,"44":2}}],["переменную",{"2":{"7":1,"11":2,"14":1,"18":1,"42":2,"44":1}}],["переписывание",{"2":{"43":1}}],["переписываете",{"2":{"42":1}}],["пересылает",{"2":{"54":1}}],["пересылаемый",{"2":{"2":1}}],["перестанет",{"2":{"46":1}}],["перестает",{"2":{"42":1}}],["пересчитали",{"2":{"44":1}}],["перезагрузку",{"2":{"33":1}}],["переведена",{"0":{"30":1}}],["перевести",{"2":{"5":1}}],["переносится",{"2":{"39":1}}],["переносить",{"2":{"19":1}}],["переносе",{"2":{"6":1}}],["переключаться",{"2":{"15":1}}],["перекрестного",{"2":{"4":1}}],["перерасти",{"2":{"7":1}}],["передавать",{"2":{"44":1}}],["передавая",{"2":{"8":1}}],["переданным",{"2":{"15":1}}],["передачи",{"2":{"11":1}}],["передать",{"2":{"10":1,"42":2}}],["передаем",{"2":{"8":1}}],["передаёт",{"2":{"2":1}}],["перед",{"2":{"7":2,"11":1,"35":1,"53":1}}],["переходов",{"2":{"19":1}}],["перехода",{"2":{"19":1,"31":1}}],["переход",{"2":{"5":1,"47":1}}],["перелогиниваться",{"2":{"2":1}}],["перелогин",{"2":{"2":1}}],["пять",{"2":{"16":1}}],["пишет",{"2":{"54":1}}],["пишем",{"2":{"10":1}}],["пишутся",{"2":{"21":1,"24":1}}],["писать",{"2":{"11":1,"25":1,"42":1,"44":1}}],["памяти",{"2":{"39":1}}],["папке",{"2":{"35":1}}],["папки",{"2":{"35":2}}],["папку",{"2":{"35":3}}],["пабло",{"2":{"29":1}}],["паттерн",{"2":{"41":1}}],["паттернов",{"2":{"26":1}}],["паттерны",{"2":{"6":2,"29":2,"52":1}}],["пакетов",{"2":{"39":1}}],["пакетами",{"2":{"38":1}}],["пакета",{"2":{"11":1,"40":1}}],["пакет",{"2":{"9":1,"39":1,"46":1}}],["пару",{"2":{"39":1,"41":1,"49":1}}],["параграфы",{"2":{"53":1}}],["параметрами",{"2":{"33":1}}],["параметры",{"2":{"11":2}}],["парадигму",{"2":{"6":1}}],["парадигмы",{"2":{"6":2}}],["пароль",{"2":{"2":1,"42":1}}],["паутина",{"2":{"6":1}}],["пусть",{"2":{"45":1,"49":1}}],["пуша",{"2":{"33":1}}],["публикации",{"2":{"29":1}}],["путях",{"2":{"38":1}}],["путь",{"0":{"9":2},"2":{"10":1,"26":1}}],["путем",{"2":{"4":1}}],["пупкина",{"2":{"2":1}}],["пупкин",{"2":{"2":1}}],["плевел",{"2":{"53":1}}],["плохие",{"2":{"52":1}}],["плохо",{"2":{"52":1}}],["плохой",{"2":{"41":1}}],["плохая",{"2":{"42":2}}],["платежей",{"2":{"45":1}}],["платить",{"2":{"11":1}}],["плане",{"2":{"41":1,"42":1,"52":1}}],["планами",{"2":{"34":1}}],["планы",{"2":{"3":2}}],["плагина",{"2":{"54":1}}],["плагинами",{"2":{"38":1}}],["плагины",{"2":{"6":1,"38":1,"42":1}}],["плагинов",{"2":{"6":1,"10":1,"38":1,"39":1}}],["плюсы",{"2":{"52":2}}],["плюс",{"2":{"2":1,"11":1,"33":1,"42":1}}],["покупателей",{"2":{"54":1}}],["показ",{"2":{"45":1}}],["показывали",{"2":{"53":1,"54":1}}],["показывать",{"2":{"44":1,"54":1}}],["показываться",{"2":{"15":1}}],["показывания",{"2":{"33":1}}],["показывают",{"2":{"15":1}}],["показывая",{"2":{"15":1}}],["показывает",{"2":{"14":1}}],["показа",{"2":{"15":2,"35":1}}],["показано",{"2":{"11":1}}],["показаться",{"2":{"10":3}}],["пока",{"2":{"6":1,"7":1,"10":1,"19":2}}],["поисковых",{"2":{"54":1}}],["поисковиков",{"2":{"54":1}}],["поисковик",{"2":{"54":1}}],["поисковиками",{"2":{"54":1}}],["поискать",{"2":{"37":1}}],["поиграйте",{"2":{"53":1}}],["поизучайте",{"2":{"53":1}}],["поэкспериментируйте",{"2":{"53":1}}],["поэтому",{"2":{"7":1,"8":1,"9":1,"11":2,"19":2,"25":1,"26":1,"39":2,"41":1,"42":1,"44":1,"45":1,"54":1}}],["почти",{"2":{"53":1}}],["почему",{"2":{"5":1,"27":2,"44":1,"52":1,"53":1}}],["похудеет",{"2":{"41":1}}],["похожи",{"2":{"15":1}}],["похакать",{"2":{"3":1}}],["повышение",{"2":{"75":1}}],["повышает",{"2":{"45":1}}],["повышается",{"2":{"45":1,"54":1}}],["повысит",{"2":{"51":1}}],["повысить",{"2":{"29":1,"45":1}}],["повторяющегося",{"2":{"44":1}}],["повторно",{"2":{"11":1}}],["повторного",{"2":{"11":1}}],["поверх",{"2":{"7":2}}],["поведение",{"2":{"6":1,"12":1,"44":1}}],["поведением",{"2":{"6":1}}],["поговорим",{"2":{"10":1}}],["помещаться",{"2":{"35":1}}],["помещаются",{"2":{"35":1}}],["поместить",{"2":{"45":1}}],["поместит",{"2":{"10":1}}],["помнить",{"2":{"9":1,"10":1,"42":1}}],["поможет",{"2":{"53":1}}],["помогает",{"2":{"19":1,"53":1}}],["помогают",{"2":{"9":1,"52":1,"53":1}}],["помогающая",{"2":{"7":1}}],["помогут",{"2":{"6":1,"20":1}}],["помочь",{"2":{"4":1,"27":1,"53":1}}],["помощью",{"2":{"3":1,"10":2,"11":1,"18":2,"19":1,"29":3,"34":1,"39":1,"42":1}}],["поймать",{"2":{"41":1}}],["поймем",{"2":{"7":1}}],["пойдет",{"2":{"3":1}}],["потратьте",{"2":{"39":1,"49":1}}],["потребует",{"2":{"7":1}}],["потери",{"2":{"37":1}}],["потерять",{"2":{"2":1}}],["потом",{"2":{"42":2,"54":2}}],["потомок",{"2":{"42":1}}],["потомком",{"2":{"42":1}}],["потому",{"2":{"33":1,"42":1,"54":1}}],["потоке",{"2":{"44":1}}],["потоком",{"2":{"10":1,"11":1,"29":2,"44":1}}],["поток",{"2":{"7":1,"41":1}}],["поздно",{"2":{"46":1}}],["позаботится",{"2":{"11":1}}],["позже",{"2":{"8":1,"19":1,"54":1}}],["позволяют",{"2":{"34":1,"38":1}}],["позволяющие",{"2":{"6":1}}],["позволяющий",{"2":{"4":1}}],["позволяя",{"2":{"31":1}}],["позволяет",{"2":{"7":1,"10":1,"19":1,"33":1,"39":1,"42":1,"44":2,"45":2,"54":2}}],["познакомимся",{"2":{"6":1,"29":1}}],["появляются",{"2":{"39":1}}],["появления",{"2":{"54":1}}],["появлению",{"2":{"11":1}}],["появлением",{"2":{"6":1}}],["появятся",{"2":{"19":1}}],["появилась",{"2":{"44":1}}],["появился",{"2":{"42":1,"54":1}}],["появилось",{"2":{"41":1,"42":1}}],["появились",{"2":{"6":1,"42":1}}],["появится",{"2":{"4":1,"14":1}}],["попробуйте",{"2":{"37":1,"39":1,"53":2}}],["попробует",{"2":{"37":1}}],["попутно",{"2":{"6":1}}],["популярна",{"2":{"41":1}}],["популярности",{"2":{"39":1}}],["популярность",{"2":{"25":1}}],["популярным",{"2":{"54":1}}],["популярные",{"2":{"38":1}}],["популярных",{"2":{"6":1}}],["популярный",{"2":{"3":1,"33":1}}],["популяризация",{"2":{"5":2}}],["попытка",{"2":{"5":1}}],["поработайте",{"2":{"53":2}}],["порой",{"2":{"53":1}}],["порог",{"2":{"44":1}}],["порождает",{"2":{"9":1}}],["порекомендовать",{"2":{"25":1}}],["порядки",{"2":{"54":1}}],["порядке",{"2":{"9":1}}],["порядка",{"2":{"9":1}}],["порядок",{"2":{"5":1}}],["пор",{"2":{"7":1,"9":1,"18":1,"19":1}}],["портом",{"2":{"4":1}}],["портал",{"2":{"2":1}}],["посмотрите",{"2":{"39":1,"53":1}}],["посмотреть",{"2":{"7":1,"38":1,"39":1,"53":1,"54":1}}],["поскольку",{"2":{"7":1,"8":1,"11":1,"19":1,"20":1}}],["последовательной",{"2":{"25":1}}],["последние",{"2":{"41":1}}],["последних",{"2":{"33":1}}],["последней",{"2":{"10":1}}],["последняя",{"2":{"6":1}}],["после",{"2":{"5":1,"15":1,"18":1,"31":1,"33":2,"34":1,"42":1,"54":3}}],["посылать",{"2":{"5":1}}],["посредником",{"2":{"4":1}}],["построения",{"2":{"7":3}}],["построен",{"2":{"7":1,"9":1}}],["построенные",{"2":{"7":1,"42":1}}],["построены",{"2":{"7":1}}],["построить",{"2":{"7":1}}],["постепенно",{"2":{"6":1,"7":1}}],["поставщиков",{"2":{"5":1}}],["поставив",{"2":{"3":1}}],["поставить",{"2":{"3":1,"39":1}}],["постоянным",{"2":{"2":1}}],["поняв",{"2":{"19":1}}],["понятную",{"2":{"52":1}}],["понятные",{"2":{"38":1}}],["понятным",{"2":{"5":1}}],["понять",{"2":{"20":1,"42":1,"53":1}}],["понятий",{"2":{"9":1}}],["понятиями",{"2":{"29":1}}],["понятия",{"2":{"7":1,"9":1,"26":1,"45":1}}],["понятии",{"2":{"7":1}}],["понятие",{"2":{"2":1,"8":1,"44":1}}],["поначалу",{"2":{"10":1}}],["понадобится",{"2":{"8":1,"38":1}}],["понимаются",{"2":{"35":1}}],["понимание",{"0":{"10":1},"2":{"53":1}}],["понимать",{"2":{"2":1,"7":1,"53":1}}],["подгружается",{"2":{"54":1}}],["подготовки",{"2":{"53":1}}],["подготовлены",{"2":{"19":1}}],["подарила",{"2":{"54":1}}],["подскажите",{"0":{"40":1}}],["подсоединение",{"2":{"39":1}}],["поделился",{"2":{"39":1}}],["подключать",{"2":{"35":1,"42":1,"46":2}}],["подключаются",{"2":{"35":1}}],["подключить",{"2":{"34":1}}],["под",{"2":{"35":1,"43":1,"44":1}}],["поддается",{"2":{"54":1}}],["поддержка",{"2":{"42":2}}],["поддержки",{"2":{"41":2,"53":1}}],["поддержкой",{"2":{"38":1}}],["поддерживаемость",{"2":{"52":1}}],["поддерживается",{"2":{"10":1,"11":2,"37":1}}],["поддерживать",{"2":{"45":1}}],["поддерживаться",{"2":{"42":1,"46":1}}],["поддерживая",{"2":{"17":1}}],["поддиректории",{"2":{"35":1}}],["поддиректориями",{"2":{"33":1}}],["поддомены",{"2":{"34":1}}],["подведение",{"0":{"26":1}}],["подчеркивания",{"2":{"21":1}}],["подчеркивает",{"2":{"7":1}}],["подразумевается",{"2":{"54":1}}],["подразумевает",{"2":{"7":1}}],["подробно",{"2":{"10":2,"11":1,"29":1,"35":1}}],["подробная",{"2":{"4":1}}],["подробнее",{"2":{"2":1,"17":1,"38":1}}],["подход",{"2":{"52":1,"54":1}}],["подходящая",{"2":{"45":1}}],["подходящем",{"2":{"3":1}}],["подходят",{"2":{"42":1}}],["подходит",{"2":{"39":1,"44":1,"45":1,"54":2}}],["подходы",{"2":{"11":1,"44":1}}],["подходу",{"2":{"7":1}}],["подходов",{"2":{"7":1}}],["подхода",{"2":{"7":1,"11":1}}],["подобранных",{"2":{"39":1}}],["подобные",{"2":{"54":1}}],["подобный",{"2":{"3":1,"4":1,"52":1}}],["подобно",{"2":{"16":1}}],["подобном",{"2":{"11":1}}],["подождите",{"2":{"11":1}}],["подозрительные",{"2":{"2":1}}],["подписывания",{"2":{"2":1}}],["полиморфизмом",{"2":{"45":1}}],["полтора",{"2":{"42":1}}],["пользоваться",{"2":{"42":1,"44":1,"52":1}}],["пользователем",{"2":{"44":1,"45":1}}],["пользователей",{"2":{"6":1,"43":1,"45":1,"54":2}}],["пользователю",{"2":{"2":1,"33":1,"44":1}}],["пользователи",{"2":{"2":1}}],["пользователям",{"2":{"2":1}}],["пользователя",{"2":{"2":7,"29":1,"33":1,"45":1,"54":3,"74":1}}],["пользовательский",{"2":{"54":1}}],["пользовательских",{"2":{"7":2}}],["пользовательского",{"2":{"10":2,"17":1,"29":1}}],["пользователь",{"2":{"2":6,"17":1,"19":1,"41":1,"42":1,"44":2}}],["пользуется",{"2":{"42":1}}],["положить",{"2":{"35":1}}],["полный",{"2":{"18":1,"42":1}}],["полностью",{"2":{"7":1,"11":1,"15":1}}],["полноценное",{"2":{"3":1}}],["полноценной",{"2":{"3":1}}],["полно",{"2":{"3":1,"52":1}}],["полезен",{"2":{"53":1,"54":1}}],["полезно",{"2":{"48":1}}],["полезность",{"2":{"43":1}}],["полезного",{"2":{"39":1}}],["полезной",{"2":{"33":1}}],["полезные",{"0":{"41":1},"2":{"39":1,"45":1,"53":1,"63":1}}],["полезных",{"2":{"39":1}}],["полезны",{"2":{"31":1,"43":1,"54":1}}],["поле",{"2":{"11":2,"16":1,"42":1,"44":1}}],["полей",{"2":{"8":1}}],["полями",{"2":{"10":1,"11":1}}],["поля",{"2":{"8":1,"11":3,"44":1}}],["получения",{"2":{"11":1}}],["получении",{"2":{"2":1}}],["получится",{"2":{"53":1}}],["получит",{"2":{"13":1}}],["получить",{"2":{"2":1,"11":3,"31":1,"34":1,"54":1}}],["получил",{"2":{"11":1}}],["получать",{"2":{"3":1,"53":1,"54":1}}],["получаете",{"2":{"34":1}}],["получается",{"2":{"11":1,"33":1,"35":1,"41":1,"45":1,"54":3}}],["получает",{"2":{"2":1,"4":1,"54":1}}],["по",{"2":{"2":4,"3":3,"4":3,"6":4,"7":3,"8":1,"9":1,"11":3,"16":1,"18":1,"26":2,"33":2,"34":1,"35":4,"36":1,"38":2,"39":2,"41":2,"42":5,"43":1,"45":2,"51":1,"52":1,"53":7,"54":8,"75":1}}],["прямым",{"2":{"42":1}}],["прямо",{"2":{"39":1}}],["пр",{"2":{"38":1}}],["прекрасный",{"2":{"53":1}}],["презентационный",{"2":{"52":1}}],["претенциозной",{"2":{"41":1}}],["претерпела",{"2":{"6":1}}],["префикс",{"2":{"13":1}}],["превзойти",{"2":{"11":1}}],["превратится",{"2":{"18":1}}],["превратятся",{"2":{"11":1}}],["превращается",{"2":{"10":1}}],["преобразования",{"2":{"9":1}}],["преследуете",{"2":{"8":1}}],["преимуществом",{"2":{"9":1,"10":1}}],["преимуществами",{"2":{"7":2,"42":1}}],["преимуществ",{"2":{"7":1,"11":2}}],["преимущественно",{"2":{"5":1,"42":1,"44":1}}],["прежде",{"2":{"7":1}}],["прежним",{"2":{"5":1,"6":1}}],["предисловие",{"0":{"75":1}}],["предварительный",{"2":{"53":1}}],["предварительно",{"2":{"53":2,"54":1}}],["предыдущую",{"2":{"53":1}}],["предыдущий",{"2":{"18":1}}],["предыдущие",{"2":{"18":1}}],["предыдущих",{"2":{"10":1}}],["предназначались",{"2":{"53":1}}],["предназначенных",{"2":{"6":1}}],["пределами",{"2":{"42":1,"44":1}}],["пределы",{"2":{"19":2}}],["преданность",{"2":{"29":1}}],["предпочтительно",{"2":{"15":1}}],["предписаны",{"2":{"25":1}}],["предписано",{"2":{"19":1}}],["предписанный",{"2":{"10":1}}],["предписывает",{"2":{"7":1,"9":1,"11":1}}],["предписывается",{"2":{"7":1}}],["предписывают",{"2":{"7":1}}],["предусмотрены",{"2":{"12":1}}],["предотвращая",{"2":{"10":1}}],["предоставления",{"2":{"4":1}}],["предоставляющих",{"2":{"25":1}}],["предоставляются",{"2":{"12":1}}],["предоставляют",{"2":{"3":1,"6":1,"7":1,"34":1,"52":1}}],["предоставлять",{"2":{"4":1,"42":1}}],["предоставляется",{"2":{"4":1,"19":1}}],["предоставляет",{"2":{"3":4,"4":1,"6":1,"11":1,"18":2,"19":1}}],["представьте",{"2":{"42":1}}],["представим",{"2":{"29":1}}],["представить",{"2":{"9":1}}],["представления",{"2":{"44":1}}],["представление",{"2":{"6":1,"9":2,"29":1}}],["представлять",{"2":{"42":1}}],["представляют",{"2":{"9":1}}],["представляет",{"2":{"7":1,"10":1}}],["представлял",{"2":{"6":1}}],["предстоит",{"2":{"7":1}}],["предложил",{"2":{"53":1,"54":1}}],["предложить",{"2":{"7":1,"73":1}}],["предложений",{"2":{"44":1}}],["предложения",{"2":{"15":1}}],["предлагает",{"2":{"7":1,"9":1}}],["предлагаемого",{"2":{"7":1}}],["предлагают",{"2":{"52":1,"53":1}}],["предлагаю",{"2":{"5":1}}],["предлагающих",{"2":{"3":1}}],["предмет",{"2":{"3":1}}],["практик",{"2":{"29":1,"53":1,"74":1}}],["практикой",{"2":{"20":1,"41":1}}],["практиками",{"2":{"53":1}}],["практика",{"2":{"10":1,"42":1}}],["практике",{"2":{"7":1,"10":1}}],["практики",{"2":{"2":1,"6":1,"52":1,"53":1}}],["правильных",{"2":{"53":1}}],["правильно",{"2":{"10":1}}],["правила",{"2":{"6":1,"7":1,"10":1,"44":1}}],["правая",{"2":{"39":1}}],["права",{"2":{"2":1}}],["право",{"2":{"2":3}}],["промисов",{"2":{"53":1}}],["промежуточного",{"2":{"44":1}}],["пройти",{"2":{"53":1}}],["проапгрейдиться",{"2":{"52":1}}],["профессионального",{"2":{"48":1}}],["профессиональной",{"2":{"29":1}}],["прогон",{"2":{"43":1}}],["програмную",{"2":{"54":1}}],["программными",{"2":{"44":1}}],["программных",{"2":{"29":1}}],["программно",{"2":{"7":1}}],["программной",{"2":{"6":1,"7":1}}],["программного",{"2":{"5":1,"6":1,"29":1,"43":1}}],["программы",{"2":{"7":1,"10":1,"34":1,"39":1,"41":1,"44":2}}],["программировать",{"2":{"45":1}}],["программированию",{"2":{"53":2}}],["программирование",{"2":{"44":1}}],["программировании",{"2":{"7":4}}],["программирования",{"2":{"3":2,"6":2,"7":1,"44":2}}],["программиста",{"2":{"45":1}}],["программистам",{"2":{"44":1}}],["программистов",{"2":{"44":1,"75":1}}],["программистские",{"2":{"44":1}}],["программист",{"2":{"7":2,"41":1,"44":1}}],["программу",{"2":{"7":1}}],["программа",{"2":{"4":1,"7":1}}],["прогрессивность",{"2":{"7":1}}],["прогрессивного",{"2":{"6":1}}],["прогрессивные",{"2":{"29":1}}],["прогрессивным",{"2":{"27":1}}],["прогрессивный",{"0":{"7":1},"2":{"6":1,"7":2}}],["прогрессивных",{"2":{"6":1}}],["процентов",{"2":{"41":1}}],["процессор",{"2":{"25":1,"39":1}}],["процесс",{"2":{"9":1,"31":1,"43":1}}],["процесса",{"2":{"8":1,"11":1,"33":1}}],["процессе",{"2":{"7":1,"9":1}}],["прочесть",{"2":{"54":1}}],["прочих",{"2":{"54":1}}],["прочим",{"2":{"45":1}}],["прочие",{"2":{"35":1}}],["прочтение",{"2":{"29":1}}],["прозрачное",{"2":{"33":1}}],["прозрачный",{"2":{"2":1,"37":1}}],["проиграет",{"2":{"54":1}}],["проиндексировать",{"2":{"54":1}}],["происходит",{"2":{"54":1}}],["происходить",{"2":{"33":1,"42":1}}],["произошло",{"2":{"42":1}}],["производительное",{"2":{"44":1}}],["производительность",{"2":{"15":1,"29":1,"46":1}}],["производительности",{"2":{"7":2,"41":1,"42":1,"54":1}}],["производительней",{"2":{"39":1}}],["продакшне",{"2":{"43":1}}],["продуктовый",{"2":{"53":1}}],["продукт",{"2":{"31":1}}],["продукта",{"2":{"29":1}}],["продвинутые",{"2":{"29":1}}],["продвижения",{"2":{"6":1,"18":1,"26":1}}],["прошли",{"2":{"26":1}}],["проп",{"2":{"42":1}}],["пропсов",{"2":{"42":1}}],["пропсы",{"0":{"21":1},"2":{"42":1}}],["прописать",{"2":{"33":1}}],["прописано",{"2":{"16":1}}],["прописаны",{"2":{"7":1}}],["проявляется",{"2":{"43":1}}],["проявившиеся",{"2":{"11":1}}],["проясняться",{"2":{"11":1}}],["проектов",{"2":{"38":1,"44":1,"52":1}}],["проекте",{"2":{"33":1,"38":1,"42":1,"52":1,"74":1}}],["проект",{"0":{"51":1},"2":{"29":1,"33":2,"38":2,"45":1,"49":1}}],["проектирования",{"2":{"6":2,"26":1,"29":1}}],["проектах",{"2":{"25":1,"33":1,"43":1}}],["проекта",{"2":{"3":1,"9":1,"10":1,"11":1,"29":1,"31":1,"33":2,"34":1,"43":1,"45":1,"51":1,"53":1,"74":1}}],["прокси",{"2":{"4":1,"5":1,"44":1}}],["пробелы",{"2":{"21":1}}],["пробелами",{"2":{"4":1}}],["проблему",{"2":{"33":1,"35":1}}],["проблема",{"2":{"11":1}}],["проблемы",{"2":{"4":2,"6":1,"19":1,"42":1,"53":1,"54":1}}],["проблем",{"2":{"3":1,"7":1}}],["протяжении",{"2":{"9":1}}],["протоколу",{"2":{"34":1,"35":1}}],["протокола",{"2":{"29":1}}],["протоколам",{"2":{"6":1}}],["протоколы",{"0":{"5":1},"2":{"5":1,"53":1}}],["протоколом",{"2":{"4":1}}],["протестировать",{"2":{"3":1}}],["проводить",{"2":{"44":1}}],["провести",{"2":{"7":1}}],["проверено",{"2":{"54":1}}],["проверенная",{"2":{"75":1}}],["проверенных",{"2":{"74":1}}],["проверенные",{"2":{"29":1}}],["проверенное",{"2":{"7":1}}],["проверьте",{"2":{"54":1}}],["проверить",{"2":{"53":1}}],["проверив",{"2":{"2":1}}],["проверка",{"2":{"42":3}}],["проверки",{"0":{"27":1}}],["проверять",{"2":{"2":1,"43":1}}],["проверяет",{"2":{"2":2,"33":1,"39":1}}],["провайдеры",{"2":{"34":2}}],["провайдерами",{"2":{"53":1}}],["провайдера",{"2":{"3":1,"45":1}}],["провайдер",{"2":{"3":1}}],["провайдеров",{"2":{"3":1}}],["проще",{"2":{"3":1,"41":1,"52":1,"54":1}}],["прослойка",{"2":{"54":1}}],["просмотреть",{"2":{"27":1}}],["просмотра",{"2":{"11":1}}],["просишь",{"2":{"2":1}}],["пространство",{"2":{"38":1}}],["простую",{"2":{"7":1}}],["просты",{"2":{"54":1}}],["простые",{"2":{"41":1}}],["простых",{"2":{"6":2,"54":1}}],["простым",{"2":{"1":1}}],["простому",{"2":{"31":1}}],["простом",{"2":{"19":1,"44":1}}],["простое",{"2":{"9":1,"54":1}}],["простого",{"2":{"6":1}}],["просто",{"2":{"2":1,"11":1,"18":1,"34":1,"41":1,"42":2,"45":1,"52":1,"53":1}}],["простой",{"2":{"2":1,"8":1,"53":1}}],["приблизить",{"2":{"54":1}}],["придумали",{"2":{"54":1}}],["придерживаются",{"2":{"52":1}}],["придерживаться",{"2":{"7":1,"53":1}}],["придется",{"2":{"7":1}}],["пригодится",{"2":{"53":1}}],["пригодиться",{"2":{"39":1}}],["причем",{"2":{"53":2}}],["причины",{"2":{"52":1}}],["причудливо",{"2":{"7":1}}],["приятней",{"2":{"52":1}}],["приятно",{"2":{"11":1}}],["привязывайтесь",{"2":{"49":1}}],["привязана",{"2":{"42":1}}],["приветствуется",{"2":{"73":1}}],["привести",{"2":{"11":1}}],["привел",{"2":{"19":1}}],["привели",{"2":{"11":2}}],["привело",{"2":{"6":1}}],["приведенные",{"2":{"20":1}}],["приведен",{"2":{"4":1}}],["признательность",{"2":{"29":1}}],["природе",{"2":{"20":1}}],["присутствует",{"2":{"42":1}}],["присваивает",{"2":{"17":1}}],["присваивается",{"2":{"7":1,"17":1}}],["присоединении",{"2":{"17":1}}],["примитивах",{"2":{"41":1}}],["примитивов",{"2":{"41":1}}],["примитивные",{"2":{"17":1,"42":1}}],["примите",{"2":{"11":1}}],["примет",{"2":{"7":1}}],["применять",{"2":{"7":1}}],["применяется",{"2":{"2":1,"11":1}}],["применения",{"2":{"33":1}}],["применению",{"2":{"7":1}}],["применение",{"2":{"5":1}}],["примеры",{"2":{"20":1,"53":1}}],["примерами",{"2":{"19":1}}],["примерах",{"2":{"17":1}}],["примера",{"2":{"11":1}}],["примеров",{"2":{"7":1,"9":1,"11":1}}],["примере",{"2":{"7":1,"8":1,"11":1,"19":1}}],["примеру",{"2":{"7":1}}],["пример",{"2":{"1":2,"4":1,"8":1,"11":1,"16":1,"17":1,"18":1,"19":1,"33":2}}],["примерно",{"2":{"1":1,"42":1,"54":1}}],["приходила",{"2":{"54":1}}],["приходится",{"2":{"11":2,"15":1,"39":1}}],["приходя",{"2":{"45":1}}],["приходятся",{"2":{"42":1,"44":1}}],["приходящих",{"2":{"5":1}}],["принести",{"2":{"42":1}}],["принадлежат",{"2":{"42":1}}],["принято",{"2":{"9":1}}],["приняты",{"2":{"6":1}}],["принципе",{"2":{"44":1}}],["принципы",{"2":{"29":1}}],["принципов",{"2":{"26":1}}],["принцип",{"2":{"4":1}}],["принимающий",{"2":{"4":1}}],["приложению",{"2":{"10":1,"42":1,"45":1}}],["приложении",{"0":{"8":1},"1":{"9":1},"2":{"7":1,"8":1,"11":1,"35":2,"42":3,"54":1}}],["приложением",{"2":{"8":1,"54":1,"74":2}}],["приложение",{"2":{"3":2,"6":1,"7":4,"8":3,"9":2,"10":2,"35":1,"45":1,"52":1,"53":1,"54":3}}],["приложений",{"0":{"45":1},"1":{"46":1,"47":1,"48":1,"49":1,"50":1,"51":1},"2":{"2":1,"6":2,"7":5,"9":2,"54":1}}],["приложениями",{"2":{"6":1}}],["приложения",{"0":{"35":1,"38":1},"1":{"36":1,"37":1},"2":{"1":1,"5":1,"6":2,"7":6,"8":5,"9":4,"10":1,"18":1,"19":1,"29":4,"33":1,"35":2,"38":3,"41":1,"43":1,"44":1,"45":4,"46":1,"54":4,"74":1}}],["при",{"2":{"2":3,"3":1,"4":2,"5":1,"6":1,"7":6,"8":1,"9":2,"11":1,"13":2,"15":2,"17":1,"19":3,"25":1,"27":1,"33":4,"35":2,"39":2,"43":2,"44":3,"52":1,"53":1,"54":8,"74":2}}],["геттеров",{"2":{"42":1}}],["генерации",{"2":{"54":1}}],["генерация",{"2":{"38":1,"54":1}}],["генерируется",{"2":{"54":1}}],["генерировать",{"2":{"33":1}}],["генерить",{"2":{"54":1}}],["генерит",{"2":{"2":2}}],["гарагусо",{"2":{"29":1}}],["глоссарий",{"0":{"74":1}}],["глобален",{"2":{"42":1}}],["глобальный",{"2":{"42":1}}],["глобальным",{"2":{"42":2,"45":1}}],["глобальными",{"2":{"42":1}}],["глобальное",{"2":{"42":1}}],["глобальная",{"2":{"8":1}}],["глючит",{"2":{"39":1}}],["глава",{"0":{"30":1},"2":{"29":4}}],["главах",{"2":{"7":1,"29":1}}],["главу",{"2":{"27":1}}],["главным",{"2":{"45":1,"53":1}}],["главных",{"2":{"10":1}}],["главного",{"2":{"9":1}}],["главы",{"2":{"6":1,"27":1}}],["главе",{"2":{"6":1,"9":1,"10":3,"11":2,"17":1,"26":2,"29":8}}],["гибки",{"2":{"44":1}}],["гибкость",{"2":{"5":1,"7":1}}],["гибче",{"2":{"42":1}}],["гипертекста",{"2":{"6":1}}],["гуглить",{"2":{"3":2,"53":1}}],["грамотная",{"2":{"74":1}}],["границах",{"2":{"7":1}}],["гранулировано",{"2":{"2":1}}],["греется",{"2":{"39":1}}],["громоздким",{"2":{"19":1}}],["грузить",{"2":{"3":1,"54":1}}],["грубо",{"2":{"2":1,"4":1,"45":1}}],["где",{"2":{"2":1,"3":1,"7":1,"8":1,"10":1,"11":1,"34":1,"42":1,"43":1,"44":2,"48":1}}],["гостинице",{"2":{"54":1}}],["гостей",{"2":{"2":1}}],["года",{"2":{"53":1,"75":1}}],["годы",{"2":{"41":1}}],["год",{"2":{"34":1}}],["готовым",{"2":{"39":1}}],["готовы",{"2":{"19":1,"26":1,"27":1}}],["готовых",{"2":{"18":1}}],["говорит",{"2":{"45":1}}],["говорилось",{"2":{"25":1}}],["говорил",{"2":{"11":1}}],["говоря",{"2":{"2":1,"4":1,"44":1,"45":1,"54":1}}],["чуть",{"2":{"54":1}}],["чужих",{"2":{"52":1}}],["читаемая",{"2":{"53":1}}],["читаемым",{"2":{"25":1}}],["читать",{"2":{"53":1}}],["чистом",{"2":{"52":1}}],["чистый",{"2":{"49":1}}],["чистая",{"2":{"17":1}}],["число",{"2":{"45":1}}],["числа",{"2":{"8":1,"17":1}}],["чисел",{"2":{"41":1}}],["чате",{"2":{"75":1}}],["чаще",{"2":{"13":1,"18":1}}],["часто",{"2":{"7":2,"11":1,"12":1,"15":2,"19":1,"27":1,"35":1,"41":1,"54":1,"75":2}}],["частью",{"2":{"8":1,"14":1,"42":1}}],["часть",{"2":{"5":2,"7":1,"10":1,"39":1,"41":1}}],["частично",{"2":{"42":3,"44":2}}],["части",{"2":{"2":1,"53":1}}],["чтения",{"2":{"11":2}}],["чтобы",{"2":{"2":1,"8":2,"10":2,"11":4,"14":1,"18":1,"19":1,"25":2,"27":2,"33":1,"34":2,"35":1,"38":2,"42":1,"44":2,"53":2,"54":5}}],["что",{"2":{"2":8,"3":2,"4":1,"5":2,"7":14,"8":3,"9":5,"10":6,"11":12,"14":2,"15":2,"16":1,"17":1,"18":2,"19":1,"27":2,"31":1,"33":3,"35":1,"38":2,"41":1,"42":13,"43":3,"44":3,"45":4,"46":1,"52":3,"53":4,"54":4}}],["членов",{"2":{"11":1}}],["членам",{"2":{"11":1}}],["член",{"2":{"11":1}}],["чего",{"2":{"41":1,"42":1,"44":1}}],["человек",{"2":{"39":1,"53":2}}],["четко",{"2":{"10":1}}],["четкое",{"2":{"6":1}}],["четкость",{"2":{"5":1}}],["четыре",{"2":{"2":1}}],["чем",{"2":{"1":1,"7":1,"11":1,"18":1,"27":1,"34":1,"38":2,"42":1,"44":1,"49":1,"52":1}}],["через",{"2":{"1":1,"2":5,"3":1,"5":1,"29":1,"33":1,"35":1,"38":1,"39":1,"41":2,"42":1,"52":1}}],["аспекте",{"2":{"43":1,"44":1}}],["асинхронные",{"2":{"19":1}}],["алиаса",{"2":{"38":1}}],["алиасы",{"2":{"38":1}}],["алиас",{"2":{"38":2}}],["альтернативный",{"2":{"11":1}}],["альтернатива",{"2":{"3":1}}],["аудио",{"2":{"35":1}}],["аутентификацию",{"2":{"3":1}}],["аутентификацией",{"2":{"2":1}}],["аутентификации",{"2":{"2":1,"42":1,"74":2}}],["аутентификация",{"0":{"2":1},"2":{"2":5}}],["апгрейд",{"2":{"54":1}}],["апдейта",{"2":{"33":1}}],["апплеты",{"2":{"6":1}}],["аргумента",{"2":{"8":1}}],["архитектура",{"0":{"45":1},"1":{"46":1,"47":1,"48":1,"49":1,"50":1,"51":1},"2":{"45":4,"74":1}}],["архитектуры",{"2":{"29":1}}],["архитектурно",{"2":{"42":1}}],["архитектурной",{"2":{"41":1}}],["архитектурными",{"2":{"7":1}}],["архитектурная",{"2":{"7":1}}],["архитектурой",{"2":{"7":1}}],["азы",{"2":{"7":1}}],["автоматизацией",{"2":{"53":1}}],["автоматизации",{"2":{"29":1,"31":1,"33":2}}],["автоматического",{"2":{"7":1,"33":1}}],["автоматически",{"2":{"6":1,"7":1,"11":1,"33":1,"44":1}}],["автор",{"2":{"29":1}}],["авторизационный",{"2":{"2":1}}],["авторизация",{"0":{"2":1},"2":{"2":4}}],["автономного",{"2":{"8":1}}],["аналогу",{"2":{"54":1}}],["аналогов",{"2":{"44":1}}],["аналогом",{"2":{"42":1}}],["аналогичный",{"2":{"53":1}}],["аналогичные",{"2":{"42":1}}],["аналогией",{"2":{"45":1}}],["аналоги",{"2":{"42":1}}],["аналог",{"2":{"42":1}}],["анимации",{"2":{"19":3}}],["анимацию",{"2":{"6":1,"54":1}}],["английского",{"2":{"53":1}}],["английском",{"2":{"53":2}}],["англ",{"2":{"4":1}}],["актуальность",{"2":{"75":1}}],["актуален",{"2":{"11":1}}],["активно",{"2":{"44":1}}],["аккуратней",{"2":{"43":1}}],["аккаунта",{"2":{"45":1}}],["аккаунт",{"2":{"2":1}}],["аккаунтом",{"2":{"2":1}}],["академических",{"2":{"6":1}}],["абы",{"2":{"5":1}}],["абсолютно",{"2":{"53":1}}],["абсолютном",{"2":{"3":1}}],["абстрактны",{"2":{"26":1}}],["абстрактное",{"2":{"25":1}}],["абстракция",{"0":{"0":1},"1":{"1":1}}],["абстрагирование",{"2":{"1":1}}],["адаптивноcти",{"2":{"49":1}}],["адаптивность",{"2":{"45":1,"52":1}}],["адрес",{"2":{"13":1}}],["адресу",{"2":{"4":1}}],["админ",{"2":{"2":1}}],["админке",{"2":{"2":1}}],["аттрибутах",{"2":{"52":1}}],["аттрибут",{"2":{"8":1}}],["атрибута",{"2":{"13":1,"14":1,"16":1}}],["атрибуту",{"2":{"11":1}}],["атрибуты",{"2":{"11":1,"12":1}}],["атрибут",{"2":{"7":2,"10":3,"11":1,"13":1,"16":2}}],["ат",{"2":{"2":2}}],["а",{"2":{"2":2,"3":1,"4":2,"7":4,"8":1,"9":1,"10":1,"11":4,"18":1,"19":1,"21":1,"41":2,"42":5,"44":1,"45":1,"47":1,"53":4,"54":5}}],["мнение",{"2":{"75":1}}],["множественного",{"2":{"41":1}}],["множество",{"2":{"39":2,"44":1,"54":1}}],["многие",{"2":{"34":1,"39":1,"45":1,"53":1}}],["многих",{"2":{"25":1}}],["многолетним",{"2":{"54":1}}],["многопоточной",{"2":{"44":1}}],["многопоточность",{"2":{"29":1}}],["многословность",{"2":{"11":1}}],["многословной",{"2":{"11":1}}],["многословен",{"2":{"11":1}}],["многом",{"2":{"8":1}}],["многое",{"2":{"7":1}}],["многократно",{"2":{"7":1,"9":1}}],["много",{"2":{"2":1,"3":1,"4":1,"35":1,"39":1,"40":1,"41":1,"44":1}}],["мучается",{"2":{"49":1}}],["мусор",{"2":{"19":1}}],["миру",{"2":{"54":1}}],["мир",{"2":{"52":1}}],["мире",{"2":{"9":1}}],["мидл",{"2":{"45":1}}],["микрософт",{"2":{"54":1}}],["микросервисов",{"2":{"45":1}}],["микросервиса",{"2":{"44":1}}],["микро",{"2":{"39":1}}],["миксинов",{"2":{"11":1}}],["миксины",{"2":{"11":2,"41":4}}],["миграция",{"2":{"11":1}}],["миграции",{"2":{"11":1}}],["минут",{"2":{"53":1}}],["минусы",{"2":{"52":2}}],["минуя",{"2":{"7":1}}],["минисервере",{"2":{"39":1}}],["мини",{"2":{"39":2}}],["минимум",{"2":{"39":1,"42":1,"51":1,"53":2}}],["миниатюре",{"2":{"3":1}}],["мыслить",{"2":{"45":1}}],["мышку",{"2":{"39":1}}],["мыши",{"2":{"18":1}}],["мышления",{"2":{"7":1}}],["мы",{"2":{"6":3,"7":2,"8":11,"9":4,"10":13,"11":14,"12":1,"13":1,"17":3,"18":8,"19":3,"20":1,"25":1,"26":3,"29":5,"33":2,"45":5}}],["мае",{"2":{"53":1}}],["максимально",{"2":{"52":1,"54":1}}],["манифест",{"2":{"54":3}}],["манипулирования",{"2":{"6":1,"15":1}}],["манипуляции",{"2":{"2":1}}],["манере",{"2":{"25":1}}],["магические",{"2":{"41":1}}],["магия",{"2":{"17":1}}],["магию",{"2":{"10":1}}],["магазине",{"2":{"54":1}}],["магазина",{"2":{"45":1}}],["магазин",{"2":{"2":1}}],["маске",{"2":{"36":1}}],["маска",{"2":{"4":2}}],["массива",{"2":{"41":3,"44":1,"53":1}}],["массив",{"2":{"41":3,"44":1}}],["массивы",{"2":{"17":1}}],["массиве",{"2":{"16":1}}],["масштабируемых",{"2":{"44":1}}],["масштабирования",{"2":{"7":1}}],["масштабах",{"2":{"15":1}}],["маленького",{"2":{"35":1}}],["маленьких",{"2":{"9":1}}],["маленький",{"2":{"2":1}}],["малого",{"2":{"7":2}}],["машины",{"2":{"39":1}}],["машин",{"2":{"6":1}}],["метрике",{"2":{"54":1}}],["метрики",{"2":{"54":1}}],["метода",{"2":{"54":1}}],["методами",{"2":{"53":1}}],["методам",{"2":{"11":1}}],["методом",{"2":{"54":1}}],["методов",{"2":{"41":1}}],["методе",{"2":{"11":1}}],["методы",{"0":{"24":1},"2":{"4":1,"6":1,"8":1,"9":1,"42":1}}],["метод",{"2":{"2":1,"8":3,"11":1}}],["медленней",{"2":{"42":1}}],["мелких",{"2":{"42":1}}],["механизмы",{"2":{"42":1}}],["мест",{"2":{"54":1}}],["места",{"2":{"41":1}}],["месте",{"2":{"10":1,"44":1}}],["место",{"2":{"6":1,"19":1,"44":1}}],["мере",{"2":{"6":2,"9":1,"11":2,"18":1,"26":1}}],["меры",{"2":{"2":1}}],["между",{"2":{"4":1,"6":3,"7":3,"10":1,"11":2,"27":1,"39":1,"42":2,"53":1,"54":1}}],["менее",{"2":{"54":1}}],["менеджера",{"2":{"33":1}}],["менеджер",{"2":{"2":3}}],["ментор",{"2":{"53":2}}],["меню",{"2":{"45":1}}],["меньше",{"2":{"44":1}}],["меньший",{"2":{"11":1,"44":1}}],["меняем",{"2":{"45":1}}],["меняете",{"2":{"42":1}}],["меняет",{"2":{"11":1}}],["меняется",{"2":{"1":1}}],["меняться",{"2":{"41":1}}],["менять",{"2":{"35":1}}],["меняющими",{"2":{"15":1}}],["меняются",{"2":{"16":1,"41":1}}],["меняют",{"2":{"7":1}}],["мобильное",{"2":{"54":1}}],["морган",{"2":{"53":1}}],["мощь",{"2":{"45":1}}],["мощная",{"2":{"7":1}}],["мощных",{"2":{"6":1}}],["мощности",{"2":{"6":1}}],["монитора",{"2":{"39":1}}],["монитор",{"2":{"39":1}}],["мониторингом",{"2":{"2":1}}],["моем",{"2":{"38":1}}],["моменты",{"2":{"53":1,"75":1}}],["моментов",{"2":{"43":1}}],["момент",{"2":{"19":1,"41":1,"54":1}}],["могущие",{"2":{"75":1}}],["могут",{"2":{"4":2,"6":1,"7":2,"11":1,"15":1,"19":1,"35":1,"39":1,"44":2,"45":1,"46":1,"53":1}}],["мог",{"2":{"10":1,"54":1}}],["модули",{"2":{"42":2,"45":2,"48":1}}],["модуля",{"2":{"42":1}}],["модуле",{"2":{"42":1,"44":1,"45":1}}],["модульная",{"2":{"45":1}}],["модульными",{"2":{"7":1}}],["модуль",{"2":{"1":2,"10":1,"45":7}}],["модификации",{"2":{"14":1}}],["модификатор",{"2":{"10":1}}],["моделям",{"2":{"49":1}}],["моделей",{"2":{"25":1}}],["модели",{"2":{"7":1}}],["модель",{"2":{"7":2,"42":2,"44":1,"52":1}}],["мои",{"2":{"5":1}}],["можем",{"2":{"8":1,"10":5,"11":3,"12":1,"17":1,"18":2,"19":1}}],["можете",{"2":{"7":5,"9":1,"11":2,"20":1,"25":2,"27":2,"35":1,"73":1}}],["может",{"2":{"2":1,"3":2,"4":1,"5":1,"6":1,"7":4,"9":1,"10":3,"11":3,"14":1,"19":2,"33":1,"35":1,"38":1,"39":1,"41":1,"42":6,"43":1,"44":3,"46":1,"52":3,"53":1,"54":6}}],["можно",{"2":{"1":1,"2":4,"3":2,"5":1,"7":2,"8":1,"9":3,"18":1,"19":3,"25":1,"34":3,"35":1,"39":2,"41":1,"42":3,"44":3,"45":2,"52":1,"53":4,"54":3}}],["н",{"2":{"53":1}}],["нём",{"2":{"49":1}}],["нужен",{"2":{"33":1,"38":1,"42":2,"53":2,"54":1}}],["нужный",{"2":{"43":1}}],["нужны",{"2":{"41":1,"45":1,"54":1}}],["нужных",{"2":{"41":1}}],["нужные",{"2":{"3":1}}],["нужна",{"2":{"5":1,"7":1,"37":1,"41":1,"46":1}}],["нужное",{"2":{"33":1}}],["нужно",{"2":{"2":2,"7":1,"8":1,"9":1,"11":2,"15":1,"19":1,"33":1,"35":2,"38":2,"41":1,"42":2,"43":2,"45":1,"52":1,"53":1,"54":2}}],["нуля",{"2":{"7":1}}],["нюансов",{"2":{"4":1}}],["ним",{"2":{"49":1,"53":1,"54":1}}],["ними",{"2":{"2":1,"7":2,"10":1}}],["нижнем",{"2":{"21":1}}],["ниже",{"2":{"4":1,"73":1}}],["ни",{"2":{"11":1}}],["ничего",{"2":{"9":1,"11":1,"53":1}}],["них",{"2":{"6":1,"7":1,"11":2,"12":1,"19":1,"38":1,"41":1,"43":1,"45":1,"47":1}}],["никакой",{"2":{"42":1,"54":1}}],["никаких",{"2":{"5":1}}],["никогда",{"2":{"5":1,"53":1}}],["нормально",{"2":{"54":1}}],["номер",{"2":{"54":1}}],["ноут",{"2":{"39":1}}],["нотацию",{"2":{"12":1}}],["новая",{"2":{"54":1}}],["новую",{"2":{"46":1}}],["нововведением",{"2":{"42":1}}],["новостей",{"2":{"42":1}}],["новостных",{"2":{"42":1}}],["новой",{"2":{"33":1,"52":1}}],["нового",{"2":{"11":1,"44":1,"73":1}}],["новое",{"0":{"59":1,"62":1,"65":1},"2":{"7":1,"33":1}}],["новых",{"2":{"33":1}}],["новым",{"2":{"11":1}}],["новый",{"2":{"10":1,"11":1,"19":2,"38":1,"46":1}}],["новые",{"2":{"6":3,"39":1,"44":1,"53":1}}],["новичка",{"2":{"5":1}}],["но",{"2":{"2":3,"3":3,"5":1,"6":1,"7":6,"8":1,"9":1,"10":3,"11":9,"14":1,"15":1,"17":1,"18":1,"19":2,"20":1,"25":1,"31":1,"33":1,"35":1,"39":1,"41":2,"42":2,"43":1,"44":5,"45":2,"46":2,"53":4,"54":4}}],["неочевидные",{"2":{"75":1}}],["неоптимизированных",{"2":{"54":1}}],["необходимую",{"2":{"54":1}}],["необходимый",{"2":{"53":1}}],["необходимые",{"2":{"39":1}}],["необходимых",{"2":{"29":1}}],["необходим",{"2":{"34":1}}],["необходимости",{"2":{"7":2,"11":1,"33":1,"35":1}}],["необходимо",{"2":{"6":1,"7":3,"11":3,"19":1}}],["некий",{"2":{"54":1}}],["некоего",{"2":{"42":1}}],["некотором",{"2":{"42":1}}],["некоторое",{"2":{"11":2}}],["некоторых",{"2":{"19":1}}],["некоторые",{"2":{"6":1,"7":3,"11":2,"54":1}}],["некоторую",{"2":{"3":1}}],["некой",{"2":{"2":1}}],["неэффективным",{"2":{"54":1}}],["нельзя",{"2":{"44":1}}],["нелогично",{"2":{"42":1}}],["ненужной",{"2":{"42":1}}],["ненужное",{"2":{"5":1}}],["нечто",{"2":{"42":1}}],["независимо",{"2":{"45":1}}],["независимы",{"2":{"42":1}}],["незаслужено",{"2":{"2":1}}],["неудачное",{"2":{"42":1}}],["неудобно",{"2":{"35":1}}],["недорого",{"2":{"34":1}}],["недостатки",{"2":{"11":1}}],["нее",{"2":{"11":1,"42":1,"44":1}}],["неизменяемое",{"2":{"11":1}}],["нереактивные",{"2":{"11":1}}],["неплохо",{"2":{"53":1}}],["неплохой",{"2":{"45":1}}],["неплохим",{"2":{"3":1}}],["непрямой",{"2":{"42":1}}],["непрерывная",{"2":{"31":1}}],["неправильном",{"2":{"15":1}}],["непустое",{"2":{"14":1}}],["непосредственно",{"2":{"9":1,"41":1}}],["небольшую",{"2":{"54":1}}],["небольших",{"2":{"11":1,"52":1}}],["небольшим",{"2":{"7":1}}],["небольшой",{"2":{"40":1,"54":1}}],["небольшое",{"2":{"8":1,"19":1}}],["небольшого",{"2":{"2":1,"3":1,"8":1}}],["несущественные",{"2":{"60":1}}],["несложных",{"2":{"54":1}}],["несложно",{"2":{"2":1}}],["несмотря",{"2":{"53":1}}],["нестандартные",{"2":{"53":1}}],["нескольких",{"2":{"11":1,"38":1,"42":1,"43":1,"44":1}}],["нескольким",{"2":{"4":1}}],["несколько",{"2":{"7":1,"8":1,"9":3,"11":1,"18":2,"19":1,"33":1,"42":2,"45":1,"54":1}}],["несовместимости",{"2":{"6":2}}],["него",{"2":{"4":1,"19":1,"37":1,"39":1,"42":2}}],["ней",{"2":{"3":2,"41":1,"42":1,"46":1,"54":1}}],["немножко",{"2":{"54":1}}],["немного",{"2":{"8":1,"26":1,"44":1,"46":1,"52":1}}],["нем",{"2":{"2":2,"4":1,"6":1,"7":1,"33":2,"34":1,"53":1}}],["нему",{"2":{"2":1,"4":1,"39":1,"42":1}}],["нетривиальная",{"2":{"39":1}}],["нет",{"2":{"2":2,"11":2,"14":1,"27":1,"53":2}}],["неё",{"2":{"2":1}}],["не",{"0":{"5":1,"30":1},"2":{"1":1,"2":4,"3":4,"4":3,"5":2,"6":2,"7":3,"8":1,"9":2,"10":2,"11":9,"13":1,"14":1,"15":1,"16":1,"18":2,"19":4,"20":1,"25":2,"31":1,"33":1,"35":1,"37":1,"39":7,"41":6,"42":9,"43":1,"44":6,"45":3,"46":5,"47":1,"49":2,"52":1,"53":5,"54":10,"75":1}}],["налету",{"2":{"54":1}}],["наличия",{"2":{"44":1}}],["наличие",{"2":{"43":1}}],["нагружает",{"2":{"54":1}}],["натянуть",{"2":{"45":1}}],["нативных",{"2":{"54":1}}],["нативным",{"2":{"54":1}}],["нативными",{"2":{"6":1}}],["нативного",{"2":{"44":1,"54":1}}],["наименьшими",{"2":{"45":1}}],["наиболее",{"2":{"6":1,"11":1,"12":1,"27":1,"38":1,"45":1,"75":1}}],["наверное",{"2":{"44":1,"54":1}}],["навигацией",{"2":{"29":1}}],["наряду",{"2":{"43":1}}],["наращивать",{"2":{"6":1}}],["находятся",{"2":{"53":1}}],["находят",{"2":{"42":1}}],["находится",{"2":{"19":1,"42":1}}],["набирают",{"2":{"25":1}}],["набираются",{"2":{"22":1}}],["наборы",{"2":{"7":1,"9":1}}],["набор",{"2":{"6":1,"20":1,"34":1}}],["нажмет",{"2":{"19":1}}],["найти",{"2":{"18":1,"19":1}}],["наоборот",{"2":{"11":1}}],["надёжней",{"2":{"39":1}}],["надо",{"2":{"33":1,"34":1,"42":2,"44":3,"45":3,"53":2}}],["надежных",{"2":{"44":1}}],["надежный",{"2":{"2":1}}],["надежное",{"2":{"33":1}}],["над",{"0":{"47":1},"2":{"11":2,"44":1,"54":1,"74":1}}],["называть",{"2":{"42":2}}],["называет",{"2":{"45":1}}],["называется",{"2":{"8":1,"17":1,"41":1,"42":1}}],["называемые",{"2":{"12":1,"42":1}}],["называемый",{"2":{"11":1}}],["называемой",{"2":{"10":1}}],["названный",{"2":{"11":1}}],["названиемстор",{"2":{"42":1}}],["название",{"2":{"11":1,"53":1}}],["наших",{"2":{"9":1}}],["наши",{"2":{"9":2,"10":1,"11":2}}],["нашим",{"2":{"8":1}}],["наш",{"2":{"9":1,"10":1,"11":2,"33":1}}],["нашем",{"2":{"11":2,"18":1}}],["наше",{"2":{"8":3}}],["нашего",{"2":{"8":1,"9":2,"10":5,"11":1,"29":3}}],["намного",{"2":{"39":1,"42":1,"44":2,"47":1,"52":2,"53":1,"54":3}}],["нам",{"2":{"6":1,"7":1,"8":1,"9":2,"11":3,"18":1,"19":2,"29":1}}],["наконец",{"2":{"6":2,"8":1}}],["научных",{"2":{"6":1}}],["начнем",{"2":{"20":1}}],["начнется",{"2":{"9":1}}],["начинаниях",{"2":{"29":1}}],["начинается",{"2":{"23":1}}],["начинающему",{"2":{"53":1}}],["начинающих",{"2":{"39":1,"75":1}}],["начинающуюся",{"2":{"12":1}}],["начинаются",{"2":{"22":2}}],["начиная",{"2":{"10":1,"29":1}}],["начинаться",{"2":{"22":1}}],["начинать",{"2":{"5":1,"7":1}}],["начальный",{"2":{"65":1}}],["начального",{"2":{"53":1}}],["начальное",{"2":{"15":1}}],["началом",{"2":{"53":1}}],["начала",{"2":{"20":1,"54":1}}],["начале",{"2":{"8":1}}],["начать",{"2":{"3":1,"7":1,"29":1}}],["напишем",{"2":{"18":1}}],["написанным",{"2":{"43":1}}],["написанный",{"2":{"3":1,"7":1}}],["написание",{"2":{"43":1}}],["написании",{"2":{"25":1,"53":1,"54":1}}],["написания",{"2":{"3":1,"6":1,"10":3,"19":1,"29":1}}],["написаны",{"2":{"9":1}}],["написано",{"2":{"7":1}}],["написать",{"2":{"3":2,"53":1,"54":1}}],["напрямую",{"2":{"8":1,"11":1,"38":1,"41":1,"46":1,"47":1,"54":1}}],["направляется",{"2":{"2":1}}],["направляет",{"2":{"2":1}}],["например",{"2":{"2":5,"3":6,"4":1,"7":3,"11":4,"13":1,"14":1,"16":1,"18":1,"19":1,"21":1,"22":4,"23":1,"24":1,"25":1,"31":2,"35":1,"39":2,"42":5,"44":4,"45":2,"46":1,"47":1,"50":1,"54":2}}],["наследованием",{"2":{"45":2}}],["наследования",{"2":{"41":1}}],["насколько",{"2":{"7":1}}],["настройте",{"2":{"53":1}}],["настройку",{"2":{"39":1}}],["настройка",{"0":{"39":1},"2":{"38":2,"39":1}}],["настройки",{"2":{"38":1}}],["настроек",{"2":{"39":2}}],["настроен",{"2":{"33":1}}],["настроить",{"2":{"38":2,"39":1}}],["настраиваемой",{"2":{"10":1}}],["настраивается",{"2":{"4":1}}],["настолько",{"2":{"7":1,"54":1}}],["настольными",{"2":{"6":1}}],["нас",{"2":{"2":1,"10":1,"11":2,"25":1,"33":1,"45":1}}],["на",{"2":{"1":4,"2":14,"3":8,"4":5,"5":11,"6":3,"7":10,"8":8,"9":2,"10":3,"11":8,"12":1,"15":1,"16":4,"18":3,"19":6,"22":3,"25":1,"27":1,"31":2,"33":12,"34":4,"35":2,"38":3,"39":5,"41":6,"42":9,"43":8,"44":11,"45":9,"46":1,"47":2,"49":3,"52":5,"53":19,"54":16,"59":1,"60":1,"74":1}}],["rip",{"2":{"42":1}}],["rspack",{"2":{"39":24}}],["rc",{"2":{"39":2}}],["rush",{"2":{"39":2}}],["rust",{"2":{"39":2}}],["rustfmt",{"2":{"39":4}}],["ruby",{"2":{"39":2}}],["ru",{"2":{"39":6,"53":1,"75":2}}],["rules",{"2":{"39":4}}],["run",{"2":{"33":18}}],["runs",{"2":{"33":4}}],["raw",{"2":{"35":4,"37":2,"38":2}}],["routes",{"2":{"45":1}}],["rollup",{"2":{"38":2,"39":4}}],["role",{"2":{"2":1}}],["root",{"2":{"33":2,"37":2}}],["r",{"2":{"33":4,"75":2}}],["rf",{"2":{"33":8}}],["rm",{"2":{"33":6}}],["rbac",{"2":{"2":1}}],["rtl",{"2":{"41":1}}],["rt",{"2":{"2":4,"74":1}}],["rpc",{"2":{"1":1,"5":8,"53":1}}],["reddit",{"2":{"75":1}}],["redis",{"2":{"42":1}}],["rehydration",{"2":{"54":1}}],["register",{"2":{"42":1}}],["remix",{"2":{"39":4}}],["removed",{"2":{"33":2}}],["removed=`ls",{"2":{"33":2}}],["remove",{"2":{"33":4}}],["remote",{"2":{"33":14,"39":9}}],["read",{"2":{"42":1}}],["readme",{"2":{"39":4}}],["reactivity",{"2":{"42":1,"44":2}}],["reactive",{"2":{"41":7,"42":6,"44":2}}],["react",{"2":{"7":1,"44":7,"53":2}}],["renovate",{"2":{"39":4}}],["rendering",{"2":{"54":1}}],["renderwhitespace",{"2":{"39":2}}],["render",{"2":{"34":1}}],["release",{"2":{"39":8}}],["releaserc",{"2":{"39":4}}],["reload",{"2":{"33":2}}],["repo",{"2":{"39":2}}],["representation",{"2":{"35":2}}],["recentchange",{"2":{"39":2}}],["recursive",{"2":{"33":2}}],["required",{"2":{"33":2}}],["request",{"2":{"1":2}}],["ref",{"2":{"11":11,"19":4,"41":8,"42":6,"44":2}}],["refresh",{"2":{"2":1,"74":1}}],["resx",{"2":{"39":4}}],["resolver",{"2":{"38":1,"39":2}}],["resolve",{"2":{"38":4}}],["resource",{"2":{"4":1,"35":4}}],["response",{"2":{"33":4}}],["rest",{"0":{"5":2},"2":{"1":1,"5":2}}],["return",{"2":{"1":2,"8":2,"11":4,"36":4,"37":4}}],["люксовый",{"2":{"54":1}}],["любая",{"2":{"42":1,"52":1}}],["любым",{"2":{"33":1}}],["любого",{"2":{"4":1,"73":1}}],["любой",{"2":{"4":1,"7":1,"9":1,"35":1,"42":1,"52":1}}],["любое",{"2":{"2":1}}],["любом",{"2":{"2":1,"42":1,"49":1,"54":1}}],["любимую",{"2":{"1":1}}],["лэйаут",{"2":{"52":1}}],["лучшее",{"2":{"39":1}}],["лучше",{"2":{"11":1,"19":1,"37":1,"39":1,"44":1,"49":1,"53":2,"54":1}}],["лучшего",{"2":{"8":1}}],["лучшими",{"2":{"53":1}}],["лучших",{"2":{"53":1,"74":1}}],["лучший",{"0":{"9":1}}],["лучшие",{"2":{"2":1,"6":1,"53":1}}],["ландшафте",{"2":{"6":1}}],["лазить",{"2":{"2":1}}],["локали",{"2":{"41":1}}],["локализации",{"2":{"41":3}}],["локалей",{"2":{"41":1}}],["локальным",{"2":{"45":1}}],["локальный",{"2":{"42":1}}],["локальных",{"2":{"39":1,"42":1}}],["локально",{"2":{"6":1,"54":1}}],["логическому",{"2":{"54":1}}],["логически",{"2":{"48":1}}],["логические",{"2":{"45":1}}],["логично",{"2":{"42":1}}],["логичный",{"2":{"41":1}}],["логики",{"2":{"42":3}}],["логикой",{"2":{"19":1}}],["логика",{"2":{"3":1,"42":4,"44":1}}],["логику",{"2":{"3":2,"11":1,"42":2,"44":3,"52":2}}],["логине",{"2":{"2":1}}],["логина",{"2":{"2":1,"43":1}}],["логинится",{"2":{"2":1}}],["логин",{"2":{"2":4}}],["лепту",{"0":{"73":1}}],["лень",{"2":{"54":1}}],["лечь",{"2":{"54":1}}],["легче",{"2":{"53":1}}],["легкий",{"2":{"53":1}}],["легкая",{"2":{"7":1}}],["легкой",{"2":{"11":1,"44":1}}],["легко",{"2":{"1":1,"7":1,"53":1}}],["лежащего",{"2":{"31":1}}],["лежит",{"2":{"3":1}}],["лексику",{"2":{"29":1}}],["личного",{"2":{"45":1}}],["личный",{"2":{"2":1}}],["линтингом",{"2":{"43":1}}],["линтер",{"2":{"39":1}}],["линкер",{"2":{"25":1}}],["либо",{"2":{"3":1,"35":3,"38":1,"46":1,"52":2,"53":1,"54":1}}],["лишь",{"2":{"2":1,"6":1,"9":1}}],["лишние",{"2":{"2":1}}],["ли",{"2":{"2":3,"3":1,"42":1,"43":1,"53":4,"54":1}}],["python",{"2":{"53":1,"54":1}}],["pyproject",{"2":{"39":4}}],["pyrightconfig",{"2":{"39":4}}],["pinia",{"2":{"42":12,"60":1}}],["pipelines",{"2":{"39":4}}],["picture",{"2":{"13":4}}],["psalm",{"2":{"39":2}}],["pm2",{"2":{"39":8}}],["pm",{"2":{"39":2}}],["playground",{"2":{"39":1}}],["playwright",{"2":{"39":20}}],["placeholder",{"2":{"3":1}}],["please",{"2":{"39":2}}],["plugin",{"2":{"38":2,"39":1,"54":2}}],["plugins",{"2":{"38":2}}],["px`",{"2":{"36":8}}],["pnp",{"2":{"39":4}}],["pnpm",{"2":{"33":22,"38":2,"39":12}}],["png`",{"2":{"35":2}}],["png",{"2":{"35":5,"37":4}}],["pdm",{"2":{"39":4}}],["pdf",{"2":{"35":1,"39":2}}],["pdgaraguso",{"2":{"29":1}}],["p",{"2":{"33":2}}],["pwd",{"2":{"33":2}}],["pwa",{"0":{"54":1},"2":{"6":1,"54":12,"74":1}}],["persistentsessionreviveprocess",{"2":{"39":2}}],["person",{"2":{"21":1,"23":1}}],["pereditorgroup",{"2":{"39":2}}],["permissions",{"2":{"33":2}}],["permission",{"2":{"2":1}}],["pr",{"2":{"73":1}}],["prerenderer",{"2":{"54":1}}],["preferredtagnamecase",{"2":{"39":2}}],["preview",{"2":{"39":2}}],["prettier",{"2":{"39":27}}],["price",{"2":{"54":1}}],["primevue",{"2":{"40":1}}],["private",{"2":{"33":10}}],["printwidth",{"2":{"39":2}}],["printf",{"2":{"33":2}}],["print",{"2":{"18":4}}],["printpage",{"2":{"18":5}}],["practices",{"0":{"29":1},"2":{"53":1}}],["problem",{"2":{"54":1}}],["progressive",{"2":{"54":1}}],["provide",{"2":{"42":2}}],["procfile",{"2":{"39":4}}],["processqueue",{"2":{"24":1}}],["proj",{"2":{"39":4}}],["project",{"2":{"33":10,"39":2}}],["projectservice",{"2":{"25":1}}],["projectservice=new",{"2":{"25":1}}],["production",{"2":{"38":1}}],["products",{"2":{"1":6}}],["prod",{"2":{"33":7}}],["profile",{"2":{"13":4}}],["props",{"2":{"11":1,"36":22}}],["proxy",{"2":{"4":1,"41":2,"44":1}}],["pullapprove",{"2":{"39":4}}],["puppeteer",{"2":{"39":20}}],["pubspec",{"2":{"39":6}}],["pubxml",{"2":{"39":4}}],["public",{"2":{"3":1,"35":4}}],["pugtools",{"2":{"39":2}}],["push",{"2":{"31":1,"33":5,"44":2}}],["purple",{"2":{"10":2}}],["pure",{"2":{"10":2}}],["pascal",{"2":{"39":2}}],["pascalcase",{"2":{"23":1}}],["packages",{"2":{"39":2}}],["package",{"2":{"38":2,"39":13}}],["paths",{"2":{"38":2}}],["path",{"2":{"36":2,"38":6}}],["patterns",{"0":{"29":1},"2":{"39":2,"53":1}}],["pablo",{"2":{"29":1}}],["pagespeed",{"2":{"54":2}}],["pages",{"2":{"31":1,"33":13,"34":3,"53":1}}],["page",{"2":{"4":1,"54":1}}],["params",{"2":{"1":4}}],["postcss",{"2":{"39":20}}],["postcssrc",{"2":{"39":20}}],["postman",{"2":{"4":1,"39":1}}],["postgresql",{"2":{"3":1}}],["policy",{"2":{"2":1}}],["phpcs",{"2":{"39":4}}],["phpunit",{"2":{"39":2}}],["php",{"2":{"3":1,"39":4,"53":1,"54":2}}],["photo",{"2":{"2":1}}],["pba",{"2":{"2":1}}],["e2e",{"2":{"43":5}}],["eex",{"2":{"39":2}}],["event",{"2":{"39":2}}],["everybody",{"2":{"42":1}}],["every",{"2":{"1":2}}],["emmet",{"2":{"39":4}}],["emits",{"2":{"11":1}}],["eol",{"2":{"39":2}}],["es6",{"2":{"41":1,"44":1}}],["esbenp",{"2":{"39":8}}],["esbuild",{"2":{"38":1}}],["eslint",{"2":{"38":3,"39":29,"53":1}}],["esnext",{"2":{"38":2}}],["end",{"2":{"43":2}}],["entity",{"2":{"42":2}}],["entire",{"2":{"37":2}}],["engine",{"2":{"41":1}}],["en",{"2":{"39":6}}],["enablesmartcommit",{"2":{"39":2}}],["enable",{"2":{"39":6}}],["enabled",{"2":{"39":18}}],["envrc",{"2":{"39":24}}],["envs",{"2":{"33":4}}],["environments",{"2":{"34":1}}],["environment",{"2":{"33":2}}],["env",{"2":{"1":2,"33":48,"39":76}}],["eager",{"2":{"37":4}}],["easingthemes",{"2":{"33":3}}],["e88a22df",{"2":{"35":1}}],["echo",{"2":{"33":16}}],["exs",{"2":{"39":10}}],["extractor",{"2":{"39":22}}],["extension",{"2":{"39":2}}],["extensions",{"2":{"39":6}}],["ex",{"2":{"39":2}}],["experience",{"2":{"74":2}}],["express",{"2":{"54":1}}],["expand",{"2":{"39":2}}],["expandmode",{"2":{"39":2}}],["explorer",{"2":{"39":12}}],["exports",{"2":{"37":2}}],["export",{"2":{"1":4,"11":4,"37":2,"38":2,"42":2}}],["example",{"2":{"37":4}}],["exclude",{"2":{"33":2,"39":2}}],["exiting",{"2":{"33":2}}],["error",{"2":{"33":2}}],["elements",{"2":{"19":1}}],["else",{"0":{"15":2},"2":{"36":2}}],["editorconfig",{"2":{"39":4}}],["editortab",{"2":{"39":2}}],["editorgroup",{"2":{"39":2}}],["editor",{"2":{"39":58}}],["edit",{"2":{"19":3,"73":1}}],["edititem",{"2":{"19":7}}],["edge",{"2":{"3":2}}],["two",{"2":{"54":1}}],["turbo",{"2":{"39":4}}],["txt",{"2":{"39":2}}],["tip",{"2":{"44":1}}],["tidy",{"2":{"39":2}}],["titlebarstyle",{"2":{"39":2}}],["tmp",{"2":{"39":2}}],["t",{"2":{"38":5,"42":2}}],["tazerc",{"2":{"39":4}}],["tabs",{"2":{"39":2}}],["tabsize",{"2":{"39":2}}],["tailwind",{"2":{"39":20,"52":2}}],["tail",{"2":{"33":2}}],["target",{"2":{"33":30,"38":2}}],["tasks",{"2":{"39":4}}],["task",{"2":{"23":1}}],["that",{"2":{"42":4}}],["there",{"2":{"42":1}}],["the",{"2":{"33":4,"35":4,"37":2,"39":2,"54":1}}],["then",{"2":{"33":8}}],["throw",{"2":{"33":2}}],["this",{"2":{"10":2,"11":6,"39":6}}],["travis",{"2":{"39":4}}],["translate",{"2":{"53":1}}],["transform",{"2":{"44":1}}],["transformer",{"2":{"39":2}}],["transfer",{"2":{"33":2}}],["transitiongroup",{"2":{"19":1}}],["transition",{"2":{"19":1}}],["triggerexpansionontab",{"2":{"39":2}}],["tree",{"2":{"37":2,"39":6,"42":2,"46":1}}],["trevis",{"2":{"31":1}}],["true",{"2":{"1":2,"14":2,"33":2,"37":4,"39":122}}],["terserrc",{"2":{"39":20}}],["terminal",{"2":{"39":10}}],["tex",{"2":{"39":2}}],["textlint",{"2":{"39":4}}],["text",{"2":{"17":2}}],["textarea",{"2":{"17":1}}],["test",{"2":{"39":2,"43":1}}],["teleport",{"2":{"19":1}}],["template",{"2":{"10":5,"19":4,"36":4,"52":4}}],["tsup",{"2":{"39":4}}],["tslint",{"2":{"39":4}}],["tsdoc",{"2":{"39":22}}],["tsdk",{"2":{"39":2}}],["tsx",{"2":{"39":6}}],["tsconfig",{"2":{"38":3,"39":22}}],["tsc",{"2":{"38":1}}],["ts",{"2":{"10":1,"39":66}}],["typedoc",{"2":{"39":4}}],["types",{"2":{"38":2,"71":1}}],["typescript",{"0":{"71":1},"2":{"5":1,"10":1,"38":3,"39":10,"42":1,"71":4}}],["type",{"2":{"33":2,"36":14}}],["type=",{"2":{"17":2}}],["typicode",{"2":{"3":1}}],["tool",{"2":{"39":6}}],["toolchain",{"2":{"39":2}}],["toml",{"2":{"39":20}}],["toc",{"2":{"39":2}}],["total",{"2":{"21":1,"22":1}}],["token",{"2":{"1":2,"2":5,"74":2}}],["to",{"0":{"5":1},"2":{"1":2,"33":4,"35":2,"39":4,"42":3,"43":1}}],["v1",{"0":{"56":1,"58":1,"61":1,"64":1},"1":{"57":1,"59":1,"60":1,"62":1,"63":1,"65":1}}],["vetur",{"2":{"39":4}}],["vercel",{"2":{"34":1,"39":4}}],["versionrc",{"2":{"39":4}}],["versions",{"2":{"39":6}}],["version",{"2":{"33":10,"39":6}}],["vbproj",{"2":{"39":2}}],["vb",{"2":{"39":12}}],["volar",{"2":{"39":7}}],["vs",{"2":{"39":7,"44":1}}],["vscode",{"2":{"33":2,"39":17}}],["v4значительно",{"2":{"33":1}}],["v4",{"2":{"33":6}}],["v2",{"2":{"33":5}}],["v3",{"2":{"33":7}}],["views",{"2":{"45":1}}],["view",{"2":{"42":2,"44":1}}],["viewitem",{"2":{"19":6}}],["visible",{"2":{"39":2}}],["visuals",{"2":{"39":2}}],["visualizer",{"2":{"38":7}}],["vitest",{"2":{"39":20,"43":1}}],["vitepnpm",{"2":{"38":1}}],["vitepress",{"2":{"33":2,"51":1,"53":1}}],["vite",{"2":{"1":2,"4":1,"9":1,"10":1,"11":1,"35":1,"36":1,"38":17,"39":5,"54":3,"75":1}}],["v",{"0":{"13":1,"14":1,"15":3,"16":1,"17":1,"18":1},"2":{"12":1,"13":1,"14":3,"15":4,"16":2,"17":2,"18":3,"19":3,"36":6}}],["validate",{"2":{"39":2}}],["value",{"2":{"1":4,"11":3,"39":2,"41":2,"44":4}}],["var",{"2":{"33":8}}],["variable",{"2":{"11":1}}],["variablename",{"2":{"11":1}}],["vuetify",{"2":{"52":1}}],["vuex",{"2":{"42":6,"60":1}}],["vuejs",{"2":{"18":1,"19":2,"75":4}}],["vue",{"0":{"6":1,"8":1,"12":1,"29":1,"42":1,"53":1,"67":1},"1":{"7":1,"8":1,"9":2,"10":1,"11":1,"12":1,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1},"2":{"6":4,"7":9,"8":12,"9":7,"10":8,"11":18,"12":3,"14":1,"16":1,"17":1,"18":3,"19":9,"20":1,"26":1,"27":2,"29":4,"33":1,"35":1,"36":3,"38":5,"39":21,"41":6,"42":12,"43":1,"44":17,"45":2,"52":4,"53":19,"54":1,"57":1,"67":1,"73":1,"75":1}}],["it",{"2":{"42":2}}],["i18next",{"2":{"41":1}}],["i18n",{"2":{"39":6,"41":3}}],["ignoredlocales",{"2":{"39":2}}],["ignore",{"2":{"39":4}}],["ignoretrimwhitespace",{"2":{"39":2}}],["ignorerecommendations",{"2":{"39":2}}],["ie6",{"2":{"52":1}}],["iex",{"2":{"39":2}}],["ie11",{"2":{"37":1}}],["ie",{"2":{"37":1}}],["iconify",{"2":{"39":4}}],["icon",{"2":{"36":2}}],["icons",{"0":{"37":1},"2":{"36":3,"37":2}}],["i",{"2":{"16":7,"39":2}}],["if=",{"2":{"36":2}}],["if",{"0":{"15":2},"2":{"15":1,"19":1,"33":6}}],["imageresources",{"2":{"37":6}}],["imageraw",{"2":{"35":2}}],["imagenameinvariable",{"2":{"35":2}}],["image",{"2":{"35":8}}],["imageurl",{"2":{"35":2}}],["images",{"2":{"33":2,"35":5,"37":4}}],["imgurl",{"2":{"35":4}}],["img",{"2":{"13":2,"35":12,"36":2}}],["import",{"2":{"1":17,"11":4,"19":6,"35":6,"36":5,"37":12,"38":5,"39":4}}],["isn",{"2":{"42":2}}],["isauthenticated",{"2":{"42":1}}],["ist",{"2":{"39":2}}],["issuenumberlabel",{"2":{"39":2}}],["is=",{"2":{"19":2}}],["is",{"2":{"10":2,"19":1,"39":2,"41":4,"42":2}}],["idx",{"2":{"39":2}}],["ide",{"0":{"39":1},"2":{"39":1,"74":1}}],["id",{"2":{"8":1,"16":1,"21":1,"33":4}}],["id=",{"2":{"8":4}}],["ip",{"2":{"2":1}}],["inject",{"2":{"42":2}}],["ind",{"2":{"39":2}}],["indent",{"2":{"39":2}}],["index",{"2":{"9":1,"33":2,"54":2}}],["inplace",{"2":{"39":2}}],["inputs",{"2":{"33":10}}],["input",{"2":{"17":3,"22":1,"39":2,"44":1}}],["insertfinalnewline",{"2":{"39":2}}],["install",{"2":{"33":20}}],["invisiblecharacters",{"2":{"39":2}}],["inlinesuggest",{"2":{"39":2}}],["in",{"2":{"16":2,"18":1,"19":2,"37":4,"39":2,"42":1}}],["info",{"2":{"4":4}}],["intl",{"2":{"40":1}}],["integrated",{"2":{"39":10}}],["integration",{"2":{"31":1}}],["interface",{"2":{"74":1}}],["interfaces",{"2":{"71":1}}],["intersection",{"2":{"41":1}}],["interval",{"2":{"39":2}}],["interceptors",{"2":{"1":2}}],["into",{"2":{"1":2}}],["init",{"2":{"1":2,"33":3}}],["us",{"2":{"39":2}}],["usenewswidget",{"2":{"44":1}}],["usei18n",{"2":{"44":1,"45":1}}],["useshoppingcart",{"2":{"44":1}}],["usescreensize",{"2":{"44":1}}],["uses",{"2":{"33":20}}],["use",{"2":{"22":1,"39":2,"51":1}}],["useauthservice",{"2":{"42":1}}],["useauthstore",{"2":{"42":1}}],["useauth",{"2":{"1":8,"42":1}}],["userloggedin",{"2":{"42":2}}],["username",{"2":{"33":4,"42":1}}],["user",{"2":{"1":4,"33":12,"39":6,"74":2}}],["userid",{"2":{"1":2}}],["users",{"2":{"1":13}}],["userdata",{"2":{"1":2}}],["unit",{"2":{"43":6}}],["unique",{"2":{"42":1}}],["unicodehighlight",{"2":{"39":2}}],["unlighthouse",{"2":{"39":4}}],["unocss",{"2":{"39":20}}],["uno",{"2":{"39":20}}],["untrackedchanges",{"2":{"39":2}}],["unpkg",{"2":{"8":2}}],["up",{"2":{"33":2,"39":2}}],["update",{"2":{"33":2,"39":2}}],["updating",{"2":{"33":2}}],["ubuntu",{"2":{"33":6}}],["ui",{"0":{"47":1,"52":1},"2":{"29":1,"38":2,"40":2,"43":1,"44":3,"45":2,"47":1,"49":1,"52":10,"74":1}}],["ux",{"2":{"29":2,"54":2,"74":1}}],["url",{"2":{"1":2,"35":3,"37":2}}],["utils",{"2":{"1":6,"36":3,"45":1}}],["fcp",{"2":{"54":1}}],["fetish",{"2":{"43":1}}],["fetch",{"2":{"1":1,"33":2}}],["fnc",{"2":{"40":1}}],["fu",{"2":{"39":1}}],["function",{"2":{"37":6}}],["functions",{"2":{"3":2,"42":1}}],["flow",{"2":{"71":1}}],["flowconfig",{"2":{"39":4}}],["flexbox",{"2":{"50":1,"70":2}}],["flake",{"2":{"39":4}}],["flash",{"2":{"6":1}}],["fls",{"2":{"39":2}}],["fdb",{"2":{"39":2}}],["frequently",{"2":{"75":1}}],["freezed",{"2":{"39":2}}],["from",{"2":{"1":18,"11":4,"19":6,"35":6,"36":4,"37":4,"38":4}}],["fontweight",{"2":{"39":2}}],["fontligatures",{"2":{"39":2}}],["fontfamily",{"2":{"39":2}}],["fontaliasing",{"2":{"39":2}}],["folder",{"2":{"33":2}}],["fork",{"2":{"73":1}}],["foreign",{"2":{"42":1}}],["formulate",{"2":{"39":20}}],["formkit",{"2":{"39":20}}],["formatter",{"2":{"39":2}}],["formatting",{"2":{"39":2}}],["formatonsave",{"2":{"39":2}}],["format",{"2":{"33":6,"39":4}}],["for=",{"2":{"16":2}}],["for",{"0":{"16":1},"2":{"16":1,"19":1,"33":2,"37":4,"39":2,"54":1}}],["fallback",{"2":{"37":1}}],["false",{"2":{"1":2,"33":4,"39":54,"42":2}}],["faq",{"0":{"73":1},"2":{"33":1,"75":1}}],["facebook",{"2":{"7":1}}],["fix",{"2":{"39":2}}],["fixall",{"2":{"39":4}}],["find",{"2":{"39":2}}],["fingerprint",{"2":{"2":1}}],["field",{"2":{"37":4}}],["fill",{"2":{"36":2}}],["filenesting",{"2":{"39":6}}],["filename",{"2":{"37":20}}],["filelistlayout",{"2":{"39":2}}],["files",{"2":{"33":2,"39":6}}],["file=",{"2":{"33":2}}],["file",{"2":{"33":4,"39":4}}],["fi",{"2":{"33":4}}],["firestore",{"2":{"53":1}}],["firebase",{"2":{"3":2,"34":2,"39":8}}],["fira",{"2":{"39":2}}],["first",{"2":{"22":1,"39":2}}],["article",{"2":{"50":1}}],["artisan",{"2":{"39":2}}],["azure",{"2":{"39":4}}],["air",{"2":{"39":2}}],["ava",{"2":{"39":20}}],["aux",{"2":{"39":2}}],["autocompleterefs",{"2":{"39":2}}],["autodetection",{"2":{"39":2}}],["autodetectcolorscheme",{"2":{"39":2}}],["autofetch",{"2":{"39":2}}],["autoupdate",{"2":{"39":2}}],["auto",{"2":{"36":2,"39":2}}],["authors",{"2":{"39":6}}],["authorization",{"2":{"2":2}}],["authinterceptor",{"2":{"1":4}}],["auth",{"2":{"1":6}}],["addextraspaceontop",{"2":{"39":2}}],["addresponseinterceptor",{"2":{"1":4}}],["angular",{"2":{"44":2}}],["an",{"2":{"42":2}}],["analysis",{"2":{"39":2,"71":1}}],["annotations",{"2":{"39":2}}],["antony",{"2":{"39":1}}],["antfu",{"2":{"39":5}}],["antialiased",{"2":{"39":2}}],["and",{"0":{"29":1},"2":{"33":8,"42":4,"53":1}}],["always",{"2":{"42":1}}],["alg",{"2":{"39":2}}],["all",{"2":{"39":2}}],["ally",{"2":{"39":6}}],["allowcompoundwords",{"2":{"39":2}}],["allows",{"2":{"39":2}}],["allow",{"2":{"4":7}}],["alias",{"2":{"38":2}}],["amp",{"2":{"33":8,"39":2}}],["amazon",{"2":{"3":2,"34":2}}],["after",{"2":{"33":2}}],["acr",{"2":{"39":2}}],["acn",{"2":{"39":2}}],["active",{"2":{"39":2}}],["activitybar",{"2":{"39":2}}],["actions",{"0":{"33":1},"2":{"31":1,"33":15,"39":1,"53":1,"59":1}}],["action",{"2":{"19":7,"33":14,"39":1}}],["accessibility",{"2":{"52":1}}],["accessibilitysupport",{"2":{"39":2}}],["access",{"2":{"2":5,"4":5,"74":1}}],["account",{"2":{"1":2,"35":2,"37":1}}],["apollo",{"2":{"39":4}}],["apache",{"2":{"34":1}}],["application",{"2":{"54":2}}],["appleboy",{"2":{"33":5}}],["appveyor",{"2":{"39":4}}],["appsettings",{"2":{"39":4}}],["app",{"2":{"8":9,"9":1,"10":2,"36":3,"45":1,"54":1}}],["api",{"0":{"1":1,"11":1},"2":{"1":18,"3":5,"5":2,"11":16,"18":1,"19":2,"34":2,"39":24,"41":4,"42":1,"44":1,"45":2,"53":3,"54":1,"60":1}}],["aws",{"2":{"3":1}}],["await",{"2":{"1":4}}],["a",{"2":{"3":1,"7":2,"37":2,"39":1,"41":4,"42":3,"45":1,"53":1,"54":1}}],["asked",{"2":{"75":1}}],["aside",{"2":{"50":1}}],["astro",{"2":{"39":2}}],["aspx",{"2":{"39":2}}],["ashx",{"2":{"39":2}}],["ascx",{"2":{"39":2}}],["asax",{"2":{"39":2}}],["assets",{"2":{"35":5,"37":4,"45":1}}],["as",{"2":{"3":1,"37":6}}],["async",{"2":{"1":2}}],["at",{"2":{"2":6,"39":2,"74":1}}],["axios",{"2":{"1":1}}],["=+",{"2":{"39":2}}],["==",{"2":{"33":6}}],["=",{"2":{"1":10,"7":2,"8":2,"11":6,"19":4,"33":6,"36":10,"37":12,"41":8,"42":2,"44":2}}],["бд",{"2":{"42":1}}],["брать",{"2":{"44":1}}],["брали",{"2":{"33":1}}],["браузеру",{"2":{"38":1}}],["браузеры",{"2":{"34":1,"54":1}}],["браузером",{"2":{"33":1,"54":1}}],["браузере",{"2":{"8":1,"9":1,"35":1,"54":3}}],["браузерами",{"2":{"6":1}}],["браузера",{"2":{"4":2,"6":1,"9":1,"29":1,"54":1}}],["браузер",{"2":{"2":1,"4":3,"9":4,"10":1,"43":1}}],["буквы",{"2":{"23":1}}],["буквами",{"2":{"22":1,"25":1}}],["булево",{"2":{"14":2}}],["будто",{"2":{"52":1}}],["будущее",{"2":{"19":1}}],["будущем",{"2":{"7":1}}],["будут",{"2":{"8":1,"11":1,"15":1,"19":1,"22":1,"25":1,"33":1}}],["будем",{"2":{"6":1,"7":1,"8":1,"9":2,"10":2,"11":3,"18":1,"20":1,"25":1,"26":1,"33":2}}],["будете",{"2":{"6":1,"38":1,"53":1}}],["будет",{"2":{"1":1,"3":2,"4":1,"5":1,"7":2,"8":3,"9":2,"11":2,"13":2,"14":3,"15":1,"16":1,"17":1,"18":1,"19":1,"33":1,"35":1,"39":1,"42":2,"43":3,"52":1,"53":2}}],["близко",{"2":{"54":1}}],["ближе",{"2":{"11":1}}],["блестящих",{"2":{"29":1}}],["благодаря",{"2":{"54":1}}],["благодарю",{"2":{"29":1}}],["благополучия",{"2":{"29":1}}],["блока",{"2":{"39":1}}],["блоки",{"2":{"9":1}}],["блог",{"2":{"2":1}}],["билдом",{"2":{"43":1}}],["билде",{"2":{"35":1}}],["билда",{"2":{"31":1,"33":2,"34":1,"38":1}}],["библиотекой",{"2":{"27":1,"42":1,"46":1}}],["библиотека",{"2":{"7":4,"41":1,"42":4,"46":1}}],["библиотек",{"0":{"47":1},"2":{"6":1,"7":2,"26":1,"40":1,"49":1,"52":7}}],["библиотеки",{"0":{"52":1},"2":{"6":1,"7":3,"9":1,"10":1,"38":1,"44":1,"47":1,"52":4}}],["библиотеку",{"0":{"40":1},"2":{"1":1,"7":2,"42":1,"45":1,"47":1,"52":1}}],["бизнес",{"2":{"3":1,"42":5,"44":1}}],["баги",{"2":{"45":1}}],["база",{"2":{"39":1,"42":1}}],["базам",{"2":{"39":1}}],["базовую",{"2":{"45":1}}],["базовых",{"2":{"9":1}}],["базовом",{"2":{"7":1,"53":1}}],["базовое",{"2":{"6":1}}],["базе",{"2":{"3":3,"42":1}}],["базу",{"2":{"3":1}}],["базы",{"2":{"3":1}}],["бандле",{"2":{"38":1}}],["бандла",{"2":{"35":1,"46":1}}],["бандл",{"2":{"3":1,"35":1,"41":1,"52":1}}],["бесполезно",{"2":{"53":1}}],["бесплатно",{"2":{"53":1}}],["бесплатной",{"2":{"8":1}}],["бесплатными",{"2":{"34":1}}],["бесплатные",{"2":{"3":3,"34":1,"53":1}}],["бешено",{"2":{"39":1}}],["бегло",{"2":{"9":1}}],["безвозвратно",{"2":{"40":1}}],["безопасного",{"2":{"29":1}}],["безопасность",{"2":{"2":3}}],["безопасности",{"2":{"2":2,"45":1}}],["без",{"2":{"3":2,"7":1,"31":1,"37":1,"39":1,"43":1,"44":2,"52":1,"53":1,"54":1}}],["бывают",{"2":{"43":1}}],["бывает",{"2":{"5":1,"42":1}}],["быстрей",{"2":{"38":1,"39":1,"44":1,"49":1}}],["быстрее",{"2":{"38":1}}],["быстрый",{"2":{"10":1,"39":1}}],["быстрого",{"2":{"43":1}}],["быстро",{"2":{"7":1,"27":1,"45":1,"52":1}}],["была",{"2":{"41":1,"52":1,"54":1}}],["было",{"2":{"19":1,"41":1,"44":3}}],["был",{"2":{"7":1,"25":1,"34":2,"42":2,"54":1}}],["были",{"2":{"6":3}}],["быть",{"2":{"2":1,"7":3,"9":1,"10":1,"11":3,"14":1,"15":1,"18":1,"19":3,"33":4,"35":1,"41":1,"43":1,"45":1,"48":1,"53":1,"54":3,"75":1}}],["бы",{"2":{"2":1,"53":2}}],["бота",{"2":{"54":2}}],["ботов",{"2":{"54":1}}],["боялся",{"2":{"53":1}}],["боковым",{"2":{"45":1}}],["бо́льшая",{"2":{"44":1}}],["бойлерплейта",{"2":{"44":1}}],["бонусная",{"2":{"29":1}}],["бонусами",{"2":{"2":1}}],["большую",{"2":{"44":1}}],["большой",{"2":{"11":1}}],["большого",{"2":{"7":1}}],["больше",{"2":{"8":1,"15":1,"19":1,"20":1,"29":1,"39":2,"44":2,"53":1,"54":2}}],["большей",{"2":{"7":1,"11":1}}],["большая",{"2":{"7":1,"53":1}}],["больших",{"2":{"11":1,"15":2,"33":1,"43":1,"44":3}}],["большим",{"2":{"10":1,"41":1,"43":2}}],["большими",{"2":{"3":1,"44":1}}],["большинстве",{"2":{"7":1,"41":1,"54":1}}],["большинство",{"2":{"3":2,"6":1,"53":1}}],["большие",{"2":{"2":1}}],["более",{"2":{"2":1,"4":2,"5":1,"7":1,"8":1,"10":1,"11":3,"16":1,"17":1,"25":1,"33":1,"35":1,"38":1,"41":1,"42":1,"44":3,"45":1,"53":2}}],["бороться",{"2":{"2":1}}],["бэке",{"2":{"5":1,"44":2}}],["бэкенде",{"2":{"5":1,"53":2}}],["бэкенда",{"2":{"3":1,"4":2,"54":1}}],["бэкенд",{"0":{"3":1},"2":{"2":5,"3":5,"4":2,"34":1,"43":1,"44":1}}],["бэкенду",{"2":{"1":1}}],["бэкендом",{"0":{"0":1},"1":{"1":1},"2":{"1":2,"4":1,"57":1}}],["бэком",{"2":{"5":1}}],["бэкапов",{"2":{"33":1}}],["бэкапить",{"2":{"33":1}}],["бэка",{"2":{"2":1,"3":1,"44":1}}],["бэк",{"2":{"1":1,"2":2,"3":1,"39":1}}],["дня",{"2":{"53":1}}],["дней",{"2":{"49":1,"53":1}}],["дриллинг",{"2":{"42":1}}],["другую",{"2":{"47":1}}],["друг",{"2":{"45":1}}],["других",{"2":{"7":2,"19":2,"34":1,"44":2}}],["другими",{"2":{"31":1,"42":1,"45":1,"54":1}}],["другим",{"2":{"7":1,"11":1}}],["другие",{"2":{"3":1,"5":1,"6":3,"7":1,"9":1,"10":3,"11":2,"18":1,"34":1,"35":1,"39":1,"44":1,"51":1,"54":1}}],["другого",{"2":{"11":1,"42":2}}],["другое",{"2":{"7":1,"11":2,"19":1,"42":1}}],["другой",{"2":{"4":1,"7":1,"9":1,"33":1,"42":4,"45":1,"53":1}}],["другом",{"2":{"3":1,"11":1,"37":1,"45":1}}],["дюймов",{"2":{"39":1}}],["диаграммы",{"2":{"51":1}}],["диаграмму",{"2":{"9":1}}],["динамической",{"2":{"54":1}}],["динамическое",{"2":{"12":1}}],["динамически",{"2":{"54":1}}],["динамично",{"2":{"35":1,"44":1}}],["директорий",{"2":{"36":1}}],["директорию",{"2":{"33":1}}],["директория",{"2":{"33":2}}],["директива",{"2":{"12":1,"13":1,"14":1,"17":1,"18":1}}],["директивами",{"2":{"12":1}}],["директив",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"18":1,"19":2,"26":1}}],["директивы",{"2":{"10":1,"12":2,"15":1,"18":2,"27":1}}],["дисциплине",{"2":{"29":1}}],["дисковое",{"2":{"38":1}}],["диск",{"2":{"2":1,"39":1}}],["дизайна",{"2":{"44":1}}],["дизайнерами",{"2":{"29":1}}],["дизайн",{"2":{"29":1,"74":1}}],["д",{"2":{"3":1,"7":1,"8":1,"10":1,"11":2,"17":1,"19":1,"50":1,"54":1}}],["дойти",{"2":{"54":1}}],["домашний",{"2":{"54":1}}],["доменов",{"2":{"4":1}}],["доменом",{"2":{"4":1}}],["домен",{"2":{"4":1,"34":3,"53":1}}],["домена",{"2":{"4":4,"34":1}}],["доброжелательные",{"2":{"53":1}}],["добавьте",{"2":{"33":1}}],["добавили",{"2":{"11":1}}],["добавить",{"2":{"39":1,"45":2,"52":1}}],["добавит",{"2":{"4":1}}],["добавление",{"2":{"41":1,"44":1,"73":1}}],["добавления",{"2":{"7":1}}],["добавляются",{"2":{"54":1}}],["добавлялись",{"2":{"6":1}}],["добавляется",{"2":{"35":1}}],["добавляет",{"2":{"4":1,"45":1,"52":1}}],["документ",{"2":{"52":1}}],["документирования",{"2":{"51":1}}],["документируйте",{"0":{"51":1}}],["документаций",{"2":{"54":1}}],["документация",{"2":{"42":1,"53":3,"75":1}}],["документации",{"2":{"18":1,"19":1,"33":1,"35":1,"53":1,"74":1}}],["документацию",{"2":{"7":1,"19":1}}],["документа",{"2":{"14":1}}],["допустим",{"2":{"45":1}}],["дополнительных",{"2":{"11":1,"31":1}}],["дополнительным",{"2":{"9":1}}],["дополнительные",{"2":{"6":1,"7":1,"54":1}}],["дополнительной",{"2":{"7":2}}],["доскролил",{"2":{"41":1}}],["достойны",{"2":{"53":1}}],["достаточно",{"2":{"39":1,"40":1,"44":1,"45":1,"54":1}}],["доставка",{"2":{"31":1}}],["доставки",{"2":{"8":1}}],["достижений",{"2":{"10":1}}],["доступе",{"2":{"53":1}}],["доступен",{"2":{"34":1}}],["доступной",{"2":{"42":1}}],["доступна",{"2":{"42":1}}],["доступными",{"2":{"29":1}}],["доступны",{"2":{"11":1,"35":1}}],["доступа",{"2":{"2":5,"3":1,"4":1,"11":1,"33":1,"39":1}}],["доступ",{"2":{"1":1,"2":3,"3":3,"4":8,"11":4,"34":1,"35":1,"42":2}}],["дочерние",{"2":{"19":1}}],["дочернего",{"2":{"11":1}}],["дороги",{"2":{"15":1}}],["догадались",{"2":{"10":1}}],["до",{"2":{"6":2,"7":2,"9":1,"11":1,"18":1,"19":1,"26":2,"35":1,"41":1,"54":3}}],["доводить",{"2":{"26":1}}],["довольно",{"2":{"3":2,"5":1,"39":1,"53":1,"54":1}}],["доверенных",{"2":{"4":2}}],["должна",{"2":{"7":1,"10":1,"11":1,"19":1,"33":1,"53":1}}],["должны",{"2":{"7":1,"9":2,"35":1,"41":1,"48":1}}],["должном",{"2":{"52":1}}],["должно",{"2":{"2":1,"3":1,"18":1,"43":1}}],["должен",{"2":{"2":1,"7":2,"16":1,"33":2,"42":1,"54":1}}],["дольше",{"2":{"2":1}}],["двоеточия",{"2":{"18":1}}],["двоеточие",{"2":{"13":1}}],["двойные",{"2":{"8":1}}],["двусмысленное",{"2":{"42":1}}],["двусторонним",{"2":{"17":1}}],["двухдневный",{"2":{"53":1}}],["двух",{"2":{"7":1}}],["двунаправленную",{"2":{"5":1}}],["два",{"2":{"2":1,"11":1,"16":1,"19":1,"45":1,"53":2,"54":2}}],["две",{"2":{"2":1,"5":1,"11":1}}],["даёт",{"2":{"39":1,"44":1,"53":1}}],["дат",{"2":{"41":1}}],["датами",{"2":{"40":1}}],["дату",{"2":{"33":1}}],["датой",{"2":{"33":1}}],["дать",{"2":{"2":1}}],["давид",{"2":{"29":1}}],["давайте",{"2":{"7":2,"8":1,"10":1,"11":2,"20":1}}],["давать",{"2":{"2":1}}],["даст",{"2":{"29":1,"44":1}}],["дадим",{"2":{"29":1}}],["да",{"2":{"11":2}}],["даже",{"2":{"2":1,"4":1,"6":2,"7":2,"19":1,"26":1,"41":1,"42":2,"44":1,"52":1,"53":2}}],["дает",{"2":{"2":1,"5":2,"11":1,"14":1,"41":1}}],["дал",{"2":{"42":1}}],["дальнейших",{"2":{"29":1}}],["дальнейшей",{"2":{"19":1,"27":1}}],["дальнейшем",{"2":{"9":1,"18":1,"52":1}}],["дальше",{"2":{"2":1,"7":1,"49":1}}],["далеко",{"2":{"3":1,"43":1,"46":1}}],["далее",{"2":{"2":1,"7":1,"8":1,"11":1,"25":1}}],["данная",{"2":{"44":1,"54":1}}],["данного",{"0":{"73":1},"2":{"33":1,"41":1,"42":1,"45":1}}],["данном",{"2":{"7":1,"8":1,"10":1,"11":1,"33":1,"42":1,"44":1}}],["данной",{"2":{"2":1,"12":1}}],["данный",{"2":{"11":1,"52":1,"75":1}}],["данным",{"2":{"4":1,"53":1}}],["данными",{"2":{"3":3}}],["данных",{"2":{"3":7,"4":1,"5":1,"7":2,"11":3,"16":1,"17":1,"29":1,"39":2,"42":4,"44":2,"45":1,"53":1,"54":1}}],["данные",{"2":{"2":2,"3":3,"4":1,"22":1,"41":1,"42":3,"44":4,"53":1,"54":3}}],["десктоп",{"2":{"54":1}}],["десятки",{"2":{"38":1,"39":1}}],["десятилетнем",{"2":{"37":1}}],["держать",{"2":{"53":1}}],["дереву",{"2":{"42":1}}],["дерева",{"2":{"19":1}}],["дерево",{"2":{"9":1}}],["детей",{"2":{"53":1}}],["детали",{"2":{"51":1}}],["детальную",{"2":{"45":1}}],["деталях",{"2":{"17":1}}],["декомпозиции",{"2":{"44":1}}],["декларируемое",{"2":{"42":1}}],["деньги",{"2":{"39":1}}],["деплое",{"2":{"33":1}}],["деплоится",{"2":{"33":1}}],["деплоить",{"2":{"33":1}}],["деплой",{"2":{"33":1,"59":1,"60":1}}],["деплоя",{"2":{"33":4,"53":1}}],["депозитами",{"2":{"2":1}}],["девопс",{"2":{"31":1}}],["делиться",{"2":{"42":1}}],["деле",{"2":{"25":1}}],["делайте",{"2":{"46":1,"48":1}}],["дела",{"2":{"45":1}}],["делающее",{"2":{"42":1}}],["делали",{"2":{"35":1}}],["делаем",{"2":{"11":1}}],["делается",{"2":{"2":1,"11":1}}],["делает",{"2":{"2":1,"5":1,"8":1,"10":1,"38":1,"39":1,"42":1,"44":1}}],["делать",{"2":{"3":1,"4":1,"39":1,"41":1,"42":1,"54":2}}],["действительно",{"2":{"37":1,"43":1}}],["действительная",{"2":{"2":1}}],["действий",{"2":{"31":1}}],["действии",{"2":{"9":1}}],["действия",{"2":{"2":1,"43":1}}],["действие",{"2":{"2":2,"9":1}}],["для",{"0":{"3":1,"27":1},"2":{"1":1,"2":4,"3":3,"4":3,"5":5,"6":4,"7":8,"8":5,"9":5,"10":9,"11":11,"15":2,"16":2,"18":3,"19":6,"20":1,"22":1,"25":4,"26":1,"27":2,"29":5,"31":1,"33":12,"34":3,"35":2,"36":1,"37":2,"38":8,"39":9,"40":2,"41":7,"42":5,"43":3,"44":8,"45":4,"47":1,"48":2,"49":1,"51":1,"52":2,"53":6,"54":18,"75":1}}],["тэгов",{"2":{"52":1}}],["тяжеловеса",{"2":{"41":1}}],["тяжеловесности",{"2":{"40":1}}],["тише",{"2":{"39":1}}],["тип",{"2":{"52":1}}],["типов",{"2":{"43":1}}],["типыref",{"2":{"42":1}}],["типы",{"2":{"17":1,"42":1}}],["типа",{"2":{"4":1,"10":1,"34":1,"35":1,"38":1,"45":1,"52":3,"53":1,"54":1}}],["тайлвинде",{"2":{"49":1}}],["таймстемпа",{"2":{"33":1}}],["тарифы",{"2":{"34":1}}],["таблицы",{"2":{"6":1}}],["там",{"2":{"3":1,"33":2,"39":1,"42":1,"43":1}}],["такую",{"2":{"9":1}}],["таки",{"2":{"53":1,"54":1}}],["такие",{"2":{"7":1,"17":2}}],["таким",{"2":{"2":2,"3":1,"8":1,"9":1,"16":1,"52":1}}],["также",{"2":{"2":2,"3":1,"6":2,"7":3,"10":3,"11":1,"12":2,"18":2,"19":2,"25":1,"34":1,"38":1,"39":1,"42":1,"43":1,"44":2,"47":1,"52":2,"53":5,"54":1,"73":1}}],["такого",{"2":{"11":1}}],["такой",{"2":{"11":1,"54":1}}],["таковыми",{"2":{"52":1}}],["таковы",{"2":{"7":1}}],["такового",{"2":{"2":1}}],["такое",{"2":{"2":2,"3":1,"4":1,"5":1,"6":1,"7":2,"9":1,"19":1,"27":1,"31":1,"33":1,"42":1,"43":1,"44":1,"45":1,"52":1,"54":1}}],["так",{"2":{"1":1,"2":1,"5":1,"6":1,"7":1,"8":1,"11":3,"15":2,"25":1,"33":3,"38":1,"39":1,"42":2,"43":1,"53":1,"54":3,"75":2}}],["т",{"2":{"3":1,"7":1,"8":1,"10":1,"11":2,"17":1,"19":1,"43":1,"45":1,"50":1,"54":1,"74":1}}],["тупиковой",{"2":{"54":1}}],["туда",{"2":{"3":1,"10":1,"48":1}}],["тут",{"2":{"3":1}}],["твой",{"2":{"2":1,"3":1,"39":1}}],["твоего",{"2":{"2":1}}],["твоему",{"2":{"2":1,"3":1}}],["твоем",{"2":{"2":1,"39":1}}],["ты",{"2":{"2":1,"45":1}}],["телеграм",{"2":{"75":1}}],["телодвижения",{"2":{"2":1}}],["тенденции",{"2":{"52":1}}],["тень",{"2":{"45":1}}],["тебе",{"2":{"45":1}}],["теcты",{"2":{"43":1}}],["тест",{"2":{"53":1}}],["тесты",{"2":{"43":7,"54":1}}],["тестам",{"2":{"42":1}}],["тестов",{"2":{"29":1,"43":3}}],["тестированием",{"2":{"43":2}}],["тестирование",{"0":{"43":1},"2":{"29":1,"43":2}}],["тестирования",{"2":{"3":1,"31":1,"33":1,"43":2}}],["те",{"2":{"12":1}}],["течение",{"2":{"11":1}}],["текущей",{"2":{"33":1,"41":1}}],["текущему",{"2":{"11":1}}],["текстовое",{"2":{"54":1}}],["текстов",{"2":{"29":1}}],["текстовый",{"2":{"10":1,"54":1}}],["текст",{"2":{"17":1,"54":2}}],["теге",{"2":{"12":1}}],["тег",{"2":{"8":1,"10":3,"11":1}}],["тега",{"2":{"8":2}}],["технического",{"2":{"51":1,"53":1}}],["технология",{"2":{"31":1}}],["технологии",{"2":{"6":1,"38":1,"53":1}}],["технологий",{"2":{"6":1}}],["тех",{"2":{"7":1,"19":1,"54":1}}],["теоретические",{"2":{"45":1}}],["теоретически",{"2":{"7":1}}],["теперь",{"2":{"7":1,"11":3,"19":1}}],["терминологией",{"2":{"7":1}}],["терминов",{"2":{"7":1}}],["терминами",{"2":{"7":1}}],["темам",{"2":{"75":1}}],["темы",{"2":{"6":1,"45":1}}],["теми",{"2":{"6":1}}],["тему",{"2":{"5":1,"43":1}}],["тем",{"2":{"5":2,"7":2,"9":1,"10":1,"11":2,"17":1,"29":1,"42":1}}],["теме",{"2":{"2":1,"4":1}}],["трудозатратней",{"2":{"54":1}}],["трудозатратам",{"2":{"54":1}}],["трудно",{"2":{"11":1}}],["трудностями",{"2":{"7":1}}],["трудностей",{"2":{"5":1}}],["тривиального",{"2":{"11":1}}],["три",{"2":{"10":1,"33":2}}],["трагедия",{"2":{"52":1}}],["традиционно",{"2":{"10":1}}],["традиционном",{"2":{"7":2}}],["транспиляции",{"2":{"38":1}}],["транспортные",{"2":{"5":1,"53":1}}],["транспортным",{"2":{"1":1}}],["трансформацию",{"2":{"6":1}}],["требования",{"2":{"52":1,"54":1}}],["требований",{"2":{"2":1}}],["требуются",{"2":{"41":1}}],["требуют",{"2":{"19":1,"34":1}}],["требуеться",{"2":{"38":1}}],["требует",{"2":{"5":1,"38":1}}],["требуется",{"2":{"3":1}}],["товаров",{"2":{"45":1}}],["товара",{"2":{"2":1,"45":1,"54":1}}],["торопитесь",{"2":{"46":1}}],["тормозит",{"2":{"45":1}}],["торговые",{"2":{"7":1}}],["тоже",{"2":{"44":1,"54":1}}],["тонкую",{"2":{"39":1}}],["тонкий",{"2":{"11":2}}],["той",{"2":{"15":1,"33":1,"42":1}}],["точней",{"2":{"54":1}}],["точно",{"2":{"4":1,"25":1}}],["точка",{"2":{"54":1}}],["точки",{"2":{"10":1,"29":1,"42":3,"74":1}}],["точку",{"2":{"8":1}}],["тот",{"2":{"7":2,"11":1,"44":1,"53":1}}],["том",{"2":{"6":1,"7":4,"8":1,"9":1,"11":1,"15":1,"29":1,"54":1}}],["тобой",{"2":{"3":1}}],["то",{"2":{"2":4,"3":3,"7":7,"9":1,"10":2,"11":3,"13":2,"14":1,"19":1,"27":2,"33":1,"34":1,"38":1,"39":1,"41":2,"42":5,"43":4,"44":1,"45":3,"47":2,"53":4,"54":6}}],["того",{"2":{"2":1,"7":2,"8":2,"11":7,"18":1,"27":1,"33":3,"38":2,"42":1,"44":1,"45":1,"46":1,"54":3}}],["тогда",{"2":{"1":1,"18":1}}],["только",{"2":{"2":2,"3":1,"4":2,"7":1,"8":1,"9":1,"10":1,"11":2,"13":2,"15":1,"20":1,"31":1,"37":1,"39":3,"41":2,"42":4,"44":1,"49":1,"52":2}}],["токена",{"2":{"2":2}}],["токенах",{"2":{"2":2}}],["токеном",{"2":{"2":1}}],["токену",{"2":{"2":1}}],["токен",{"2":{"2":7,"74":2}}],["вряд",{"2":{"53":1}}],["вроде",{"2":{"42":1,"54":1}}],["вращающихся",{"2":{"39":1}}],["время",{"2":{"7":2,"8":2,"9":1,"11":1,"19":1,"39":1,"41":1,"42":1,"43":5,"45":1,"46":1,"48":1,"53":1}}],["времена",{"2":{"52":1}}],["временами",{"2":{"6":1}}],["времени",{"2":{"11":1,"43":1,"48":1,"52":1,"53":1}}],["временем",{"2":{"11":1,"33":1}}],["временное",{"2":{"4":1}}],["вторых",{"2":{"53":1}}],["вторично",{"2":{"39":1}}],["второй",{"2":{"39":3}}],["втором",{"2":{"2":2}}],["введите",{"2":{"73":1}}],["введи",{"2":{"45":1}}],["введенный",{"2":{"41":1}}],["введем",{"2":{"8":1}}],["вводились",{"2":{"44":1}}],["вводить",{"2":{"46":1}}],["вводит",{"2":{"17":1}}],["вводе",{"2":{"44":1}}],["ввода",{"2":{"17":1}}],["влияет",{"2":{"12":1,"46":1}}],["входе",{"2":{"54":1}}],["входа",{"2":{"10":1,"44":1,"54":1}}],["входит",{"2":{"4":1,"74":1}}],["впечатление",{"2":{"74":1}}],["вперед",{"2":{"18":1}}],["вплоть",{"2":{"7":1}}],["вполне",{"2":{"2":1,"42":1,"44":1,"53":1}}],["взлетевших",{"2":{"44":1}}],["взлететь",{"2":{"39":1}}],["взяли",{"2":{"45":1}}],["взяв",{"2":{"44":1}}],["взять",{"2":{"7":1}}],["взгляд",{"2":{"11":1,"29":1}}],["взглянуть",{"2":{"5":1}}],["взвесить",{"2":{"7":1}}],["взаимодействия",{"2":{"45":1}}],["взаимодействий",{"2":{"6":1}}],["взаимозаменяемые",{"2":{"7":1}}],["вниз",{"2":{"75":1}}],["внимание",{"2":{"6":1,"7":1,"8":3,"10":1,"11":1}}],["вновь",{"2":{"52":1}}],["вносит",{"2":{"52":1}}],["вносят",{"2":{"6":1}}],["внутрь",{"2":{"39":1}}],["внутренние",{"2":{"44":1}}],["внутренних",{"2":{"19":1}}],["внутренней",{"2":{"19":1}}],["внутреннем",{"2":{"11":1}}],["внутри",{"2":{"7":3,"8":2,"16":1,"35":1,"41":3,"42":1}}],["внесения",{"2":{"73":1}}],["внесенных",{"2":{"7":1}}],["внесите",{"0":{"73":1}}],["внешней",{"2":{"42":1}}],["внешнего",{"2":{"6":1}}],["внешний",{"2":{"6":1}}],["включается",{"2":{"39":1}}],["включать",{"2":{"6":1,"39":1}}],["включая",{"2":{"6":1,"38":1,"39":1,"52":1}}],["вместе",{"2":{"5":1,"19":1,"46":1}}],["вместо",{"2":{"4":1,"9":1,"10":1,"11":1,"38":1,"54":1}}],["ветвью",{"2":{"54":1}}],["ветках",{"2":{"42":1}}],["ветки",{"2":{"33":2}}],["ветку",{"2":{"33":2}}],["вести",{"2":{"54":1}}],["веса",{"2":{"52":1}}],["весь",{"2":{"9":1,"11":1}}],["весьма",{"2":{"7":1}}],["вентиляторов",{"2":{"39":1}}],["ведет",{"2":{"18":1}}],["ведут",{"2":{"15":1,"16":1}}],["ведущие",{"2":{"9":1}}],["великолепным",{"2":{"10":1}}],["верен",{"2":{"54":1}}],["верстку",{"2":{"52":1}}],["верстать",{"2":{"49":1,"52":1}}],["версию",{"2":{"33":1,"53":1,"54":1}}],["версии",{"2":{"33":2}}],["версия",{"2":{"6":1}}],["верхнего",{"2":{"23":1}}],["вернулся",{"2":{"52":1}}],["вернуть",{"2":{"11":1}}],["верное",{"2":{"7":1}}],["вернет",{"2":{"4":1}}],["вероятность",{"2":{"7":1,"43":1,"45":1}}],["веба",{"2":{"52":1}}],["вебсервер",{"2":{"34":1,"39":1,"54":1}}],["вебсервере",{"2":{"34":1}}],["вебсервера",{"2":{"4":1,"39":1}}],["вебсайта",{"2":{"33":1,"74":1}}],["вебсайт",{"2":{"33":1}}],["веб",{"0":{"8":1},"1":{"9":1},"2":{"4":2,"6":4,"7":2,"8":2,"9":2,"10":1,"13":1,"16":1,"29":1,"39":1,"43":1,"45":2,"54":3}}],["вещи",{"2":{"3":1,"41":1}}],["визуальной",{"2":{"74":1}}],["визуальных",{"2":{"44":1}}],["визуализации",{"2":{"52":1}}],["визуализацию",{"2":{"42":1,"44":1}}],["виртуальный",{"2":{"3":1,"34":1,"53":1}}],["виджетов",{"2":{"42":1}}],["видимой",{"2":{"37":1}}],["видит",{"2":{"2":1}}],["виду",{"2":{"14":1}}],["вида",{"2":{"6":1}}],["вид",{"2":{"6":1}}],["видео",{"2":{"35":1,"53":3,"54":1}}],["видели",{"2":{"18":1}}],["виде",{"2":{"3":2,"6":1,"7":2,"10":1}}],["видно",{"2":{"2":1}}],["встречал",{"2":{"53":1}}],["встретить",{"2":{"20":1,"25":1}}],["встроенные",{"0":{"19":1}}],["встроенных",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"18":1,"19":1}}],["встроенного",{"2":{"6":1}}],["вставке",{"2":{"19":1}}],["вступает",{"2":{"9":1}}],["вскоре",{"2":{"6":1}}],["всём",{"2":{"42":1}}],["всё",{"2":{"4":1,"39":1,"44":2,"45":1,"53":1,"54":1,"74":1}}],["всевозможных",{"2":{"53":1}}],["всей",{"2":{"9":1}}],["всегда",{"2":{"7":2,"10":1,"21":1,"25":1,"35":1,"42":1,"46":1}}],["всего",{"2":{"2":1,"3":1,"13":1,"41":2,"42":1,"53":1}}],["всех",{"2":{"4":1,"25":1,"44":2,"54":1}}],["всеми",{"2":{"54":2}}],["всемирная",{"2":{"6":1}}],["всему",{"2":{"10":1,"42":2,"45":1}}],["всем",{"2":{"4":2,"41":1,"45":1}}],["все",{"2":{"2":1,"6":3,"7":1,"8":1,"9":1,"10":2,"11":5,"14":1,"18":1,"19":1,"20":1,"25":2,"26":1,"41":1,"44":1,"52":1,"53":1,"54":1}}],["всячески",{"2":{"73":1}}],["всяких",{"2":{"54":1}}],["вся",{"2":{"1":1,"52":1}}],["воркер",{"2":{"74":1}}],["вообще",{"2":{"35":1,"37":1,"39":2,"54":1}}],["воплотить",{"2":{"29":1}}],["вопросах",{"2":{"75":1}}],["вопроса",{"2":{"73":1}}],["вопросами",{"2":{"27":1}}],["вопросе",{"2":{"53":1}}],["вопросов",{"2":{"53":1,"75":1}}],["вопросом",{"2":{"43":1}}],["вопросы",{"0":{"27":1},"2":{"27":1,"75":1}}],["вопрос",{"2":{"7":2,"53":1,"73":1}}],["воспользоваться",{"2":{"27":1,"39":1,"54":1}}],["воспринимайте",{"2":{"7":1}}],["восстановлено",{"2":{"19":1}}],["волнуйтесь",{"2":{"9":1}}],["волшебства",{"2":{"7":1}}],["вот",{"2":{"4":1,"5":1,"10":1,"11":2,"16":1,"17":1,"39":1,"40":1,"45":1,"53":1}}],["во",{"0":{"42":1},"2":{"2":2,"8":3,"9":1,"11":1,"19":1,"25":1,"39":2,"41":4,"42":7,"43":1,"44":3,"52":1,"53":2,"54":1}}],["возможным",{"2":{"42":1}}],["возможностях",{"2":{"54":1}}],["возможностей",{"2":{"6":1,"39":1,"40":1,"41":1,"54":1}}],["возможности",{"0":{"50":1},"2":{"6":3,"33":1,"38":1,"41":1,"44":1}}],["возможностью",{"2":{"3":1,"34":1}}],["возможность",{"2":{"2":2,"3":3,"7":1,"11":1,"43":1,"44":1,"46":1}}],["возможно",{"2":{"3":1,"11":1,"27":1,"29":1,"33":1,"44":3,"45":1}}],["возвращайтесь",{"2":{"53":1}}],["возвращающая",{"2":{"41":1}}],["возвращающей",{"2":{"11":1}}],["возвращаемое",{"2":{"17":1}}],["возвращается",{"2":{"35":1}}],["возвращает",{"2":{"2":2,"3":1,"8":2,"11":1}}],["возьмет",{"2":{"8":1}}],["возьмем",{"2":{"7":1}}],["возрасти",{"2":{"7":1}}],["возникает",{"2":{"7":1}}],["возникнуть",{"2":{"4":1}}],["вокруг",{"2":{"1":1,"42":1}}],["валидация",{"2":{"42":1}}],["валиден",{"2":{"2":1}}],["ванильному",{"2":{"11":1}}],["важных",{"2":{"29":1}}],["важны",{"2":{"27":1,"43":1}}],["важные",{"2":{"7":1,"29":1,"51":1}}],["важно",{"2":{"9":1,"10":1,"11":1,"14":1,"25":2}}],["вам",{"2":{"7":4,"8":1,"10":1,"11":2,"20":1,"27":2,"29":2,"34":1,"35":1,"38":1,"46":1,"52":1,"53":1,"54":1}}],["варианта",{"2":{"53":1}}],["вариантами",{"2":{"29":1}}],["вариант",{"2":{"5":1,"7":2,"41":1,"53":1}}],["варианты",{"0":{"3":1,"11":1},"2":{"2":1,"6":1,"34":1}}],["вариантов",{"2":{"2":1,"7":1,"8":1,"38":1}}],["вас",{"2":{"10":1,"27":1,"41":1,"42":1}}],["васи",{"2":{"2":1}}],["вася",{"2":{"2":1}}],["ваши",{"2":{"42":1}}],["ваша",{"2":{"25":1}}],["ваше",{"2":{"7":1,"35":1,"46":1,"73":1}}],["вашей",{"2":{"7":1}}],["вашего",{"2":{"4":1,"7":1,"19":1,"33":2,"34":1,"46":2,"48":1,"54":1}}],["вашему",{"2":{"1":1,"34":2,"42":1}}],["вашем",{"2":{"1":1,"35":1,"54":1}}],["ваш",{"2":{"3":1,"7":1,"8":1,"25":1,"33":2,"35":1,"41":1,"51":1,"53":1,"54":2}}],["вашу",{"2":{"1":1,"7":1}}],["в",{"0":{"8":1,"12":1,"20":1,"73":1},"1":{"9":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":5,"2":18,"3":9,"4":8,"5":1,"6":13,"7":36,"8":13,"9":12,"10":13,"11":37,"12":4,"13":1,"14":1,"15":6,"16":4,"17":5,"18":6,"19":12,"20":3,"21":1,"22":1,"23":1,"24":1,"25":5,"26":2,"27":3,"29":8,"31":2,"33":15,"34":3,"35":15,"37":1,"38":14,"39":13,"40":2,"41":11,"42":35,"43":5,"44":16,"45":7,"46":2,"52":11,"53":9,"54":22,"60":1,"75":3}}],["выявлении",{"2":{"54":1}}],["выше",{"2":{"54":1}}],["вышедшая",{"2":{"53":1}}],["выгоде",{"2":{"54":1}}],["выглядят",{"2":{"40":1,"42":1}}],["выглядит",{"2":{"11":1,"16":1,"42":1,"54":2}}],["выглядеть",{"2":{"1":1}}],["выучить",{"2":{"53":1}}],["выделяет",{"2":{"44":1}}],["выделить",{"2":{"1":1}}],["выборе",{"2":{"53":1}}],["выбору",{"2":{"33":1}}],["выбрать",{"2":{"39":1}}],["выбирает",{"2":{"8":1}}],["выбирая",{"2":{"7":2}}],["вывод",{"2":{"39":1,"54":1}}],["вывода",{"2":{"19":1}}],["вывести",{"2":{"19":1}}],["выведенных",{"2":{"4":1}}],["вычисления",{"2":{"44":1,"45":1}}],["вычислительном",{"2":{"15":1}}],["вычисляемые",{"2":{"11":1}}],["выражаю",{"2":{"29":1}}],["выражение",{"2":{"18":1}}],["выражением",{"2":{"15":1}}],["выработайте",{"2":{"11":1}}],["выработки",{"2":{"7":1}}],["выходы",{"2":{"11":1}}],["выходящие",{"2":{"6":1}}],["выигрыш",{"2":{"7":1}}],["вы",{"2":{"6":1,"7":7,"8":1,"9":2,"10":4,"11":3,"20":1,"25":3,"27":3,"34":2,"35":1,"37":1,"38":1,"42":3,"47":1,"49":1,"53":1,"73":1}}],["высокой",{"2":{"6":1}}],["вытеснены",{"2":{"6":1}}],["выполнена",{"2":{"18":1}}],["выполнением",{"2":{"9":1}}],["выполнения",{"2":{"8":1,"9":3,"18":1,"19":1,"33":1,"41":1}}],["выполнить",{"2":{"45":1}}],["выполнит",{"2":{"9":2}}],["выполняет",{"2":{"54":1}}],["выполняется",{"2":{"3":1,"11":2,"16":1}}],["выполняют",{"2":{"42":1,"44":1,"53":1}}],["выполняются",{"2":{"8":1}}],["выполнять",{"2":{"15":1}}],["выписан",{"2":{"2":2}}],["вызвало",{"2":{"11":1}}],["вызвать",{"2":{"3":1}}],["вызывает",{"2":{"18":1}}],["вызываем",{"2":{"8":2}}],["вызываться",{"2":{"3":1}}],["вызов",{"2":{"8":1}}],["вызовет",{"2":{"5":1}}],["вызовов",{"2":{"1":1}}],["охватывает",{"2":{"75":1}}],["оффлайн",{"2":{"54":2}}],["официально",{"2":{"42":1}}],["официальной",{"2":{"18":1,"19":1}}],["официальная",{"2":{"42":1,"75":1}}],["официальные",{"2":{"39":1}}],["официальным",{"2":{"9":1}}],["ощущениям",{"2":{"54":1}}],["окном",{"2":{"45":1}}],["окружению",{"2":{"33":1}}],["окружения",{"2":{"33":1,"34":1}}],["окружений",{"2":{"33":1}}],["окружение",{"2":{"19":1}}],["окружает",{"2":{"10":2}}],["ом",{"2":{"44":1,"54":1}}],["ооп",{"2":{"42":1,"44":1,"45":3}}],["очищаются",{"2":{"19":1}}],["очевидно",{"2":{"9":1}}],["очевидным",{"2":{"8":1,"10":1}}],["очередь",{"2":{"8":1,"42":2}}],["очень",{"2":{"2":3,"3":2,"7":1,"8":1,"9":2,"11":1,"16":1,"34":1,"38":1,"39":4,"41":3,"42":1,"43":1,"44":1,"51":1,"52":1,"53":3,"54":3}}],["ожидает",{"2":{"14":1,"18":1}}],["ожидаемые",{"2":{"11":1}}],["оговорками",{"2":{"11":1}}],["ограничений",{"2":{"11":1,"42":1,"54":1}}],["ограничения",{"2":{"7":1,"52":1}}],["ограничивает",{"2":{"10":1}}],["огромные",{"2":{"7":1}}],["огромная",{"2":{"7":1}}],["ошибок",{"2":{"60":1}}],["ошибка",{"2":{"11":1,"45":1}}],["ошибки",{"2":{"4":1,"39":1}}],["ошибетесь",{"2":{"10":1}}],["ознакомьтесь",{"2":{"53":1}}],["ознакомились",{"2":{"9":1}}],["ознакомиться",{"2":{"2":1}}],["означает",{"2":{"7":2,"11":1}}],["ориентированных",{"2":{"45":1}}],["ориентированными",{"2":{"10":1}}],["ориентированного",{"2":{"44":1}}],["ориентированное",{"2":{"44":1}}],["ориентация",{"2":{"7":1}}],["организовывать",{"2":{"11":1}}],["организовать",{"2":{"5":1,"9":1,"11":1}}],["организация",{"2":{"11":1}}],["организации",{"2":{"8":1,"34":1,"44":1}}],["о",{"0":{"28":1,"44":1},"1":{"29":1},"2":{"6":1,"7":1,"8":2,"9":1,"10":1,"11":1,"29":2,"37":1,"41":2,"44":2,"54":2,"60":1}}],["одну",{"2":{"44":1}}],["одним",{"2":{"10":1,"11":1}}],["однако",{"2":{"7":2,"10":1,"11":5,"25":1,"26":1,"40":1,"41":1,"42":2,"52":1,"53":2,"54":2}}],["одного",{"2":{"42":2}}],["однозначно",{"2":{"39":1,"44":1}}],["одностраничные",{"2":{"29":1}}],["одном",{"2":{"10":1,"44":1}}],["однофайловый",{"2":{"10":1}}],["однофайловых",{"0":{"10":1},"2":{"8":1}}],["однофайловые",{"2":{"6":1,"27":1}}],["одной",{"2":{"7":3,"35":1,"42":1}}],["одно",{"2":{"7":1,"11":1,"33":1,"44":1}}],["одинаковыми",{"2":{"38":1}}],["один",{"2":{"2":2,"9":1,"10":1,"13":1,"19":1,"38":1,"42":4,"43":1,"54":1}}],["опционально",{"2":{"73":1}}],["опции",{"2":{"10":1,"11":1,"41":1}}],["оповестить",{"2":{"44":1}}],["оперативной",{"2":{"39":1}}],["операций",{"2":{"15":1}}],["описываются",{"2":{"75":1}}],["описывающие",{"2":{"11":1}}],["описывайте",{"2":{"51":1}}],["описан",{"2":{"33":1}}],["описания",{"2":{"11":1}}],["описание",{"2":{"10":1,"19":1,"54":1}}],["описаны",{"2":{"6":1}}],["описать",{"2":{"10":1}}],["оптимизация",{"2":{"54":1}}],["оптимизаций",{"2":{"9":1}}],["оптимизировать",{"2":{"9":1}}],["опытный",{"2":{"53":1}}],["опытных",{"2":{"5":1,"75":2}}],["опытному",{"2":{"53":1}}],["опыт",{"2":{"10":1,"53":1,"54":1,"74":2}}],["опыта",{"2":{"5":1,"8":1}}],["определённых",{"2":{"45":1}}],["определили",{"2":{"25":1}}],["определиться",{"2":{"7":1}}],["определять",{"2":{"11":1}}],["определяю",{"2":{"11":1}}],["определяют",{"2":{"8":2,"11":2}}],["определяющие",{"2":{"7":1,"10":2}}],["определяемого",{"2":{"15":1}}],["определяем",{"2":{"8":2}}],["определяете",{"2":{"10":1,"42":1}}],["определяется",{"2":{"2":1,"11":1}}],["определяет",{"2":{"2":1,"6":1,"7":1,"8":1,"10":1}}],["определено",{"2":{"19":1}}],["определен",{"2":{"11":1}}],["определение",{"2":{"42":1}}],["определению",{"2":{"7":1}}],["определения",{"2":{"7":1,"45":1}}],["определенного",{"2":{"41":1}}],["определенному",{"2":{"3":1,"7":1}}],["определенных",{"2":{"42":1}}],["определенные",{"2":{"7":1,"8":1,"11":1}}],["определенными",{"2":{"10":1,"11":2}}],["определенным",{"2":{"2":1,"3":1}}],["оно",{"2":{"7":1,"11":1,"13":1,"54":1}}],["она",{"2":{"7":2,"10":1,"13":1,"14":2,"17":1,"18":1,"19":2,"33":1,"41":2,"42":2,"44":1,"46":1}}],["они",{"2":{"6":1,"7":2,"15":3,"16":1,"19":3,"20":1,"21":1,"23":1,"24":1,"25":1,"33":1,"35":3,"38":1,"42":1,"44":2,"48":1,"53":2,"54":1}}],["он",{"2":{"2":3,"5":1,"6":1,"7":2,"10":2,"11":1,"19":2,"33":2,"38":1,"39":2,"41":1,"42":1,"43":1,"44":1,"45":1,"54":3}}],["онлайн",{"2":{"2":1,"38":1,"39":1,"45":1,"54":1}}],["обман",{"2":{"54":1}}],["обмену",{"2":{"11":1}}],["обхода",{"2":{"54":1}}],["обязательно",{"2":{"53":2}}],["обязательными",{"2":{"25":1}}],["обязательным",{"2":{"11":1}}],["обучающие",{"2":{"53":1}}],["обучение",{"2":{"52":1}}],["оболочку",{"2":{"54":1}}],["оболочки",{"2":{"45":1}}],["оборачивайте",{"2":{"52":1}}],["обоснования",{"2":{"45":1}}],["обозначаются",{"2":{"22":1}}],["облегчит",{"2":{"47":1}}],["облегчили",{"2":{"44":1}}],["области",{"2":{"11":2,"42":1}}],["обладает",{"2":{"7":1}}],["облачные",{"2":{"34":1}}],["облачных",{"2":{"3":1}}],["облачном",{"2":{"31":1,"34":1}}],["облачное",{"2":{"3":1}}],["обзор",{"2":{"40":1}}],["обычным",{"2":{"54":1}}],["обычными",{"2":{"35":1}}],["обычные",{"2":{"44":1}}],["обычных",{"2":{"25":1,"54":1}}],["обычный",{"2":{"10":2,"38":1}}],["обычное",{"2":{"54":1}}],["обычной",{"2":{"44":1}}],["обычном",{"2":{"11":1}}],["обычного",{"2":{"7":1,"10":1}}],["обычно",{"2":{"2":1,"5":1,"7":1,"9":1,"19":1,"41":1,"42":2,"43":1,"44":1,"53":1,"54":1}}],["общий",{"2":{"25":1}}],["общих",{"2":{"7":2}}],["общую",{"2":{"11":1,"29":1}}],["общепризнанная",{"2":{"75":1}}],["общее",{"2":{"74":1}}],["общей",{"2":{"7":1,"41":1}}],["общем",{"2":{"7":1}}],["общение",{"2":{"5":1,"57":1}}],["об",{"2":{"7":1,"9":1,"11":2,"17":1,"44":2,"53":1}}],["оберток",{"2":{"54":1}}],["обертки",{"0":{"47":1},"2":{"47":1,"54":1}}],["обертка",{"2":{"1":1,"19":1,"44":1}}],["обернуть",{"2":{"45":1}}],["обернутый",{"2":{"19":1}}],["обеспечат",{"2":{"34":1}}],["обеспечивающих",{"2":{"29":1}}],["обеспечивает",{"2":{"6":1,"11":1}}],["обеспечить",{"2":{"7":1}}],["обеспечения",{"2":{"5":1,"6":1,"7":1,"19":1,"29":1,"43":1}}],["объяснению",{"2":{"54":1}}],["объяснить",{"2":{"53":1}}],["объявить",{"2":{"10":1}}],["объявлять",{"2":{"11":1}}],["объявляют",{"2":{"11":2}}],["объявляем",{"2":{"8":1,"11":1}}],["объявляется",{"2":{"4":1,"11":1,"12":1}}],["объявлены",{"2":{"42":1}}],["объявлено",{"2":{"18":1}}],["объявленным",{"2":{"11":1}}],["объявленного",{"2":{"4":1}}],["объявление",{"2":{"4":1}}],["объективная",{"2":{"75":1}}],["объектным",{"2":{"45":1}}],["объектно",{"2":{"10":1,"44":1,"45":1}}],["объектов",{"2":{"25":1,"41":1}}],["объектом",{"2":{"11":1}}],["объекту",{"2":{"11":1}}],["объектах",{"2":{"41":1}}],["объекта",{"2":{"11":2,"14":1,"16":1,"41":2,"42":1,"44":1,"45":1}}],["объектами",{"2":{"41":1}}],["объектам",{"2":{"4":2}}],["объекты",{"2":{"11":2,"17":1,"22":1,"42":1,"44":1}}],["объекте",{"2":{"8":1,"41":1,"53":1}}],["объект",{"2":{"8":3,"10":1,"11":9,"41":2}}],["оба",{"2":{"3":1,"38":1}}],["обнаружились",{"2":{"54":1}}],["обнаружить",{"2":{"46":1}}],["обновится",{"2":{"44":1}}],["обновляться",{"2":{"43":1}}],["обновляет",{"2":{"2":1}}],["обновление",{"2":{"33":1,"44":1}}],["обновлении",{"2":{"13":1,"44":1}}],["обнуляет",{"2":{"2":1}}],["обрабатываются",{"2":{"53":1}}],["обрабатывать",{"2":{"35":1,"54":2}}],["обработка",{"2":{"45":1}}],["обработке",{"2":{"45":1}}],["обработки",{"2":{"7":1}}],["обработана",{"2":{"19":1}}],["образец",{"2":{"33":1}}],["образу",{"2":{"7":1}}],["образом",{"2":{"2":2,"3":1,"9":2,"16":2,"52":1}}],["обратите",{"2":{"8":3,"10":1,"11":1}}],["обратиться",{"2":{"19":1}}],["обратить",{"2":{"6":1,"7":1}}],["обратной",{"2":{"11":1}}],["обратно",{"2":{"2":1}}],["обращения",{"2":{"11":1,"54":1}}],["обращении",{"2":{"3":1,"54":2}}],["обращается",{"2":{"4":1}}],["обращаешься",{"2":{"3":1}}],["обращаться",{"2":{"3":1,"6":1,"53":1}}],["ос",{"2":{"39":1}}],["осущестляется",{"2":{"35":1}}],["осуществления",{"2":{"1":1}}],["остаться",{"2":{"42":1}}],["остальное",{"2":{"10":1,"39":1}}],["остается",{"2":{"1":1}}],["основательным",{"2":{"42":1}}],["основа",{"2":{"27":1}}],["основаны",{"2":{"7":1}}],["основ",{"2":{"26":1,"29":1}}],["основе",{"2":{"6":1,"7":1,"19":1,"42":1}}],["основная",{"2":{"19":1}}],["основное",{"2":{"42":1}}],["основной",{"2":{"39":1,"42":1,"51":1}}],["основном",{"2":{"19":1}}],["основного",{"2":{"1":1}}],["основных",{"2":{"43":1}}],["основным",{"2":{"8":1}}],["основные",{"2":{"2":1,"31":1,"43":1,"45":1,"75":1}}],["особенность",{"2":{"44":1}}],["особенно",{"2":{"5":1,"43":1}}],["отзывами",{"2":{"54":1}}],["отдавать",{"2":{"54":1}}],["отделить",{"2":{"44":1,"53":1}}],["отделит",{"2":{"10":1}}],["отдельного",{"2":{"44":1,"45":1}}],["отдельном",{"2":{"42":1}}],["отдельную",{"2":{"42":1}}],["отдельная",{"2":{"4":1}}],["отдельными",{"2":{"4":1}}],["отдельный",{"2":{"1":2,"10":1,"52":1}}],["отстает",{"2":{"53":1}}],["отслеживает",{"2":{"41":3}}],["отслеживания",{"2":{"16":1,"41":2}}],["отметить",{"2":{"52":1,"53":1}}],["отнимают",{"2":{"43":1}}],["относительно",{"2":{"54":1}}],["относится",{"2":{"11":4}}],["отношении",{"2":{"15":1}}],["отношению",{"2":{"11":1}}],["отовсюду",{"2":{"42":1}}],["отобразить",{"2":{"14":1,"19":1}}],["отображено",{"2":{"16":1}}],["отображение",{"2":{"42":1}}],["отображении",{"2":{"15":1,"19":2}}],["отображения",{"2":{"7":1,"8":1,"15":2,"16":1,"54":1}}],["отображающий",{"2":{"42":1}}],["отображаются",{"2":{"11":1}}],["отображать",{"2":{"35":1}}],["отображаемые",{"2":{"11":1}}],["отображается",{"2":{"7":1,"19":1}}],["откуда",{"2":{"44":1}}],["отката",{"2":{"33":1}}],["открытыми",{"2":{"53":1}}],["открытые",{"2":{"3":1}}],["открытом",{"2":{"53":1}}],["открывающем",{"2":{"12":1}}],["открывает",{"2":{"8":1}}],["отрисовкой",{"2":{"54":1}}],["отреагировать",{"2":{"18":1}}],["отражаться",{"2":{"13":1}}],["отражаются",{"2":{"6":1}}],["отличный",{"2":{"53":1}}],["отлично",{"2":{"44":1}}],["отличное",{"2":{"38":1}}],["отличия",{"2":{"44":1}}],["отличие",{"2":{"15":1,"41":1,"42":2,"44":1}}],["отличаются",{"2":{"41":1}}],["отличается",{"2":{"4":1,"43":1}}],["отвечающие",{"2":{"42":1,"44":1}}],["отвечает",{"2":{"2":1}}],["ответов",{"2":{"75":2}}],["ответах",{"2":{"75":1}}],["ответа",{"2":{"73":1}}],["ответственная",{"2":{"42":1}}],["ответить",{"2":{"7":1,"27":1}}],["ответ",{"2":{"4":2,"53":1,"73":1}}],["ответе",{"2":{"4":2}}],["отпечаток",{"2":{"2":1}}],["отправлять",{"2":{"54":1}}],["отправляемые",{"2":{"11":1}}],["отправляет",{"2":{"2":1}}],["отправка",{"2":{"1":1}}],["от",{"2":{"1":1,"2":1,"4":4,"6":2,"7":3,"8":1,"10":1,"11":3,"15":2,"26":1,"34":1,"35":1,"41":1,"42":1,"43":2,"44":3,"48":1,"52":1,"53":3,"74":1}}],["иерарxичную",{"2":{"52":1}}],["иерархичного",{"2":{"44":1}}],["иерархии",{"2":{"10":1,"42":2}}],["играет",{"2":{"44":1}}],["ивент",{"2":{"42":1}}],["ивенты",{"2":{"42":1}}],["ивентов",{"2":{"42":1}}],["иконка",{"2":{"54":1}}],["иконками",{"2":{"35":1}}],["иконку",{"2":{"35":2}}],["иконки",{"2":{"35":2,"38":1}}],["идею",{"2":{"54":1}}],["идеально",{"2":{"44":1}}],["идеале",{"2":{"42":1}}],["идет",{"2":{"39":1,"75":1}}],["идея",{"2":{"19":1,"42":1}}],["идентификатор",{"2":{"11":1}}],["идентификатором",{"2":{"8":2}}],["итоге",{"2":{"25":1,"39":1,"42":1}}],["итоговый",{"2":{"52":1}}],["итогов",{"0":{"26":1}}],["итого",{"2":{"2":1}}],["итераторе",{"2":{"16":1}}],["итак",{"2":{"7":1}}],["исправление",{"2":{"60":1}}],["испортит",{"2":{"43":1}}],["исполнения",{"2":{"8":1}}],["использовались",{"2":{"41":1}}],["использована",{"2":{"11":1,"19":1}}],["использован",{"2":{"7":1,"11":1}}],["использования",{"2":{"7":1,"8":1,"11":2,"41":1,"42":1,"53":1,"54":1}}],["использовании",{"2":{"5":1,"9":2,"11":1,"15":1}}],["использованием",{"2":{"35":1,"54":1}}],["использование",{"0":{"8":1},"1":{"9":1},"2":{"4":1,"7":1,"11":2,"19":1,"42":1,"44":1,"52":1,"54":1,"74":1}}],["использоваться",{"2":{"13":1}}],["использовать",{"2":{"3":1,"5":1,"7":7,"8":2,"9":2,"10":7,"11":4,"14":1,"17":1,"18":3,"19":2,"20":1,"25":2,"35":3,"38":1,"44":2,"45":3,"49":1}}],["используйте",{"0":{"47":1,"49":1,"50":1},"2":{"10":2,"15":2,"25":1,"41":2,"47":1,"52":1}}],["использую",{"2":{"8":1}}],["используют",{"2":{"6":1,"20":1}}],["используются",{"2":{"2":1,"7":1,"19":1,"27":1,"33":1,"38":1,"44":1}}],["использующего",{"2":{"4":1}}],["используя",{"2":{"3":1,"7":1,"9":1,"11":1,"33":1,"38":2,"73":1}}],["используете",{"2":{"47":1}}],["использует",{"2":{"33":1,"36":1,"38":1,"41":2,"42":1}}],["используется",{"2":{"2":1,"4":1,"6":1,"11":1,"16":1,"18":1,"33":1,"38":1,"41":1,"44":2,"53":1,"75":1}}],["используемые",{"2":{"9":1,"11":1,"12":1,"45":1}}],["используемый",{"2":{"2":1,"19":1}}],["используем",{"2":{"8":2,"10":2,"11":2,"13":1,"17":1}}],["используемая",{"2":{"7":1}}],["используемого",{"2":{"4":1,"7":1}}],["история",{"0":{"55":1},"1":{"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1}}],["исторически",{"2":{"42":1}}],["источники",{"2":{"53":1,"75":1}}],["источнику",{"2":{"4":1,"53":1}}],["источник",{"2":{"4":1}}],["источников",{"2":{"4":3}}],["исходного",{"2":{"39":1}}],["исходных",{"2":{"29":1}}],["исключительных",{"2":{"54":1}}],["исключением",{"2":{"42":1}}],["исключения",{"2":{"7":1}}],["искренне",{"2":{"29":1}}],["исчерпывающим",{"2":{"11":1}}],["их",{"2":{"3":1,"7":3,"9":2,"10":2,"11":1,"19":4,"25":1,"26":1,"33":1,"35":4,"40":1,"41":1,"42":5,"43":1,"44":3,"47":1,"48":1}}],["иных",{"2":{"54":1}}],["иная",{"2":{"44":1}}],["иначе",{"2":{"10":1,"18":1,"42":1}}],["ингридиент",{"2":{"43":1}}],["иного",{"2":{"52":1}}],["иногда",{"2":{"42":1,"45":1,"52":1}}],["ином",{"2":{"41":1}}],["иной",{"2":{"7":2,"33":1}}],["инструкции",{"2":{"33":1}}],["инструменты",{"2":{"29":1,"31":1,"54":1}}],["инструмент",{"2":{"8":1,"51":1}}],["интеграционные",{"2":{"43":1}}],["интеграция",{"2":{"31":1,"42":1}}],["интересными",{"2":{"75":1}}],["интересный",{"2":{"33":1}}],["интерактивности",{"2":{"44":1}}],["интернационализационным",{"2":{"41":1}}],["интернационализации",{"2":{"41":1}}],["интернационализация",{"2":{"41":1}}],["интернет",{"2":{"4":4,"6":1,"53":1}}],["интернете",{"2":{"3":1,"5":1,"52":1,"53":1}}],["интернета",{"2":{"3":1}}],["интерполированное",{"2":{"16":1}}],["интерполяцией",{"2":{"8":1,"16":1}}],["интерпретации",{"2":{"11":1}}],["интерпретировано",{"2":{"14":1}}],["интерпретировать",{"2":{"9":1,"10":1}}],["интерпретируются",{"2":{"8":1}}],["интерфейс",{"2":{"10":1}}],["интерфейсов",{"2":{"7":2}}],["интерфейса",{"2":{"3":1,"10":2,"17":1,"29":1,"43":1}}],["инкапсулировали",{"2":{"44":1}}],["инкапсулирует",{"2":{"10":1,"44":1}}],["инкапсуляции",{"2":{"25":1}}],["инженеру",{"2":{"31":1}}],["инженерии",{"2":{"6":1,"7":1}}],["инжектируемых",{"2":{"22":1}}],["инжектируемые",{"2":{"22":1}}],["индексируется",{"2":{"54":1}}],["индексации",{"2":{"54":1}}],["индексы",{"2":{"16":1}}],["индекс",{"2":{"16":1}}],["индивидуально",{"2":{"2":1}}],["инвертирует",{"2":{"7":1}}],["инициирующей",{"2":{"4":1}}],["инета",{"2":{"3":1}}],["информационной",{"2":{"33":1}}],["информацию",{"2":{"19":1,"53":1}}],["информацией",{"2":{"10":1,"33":1}}],["информация",{"2":{"2":1,"75":1}}],["информации",{"2":{"2":1,"29":1,"53":1,"75":2}}],["изначально",{"2":{"45":1,"54":1}}],["избегайте",{"0":{"46":1}}],["избегаемы",{"2":{"41":1}}],["избежать",{"2":{"44":1}}],["изобретено",{"2":{"44":1}}],["изображения",{"2":{"35":2}}],["изобразить",{"2":{"9":1}}],["изощренных",{"2":{"39":1}}],["изолированные",{"2":{"9":1}}],["извлекаем",{"2":{"8":1}}],["изучайте",{"2":{"53":1}}],["изучать",{"2":{"7":1,"57":1}}],["изучения",{"2":{"26":1,"53":2}}],["изучение",{"0":{"12":1,"53":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"49":1}}],["изучить",{"2":{"7":1,"33":1}}],["изучим",{"2":{"6":1}}],["изменится",{"2":{"19":1,"39":1}}],["изменить",{"2":{"11":1,"15":1,"44":1,"45":1,"52":1}}],["изменилось",{"2":{"11":1}}],["изменился",{"2":{"2":1}}],["изменено",{"0":{"57":1,"60":1,"63":1},"2":{"7":1}}],["изменении",{"2":{"7":1,"44":2}}],["изменений",{"0":{"55":1},"1":{"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1},"2":{"7":1,"16":1,"31":1,"41":1,"73":1}}],["изменениях",{"2":{"42":1}}],["изменениями",{"2":{"39":1,"44":2}}],["изменения",{"2":{"6":3,"41":2,"60":1}}],["изменяется",{"2":{"7":2}}],["изменяться",{"2":{"44":1}}],["изменять",{"2":{"6":1,"11":1,"44":1}}],["изменяющие",{"2":{"6":1}}],["из",{"2":{"2":1,"3":1,"5":1,"6":3,"7":5,"8":2,"9":2,"10":2,"11":7,"12":1,"14":1,"15":2,"16":1,"19":1,"33":4,"35":5,"36":1,"38":2,"41":1,"42":5,"43":1,"44":1,"45":1,"49":1,"53":1,"54":1}}],["имитирует",{"2":{"43":1}}],["имя",{"2":{"11":2,"25":1,"33":1,"73":1}}],["импорт",{"2":{"42":1}}],["импортируя",{"2":{"19":1}}],["импортируется",{"2":{"11":1}}],["импортирует",{"2":{"9":1}}],["импортируем",{"2":{"8":1,"11":2}}],["импортировать",{"2":{"7":1,"8":1,"9":1,"11":2,"35":2,"37":1}}],["импортированы",{"2":{"35":1}}],["импортирован",{"2":{"7":1}}],["импорта",{"2":{"7":1,"36":1}}],["им",{"2":{"2":1,"52":1,"54":1}}],["имеем",{"2":{"11":1}}],["имеет",{"2":{"2":4,"3":1,"5":1,"8":1,"11":1,"14":1,"16":1,"44":2}}],["имеют",{"2":{"10":1,"11":2,"12":1,"42":1,"52":1}}],["имели",{"2":{"9":1}}],["иметь",{"2":{"6":1,"11":1,"14":1,"25":1,"39":1,"42":1}}],["имени",{"2":{"35":1}}],["именами",{"2":{"35":1}}],["имена",{"0":{"23":1,"24":1},"2":{"4":1,"8":1}}],["именем",{"2":{"4":1,"37":1}}],["именно",{"2":{"2":1,"6":2,"9":1,"10":1,"11":1,"42":1,"44":1,"53":2}}],["или",{"0":{"5":1},"2":{"1":2,"2":2,"3":1,"4":4,"5":2,"7":9,"8":1,"9":1,"10":1,"11":6,"12":1,"14":4,"15":3,"16":1,"17":1,"18":1,"19":3,"34":1,"35":1,"37":1,"38":2,"41":2,"42":11,"44":2,"45":1,"46":1,"47":2,"52":3,"53":5,"54":3,"73":3}}],["и",{"0":{"2":1,"11":1,"15":1,"16":1,"18":1,"21":1,"23":1,"24":1,"38":1,"47":1,"50":1,"52":1,"54":1,"74":1},"2":{"1":3,"2":23,"3":16,"4":3,"5":4,"6":24,"7":29,"8":14,"9":9,"10":15,"11":33,"12":1,"15":3,"16":1,"17":4,"18":4,"19":9,"20":2,"21":1,"22":4,"23":1,"24":1,"25":5,"26":4,"27":1,"29":17,"31":3,"33":18,"34":5,"35":7,"38":8,"39":20,"40":3,"41":14,"42":30,"43":6,"44":24,"45":14,"46":1,"48":5,"49":4,"50":2,"51":2,"52":22,"53":25,"54":30,"60":2,"73":1,"74":3,"75":7}}],["убить",{"2":{"53":1}}],["убедиться",{"2":{"27":1}}],["учебник",{"2":{"53":2}}],["учитывают",{"2":{"54":1}}],["учитывать",{"2":{"38":1}}],["учит",{"2":{"53":2}}],["учителем",{"2":{"53":1}}],["учиться",{"2":{"45":1}}],["ухудшает",{"2":{"52":1}}],["укоряет",{"2":{"52":1}}],["указать",{"2":{"44":1}}],["указателей",{"2":{"11":1}}],["указателями",{"2":{"11":1}}],["указана",{"2":{"4":1}}],["указанную",{"2":{"4":1}}],["указывает",{"2":{"8":1,"11":2}}],["уязвимость",{"2":{"46":1}}],["уязвимости",{"2":{"42":1}}],["утилитами",{"2":{"47":1}}],["утилит",{"0":{"47":1}}],["утилиты",{"2":{"42":1,"45":1}}],["утечку",{"2":{"10":1}}],["умирает",{"2":{"42":1}}],["умение",{"2":{"53":1}}],["умении",{"2":{"52":1}}],["умел",{"2":{"53":1}}],["умело",{"2":{"6":1}}],["уме",{"2":{"27":1}}],["уж",{"2":{"25":1}}],["уже",{"2":{"3":1,"5":1,"10":1,"11":2,"25":1,"33":1,"41":1,"43":1,"44":1,"45":1,"53":1,"54":2}}],["улучшайте",{"2":{"53":1}}],["улучшая",{"2":{"48":1}}],["улучшение",{"2":{"41":1}}],["улучшения",{"2":{"7":1}}],["улучшить",{"2":{"54":1}}],["улучшит",{"2":{"15":1}}],["узнаем",{"2":{"29":3}}],["узнаете",{"2":{"11":1}}],["узнать",{"2":{"8":1}}],["уникален",{"2":{"42":1}}],["уникальный",{"2":{"16":1}}],["универсальный",{"2":{"35":2}}],["унификации",{"2":{"5":1}}],["унаследован",{"2":{"11":1}}],["упомянутый",{"2":{"10":1}}],["упакует",{"2":{"9":1}}],["упакован",{"2":{"9":1}}],["упростит",{"2":{"47":1}}],["упрощенную",{"2":{"54":1}}],["упрощенно",{"2":{"44":1}}],["упрощенное",{"2":{"9":1}}],["упрощает",{"2":{"5":1,"33":1}}],["управляемое",{"2":{"54":1}}],["управлять",{"2":{"8":1,"10":1,"29":1,"44":2}}],["управления",{"2":{"42":3}}],["управлению",{"2":{"7":1}}],["управление",{"2":{"7":1,"11":1,"29":1}}],["увидели",{"2":{"54":1}}],["увидим",{"2":{"9":1,"11":1,"18":2}}],["увидите",{"2":{"7":1}}],["уверенным",{"2":{"53":1}}],["увеличивает",{"2":{"35":1,"46":1}}],["увеличивается",{"2":{"35":1}}],["увеличения",{"2":{"6":1}}],["ускоряет",{"2":{"52":1}}],["ускорить",{"2":{"45":1,"52":1}}],["ускорению",{"2":{"11":1}}],["усложняться",{"2":{"54":1}}],["условий",{"2":{"35":1}}],["условиях",{"2":{"7":1}}],["условные",{"2":{"15":1}}],["услуг",{"2":{"45":1}}],["успешности",{"2":{"45":1}}],["успевает",{"2":{"39":1}}],["успехов",{"2":{"29":1}}],["устареть",{"2":{"52":1}}],["устареет",{"2":{"46":1}}],["устаревает",{"2":{"42":1}}],["устаревшие",{"2":{"39":1}}],["устаревший",{"2":{"38":1}}],["устарели",{"2":{"53":1}}],["устарел",{"2":{"40":1,"42":1}}],["устанавливается",{"2":{"38":1}}],["устанавливаться",{"2":{"6":1}}],["установлена",{"2":{"54":1}}],["установленную",{"2":{"33":1}}],["установите",{"2":{"53":1}}],["установить",{"2":{"3":1,"8":1,"34":1}}],["установке",{"2":{"54":2}}],["установкой",{"2":{"11":1,"29":1}}],["установка",{"2":{"9":1,"10":1,"11":1,"29":1}}],["установки",{"2":{"4":1,"33":1,"39":1,"41":1}}],["усилия",{"2":{"7":1}}],["уровень",{"2":{"2":2,"45":1,"51":1,"75":1}}],["уровне",{"2":{"41":1,"43":1,"53":2}}],["уровнем",{"2":{"1":1}}],["уровня",{"2":{"2":1,"44":1,"53":1}}],["у",{"2":{"2":2,"3":4,"5":1,"10":2,"11":1,"25":1,"27":1,"33":1,"41":1,"42":4,"45":1,"52":1,"53":1,"54":2}}],["удаленном",{"2":{"33":1}}],["удаленный",{"2":{"33":4}}],["удаление",{"2":{"41":1}}],["удалении",{"2":{"19":1}}],["удаления",{"2":{"2":1}}],["удаляют",{"2":{"15":1}}],["удаляя",{"2":{"14":1}}],["удобство",{"2":{"74":2}}],["удобства",{"2":{"2":1,"19":1,"74":1}}],["удобен",{"2":{"5":1}}],["удобней",{"2":{"42":1,"52":1}}],["удобнее",{"2":{"5":1}}],["удобную",{"0":{"40":1},"2":{"39":1,"52":1}}],["удобная",{"2":{"45":1}}],["удобна",{"2":{"39":1}}],["удобны",{"2":{"34":1}}],["удобный",{"2":{"33":1,"39":1,"41":1,"51":1,"53":1}}],["удобным",{"2":{"25":1}}],["удобных",{"2":{"18":1}}],["удобно",{"2":{"1":2,"11":1,"16":1,"39":1,"42":2,"52":1}}],["удостовериться",{"2":{"2":1}}],["удостоверяется",{"2":{"2":2}}],["кто",{"2":{"43":1,"44":1,"54":1}}],["курсов",{"2":{"53":1}}],["курс",{"2":{"45":1,"53":1}}],["кучу",{"2":{"44":1}}],["куча",{"2":{"42":1}}],["кучи",{"2":{"41":1}}],["кулер",{"2":{"39":1}}],["куда",{"2":{"39":1,"44":1}}],["купить",{"2":{"34":1}}],["куку",{"2":{"2":1}}],["кэширование",{"2":{"54":1}}],["кэширования",{"2":{"33":1}}],["кэширующий",{"2":{"42":1}}],["кэше",{"2":{"19":1}}],["книжка",{"2":{"53":1}}],["книга",{"2":{"53":2}}],["книги",{"2":{"9":1,"12":1,"29":1,"53":1}}],["книге",{"0":{"20":1,"28":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"29":1},"2":{"6":3,"7":1,"11":2,"18":1,"20":2,"26":1,"29":1}}],["кнопку",{"2":{"19":1,"45":1}}],["кнопкам",{"2":{"45":1}}],["кнопка",{"2":{"18":1}}],["кнопке",{"2":{"18":1}}],["кнопкой",{"2":{"10":1}}],["кем",{"2":{"7":1}}],["ключу",{"2":{"41":1}}],["ключ",{"2":{"33":1}}],["ключевыми",{"2":{"29":1}}],["ключевое",{"2":{"11":2}}],["ключевой",{"2":{"7":1}}],["клавиатуры",{"2":{"39":1}}],["клавиатуру",{"2":{"39":1}}],["класть",{"2":{"35":1,"42":1}}],["классами",{"2":{"45":1}}],["класс",{"2":{"35":1}}],["классу",{"2":{"11":1}}],["классический",{"2":{"11":1,"53":1}}],["классов",{"0":{"23":1},"2":{"7":2,"19":1,"45":1,"52":1}}],["кладет",{"2":{"2":1}}],["клиентом",{"2":{"54":1}}],["клиент",{"2":{"5":2,"39":2}}],["клиентам",{"2":{"4":1}}],["клиента",{"2":{"4":3,"54":1}}],["кроулером",{"2":{"54":1}}],["кроме",{"2":{"8":1,"11":3,"18":1,"33":3,"38":1,"42":2,"44":1,"45":1,"46":1,"53":1,"54":2}}],["кругозор",{"2":{"53":1}}],["крутятся",{"2":{"39":1}}],["крупного",{"2":{"8":1}}],["крупных",{"2":{"3":1}}],["красиво",{"2":{"54":1}}],["красивую",{"2":{"52":1}}],["кратко",{"2":{"8":1,"27":1}}],["кражей",{"2":{"2":1}}],["критичных",{"2":{"2":1}}],["криптография",{"2":{"2":1}}],["казаться",{"2":{"54":1}}],["кабинета",{"2":{"45":1}}],["каталога",{"2":{"45":1}}],["категориями",{"2":{"45":1}}],["категорией",{"2":{"42":1}}],["кандидатов",{"2":{"44":1}}],["канала",{"0":{"0":1},"1":{"1":1}}],["капотом",{"2":{"44":1}}],["картинок",{"2":{"37":1}}],["картинками",{"2":{"54":1}}],["картинка",{"2":{"37":1}}],["картинки",{"2":{"35":6,"54":2}}],["картинке",{"2":{"13":1,"54":1}}],["карьере",{"2":{"29":1}}],["качества",{"2":{"37":1}}],["качество",{"2":{"29":1,"52":1,"74":2}}],["качественные",{"2":{"53":1}}],["качественный",{"2":{"39":1}}],["качестве",{"2":{"8":1,"11":1,"54":1,"75":1}}],["кажется",{"2":{"11":1}}],["каждым",{"2":{"54":1}}],["каждый",{"2":{"2":2,"7":1,"11":2,"19":1,"38":1,"42":3,"44":1,"45":1}}],["каждая",{"2":{"16":1,"42":1}}],["каждую",{"2":{"10":1}}],["каждое",{"2":{"11":1,"23":1}}],["каждого",{"2":{"7":1,"10":1,"19":1,"33":2,"38":1}}],["каждому",{"2":{"2":1,"33":1}}],["каждом",{"2":{"2":1,"7":1,"13":1,"44":1,"45":1}}],["камне",{"2":{"7":1}}],["касается",{"2":{"42":1}}],["кастомные",{"2":{"52":1}}],["кастомных",{"2":{"45":1}}],["кастомными",{"2":{"38":1}}],["кастомный",{"2":{"34":1}}],["кастомную",{"2":{"3":1}}],["каскадные",{"2":{"6":1}}],["какая",{"2":{"39":1}}],["какую",{"2":{"8":1}}],["каких",{"2":{"7":1,"54":1}}],["какие",{"2":{"6":1,"9":1,"27":1,"41":1,"44":1,"53":2}}],["какой",{"2":{"7":1,"8":1,"37":1,"39":1,"46":1,"47":1}}],["какое",{"2":{"6":1}}],["каком",{"2":{"3":1}}],["как",{"2":{"2":5,"3":3,"4":1,"5":4,"6":1,"7":8,"8":2,"9":6,"10":4,"11":13,"14":1,"15":2,"17":2,"19":1,"25":1,"29":4,"33":2,"35":3,"37":1,"38":3,"39":3,"41":5,"42":7,"43":1,"44":1,"51":2,"52":4,"53":3,"54":9,"57":1,"75":2}}],["к",{"2":{"1":1,"2":4,"3":7,"4":6,"6":3,"7":1,"11":19,"13":1,"17":1,"19":3,"27":1,"34":2,"35":1,"39":4,"42":2,"45":1,"49":1,"53":3,"54":3}}],["коврике",{"2":{"54":1}}],["коп",{"2":{"44":1}}],["копирования",{"2":{"38":1}}],["копий",{"2":{"16":1}}],["ко",{"2":{"42":1,"45":1}}],["корректировку",{"2":{"73":1}}],["коридоре",{"2":{"54":1}}],["короткий",{"2":{"53":1}}],["короткоживущий",{"2":{"2":1}}],["корень",{"2":{"33":1}}],["координация",{"2":{"7":1}}],["координации",{"2":{"7":1}}],["координировать",{"2":{"7":1}}],["коллеги",{"2":{"53":1}}],["коллекций",{"2":{"16":1}}],["коллекция",{"2":{"7":1}}],["колоночной",{"2":{"52":1}}],["колоночным",{"2":{"49":1}}],["количеством",{"2":{"41":1,"43":1}}],["количество",{"2":{"6":1}}],["количества",{"2":{"2":1}}],["которую",{"2":{"8":1,"33":1,"42":1,"53":1}}],["которое",{"2":{"18":1,"43":1}}],["которого",{"2":{"11":4}}],["которой",{"2":{"8":1}}],["которому",{"2":{"16":1}}],["котором",{"2":{"6":2,"10":1,"34":1,"41":1,"42":1}}],["которая",{"2":{"5":1,"7":1,"8":1,"11":1,"14":1,"42":2,"44":1,"52":1,"53":1,"54":1}}],["которых",{"2":{"6":1,"7":1,"9":1,"11":1,"16":1,"42":1,"44":1,"54":1}}],["которыми",{"2":{"25":1,"42":1}}],["которым",{"2":{"4":1,"11":1,"25":1,"52":1}}],["который",{"2":{"3":2,"4":2,"6":1,"7":2,"8":2,"9":1,"10":4,"11":4,"19":2,"20":1,"35":1,"38":1,"42":3,"43":1,"44":1,"54":2}}],["которые",{"2":{"2":1,"4":1,"6":5,"8":2,"9":3,"10":1,"11":4,"12":1,"15":1,"18":3,"19":3,"20":1,"34":1,"35":1,"52":1,"53":1,"54":2}}],["консистентности",{"2":{"42":1}}],["конструкции",{"2":{"42":1}}],["конструкторы",{"2":{"22":1}}],["конструктора",{"2":{"11":1}}],["конструктор",{"2":{"8":1,"11":3}}],["константные",{"2":{"22":1}}],["константе",{"2":{"11":1}}],["константа",{"2":{"11":2}}],["константы",{"0":{"22":1},"2":{"11":2}}],["константу",{"2":{"11":2}}],["конфликтуют",{"2":{"39":1}}],["конфигурациях",{"2":{"54":1}}],["конфигурация",{"2":{"39":1}}],["конфигурационного",{"2":{"33":1}}],["конфигом",{"2":{"39":1}}],["конфиге",{"2":{"38":1}}],["контакты",{"2":{"73":1}}],["контрагентами",{"2":{"44":1}}],["контролирует",{"2":{"41":1,"44":1}}],["контроль",{"2":{"11":2,"29":1}}],["контент",{"2":{"54":1}}],["контентом",{"2":{"54":2}}],["контента",{"2":{"6":1,"8":1,"19":1,"54":1}}],["контекста",{"2":{"11":1}}],["конечный",{"2":{"11":1}}],["конечного",{"2":{"29":1}}],["конечном",{"2":{"25":1}}],["конечно",{"2":{"5":1,"45":1,"54":1}}],["концептуальные",{"2":{"29":1}}],["концепцию",{"2":{"11":1}}],["концепции",{"2":{"9":1,"45":1}}],["концепцией",{"2":{"7":1}}],["концепций",{"2":{"6":1}}],["концепция",{"2":{"6":1,"7":1,"11":1}}],["конце",{"2":{"8":1}}],["концу",{"2":{"6":1}}],["конкретном",{"2":{"7":1}}],["конкретное",{"2":{"4":1,"11":1}}],["конкретные",{"2":{"7":1}}],["конкурировать",{"2":{"6":1}}],["конкурировали",{"2":{"6":1}}],["кончается",{"2":{"2":2}}],["кончился",{"2":{"2":1}}],["комфорту",{"2":{"54":1}}],["комфортно",{"2":{"42":1}}],["комфортней",{"2":{"39":1}}],["комментирование",{"2":{"74":1}}],["комментариями",{"2":{"2":1}}],["коммерческих",{"2":{"33":1}}],["командой",{"2":{"54":1}}],["командной",{"2":{"38":1}}],["команд",{"2":{"33":1,"44":1}}],["команда",{"2":{"25":1}}],["команде",{"2":{"7":1,"25":1}}],["команды",{"2":{"7":1}}],["компетентные",{"2":{"53":1}}],["компаниях",{"2":{"53":1}}],["компании",{"2":{"2":1}}],["компьютера",{"2":{"39":1}}],["компьютере",{"2":{"38":1,"54":1}}],["композаблы",{"2":{"45":1}}],["композабле",{"2":{"42":1}}],["композаблом",{"2":{"42":1}}],["композабл",{"2":{"41":1,"42":4,"45":1}}],["композиция",{"2":{"9":1,"10":2,"17":1,"29":1}}],["компонентно",{"2":{"44":1}}],["компонентом",{"2":{"42":2}}],["компонентов",{"0":{"10":1,"23":1},"2":{"6":1,"8":1,"9":2,"10":2,"11":2,"18":2,"19":5,"26":1,"29":2,"40":1,"42":1}}],["компоненту",{"2":{"11":1}}],["компонентами",{"0":{"47":1},"2":{"10":1,"11":2,"17":1}}],["компонента",{"2":{"9":1,"10":4,"11":7,"19":4,"42":4,"45":1,"52":2}}],["компонентах",{"2":{"1":1,"10":1,"11":1}}],["компонент",{"2":{"8":2,"9":1,"10":3,"11":4,"19":7,"35":1,"37":1,"41":1,"42":7,"44":3,"47":1,"52":2}}],["компоненты",{"0":{"19":1},"2":{"6":1,"9":2,"10":3,"11":2,"17":1,"19":2,"27":1,"42":2,"44":2,"45":1,"47":2,"48":1,"52":3}}],["компоненте",{"2":{"1":1,"42":3}}],["компиляция",{"2":{"8":1}}],["компромиссы",{"2":{"7":1}}],["компромисс",{"2":{"7":2}}],["компромиссами",{"2":{"7":1}}],["комплексное",{"2":{"2":1}}],["кому",{"2":{"2":1}}],["когда",{"2":{"2":4,"3":1,"4":1,"6":1,"7":8,"8":1,"11":3,"14":1,"15":1,"17":2,"18":1,"19":4,"35":1,"41":2,"42":3,"52":1,"53":1,"54":3}}],["кодироваться",{"2":{"35":1}}],["кодовых",{"2":{"20":1,"26":1}}],["кодовые",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"25":1}}],["кодом",{"2":{"3":1,"26":1}}],["кодера",{"2":{"39":1}}],["коде",{"2":{"11":3,"25":1,"27":1,"44":1,"45":1,"52":1}}],["кода",{"2":{"1":2,"3":1,"7":2,"8":1,"9":1,"10":2,"11":6,"25":1,"29":2,"31":2,"33":1,"39":1,"44":3,"46":1,"48":2,"52":2,"53":1,"54":2,"74":1}}],["код",{"2":{"1":2,"4":1,"5":1,"7":1,"8":2,"9":2,"11":5,"20":1,"25":1,"29":1,"33":1,"39":1,"41":1,"48":1,"53":2}}],["сюда",{"2":{"74":1}}],["сгенеренные",{"2":{"54":1}}],["сгенерировать",{"2":{"34":1}}],["сэкономить",{"2":{"52":1}}],["сэкономит",{"2":{"46":1}}],["схожи",{"2":{"44":1}}],["сжатие",{"2":{"37":1}}],["смысл",{"2":{"54":1}}],["смысле",{"2":{"15":1,"42":1}}],["смартфоне",{"2":{"54":1}}],["смартфона",{"2":{"54":1}}],["сможете",{"2":{"49":1}}],["смонтирован",{"2":{"11":1}}],["смонтировать",{"2":{"8":1}}],["смену",{"2":{"44":1}}],["смешивает",{"2":{"44":1}}],["см",{"2":{"19":1}}],["ссылки",{"2":{"22":3,"38":1}}],["ссылке",{"2":{"11":1}}],["ссылаемой",{"2":{"17":1}}],["ссылаться",{"2":{"11":2,"16":1}}],["сделанный",{"2":{"54":1}}],["сделали",{"2":{"54":1}}],["сделал",{"2":{"49":1}}],["сделайте",{"2":{"47":1,"53":2}}],["сделав",{"2":{"46":1}}],["сделает",{"2":{"10":1,"25":1}}],["сделать",{"2":{"2":2,"3":3,"34":1,"41":1,"42":1,"44":1,"45":1,"54":1}}],["сборок",{"2":{"38":1}}],["сборщиком",{"2":{"9":1,"10":1}}],["сборщики",{"2":{"9":1}}],["сборщика",{"0":{"9":1},"2":{"9":2,"10":1,"11":1,"38":3}}],["сборщик",{"2":{"8":1,"9":1,"10":1,"11":1,"38":3}}],["сборка",{"0":{"38":1},"2":{"8":1,"33":1,"38":1}}],["сборки",{"2":{"8":1}}],["сценария",{"2":{"8":1}}],["сценарий",{"2":{"2":1}}],["скилл",{"2":{"53":1}}],["скачать",{"2":{"53":1}}],["скачивает",{"2":{"33":1}}],["сказать",{"2":{"44":1}}],["склонений",{"2":{"41":1}}],["скрыто",{"2":{"15":1}}],["скрытия",{"2":{"15":1}}],["скрываться",{"2":{"15":1}}],["скрывают",{"2":{"15":1}}],["скрывая",{"2":{"15":1}}],["скрывает",{"2":{"14":1}}],["скромное",{"2":{"8":2}}],["скрипта",{"2":{"54":1}}],["скриптами",{"2":{"54":1}}],["скриптам",{"2":{"43":1}}],["скрипт",{"2":{"3":2}}],["скопируйте",{"2":{"46":1}}],["скорости",{"2":{"54":1}}],["скорость",{"2":{"35":1}}],["скоростью",{"2":{"7":1}}],["скорей",{"2":{"42":1}}],["сколько",{"2":{"16":1,"38":1}}],["скобки",{"2":{"8":1}}],["считать",{"2":{"45":1}}],["считает",{"2":{"42":1}}],["считается",{"2":{"4":1,"53":1}}],["считывать",{"2":{"42":1}}],["счет",{"2":{"7":1}}],["снять",{"2":{"54":1}}],["сне",{"2":{"41":1}}],["снова",{"2":{"19":1}}],["снизить",{"2":{"52":1}}],["снижает",{"2":{"54":1}}],["снижают",{"2":{"43":1}}],["снижением",{"2":{"7":1}}],["снимать",{"2":{"2":1}}],["снимаются",{"2":{"2":1}}],["сначала",{"2":{"6":1,"8":1,"9":1,"10":1,"11":1}}],["субъективное",{"2":{"75":1}}],["сущности",{"2":{"44":1}}],["сущность",{"2":{"42":1}}],["существенные",{"2":{"44":1}}],["существующего",{"2":{"53":1}}],["существуют",{"2":{"7":2,"19":1,"44":1}}],["существует",{"2":{"6":1,"7":2,"8":1,"11":2,"40":1}}],["сути",{"2":{"2":1,"3":1,"41":1,"42":1}}],["семантические",{"2":{"50":1}}],["секунд",{"2":{"39":1}}],["секции",{"2":{"10":1,"11":1}}],["сейчас",{"2":{"9":1,"26":1,"34":1,"53":1}}],["себе",{"2":{"9":1,"44":1}}],["себя",{"2":{"6":2,"7":1,"9":1,"15":1,"16":1,"18":1,"35":1,"42":1,"44":2,"53":1}}],["селекторы",{"2":{"8":1}}],["сети",{"2":{"8":1}}],["сетями",{"2":{"7":1}}],["сертификация",{"2":{"53":1}}],["сертификат",{"2":{"34":3}}],["сертификаты",{"2":{"34":1}}],["серая",{"2":{"7":1}}],["сервиcа",{"2":{"3":1}}],["сервиса",{"2":{"3":2,"5":1,"54":1}}],["сервисов",{"2":{"3":3}}],["сервисы",{"2":{"2":1,"3":1,"25":1,"39":1,"42":1,"53":1}}],["сервис",{"0":{"1":1},"2":{"1":1,"3":1,"44":1,"53":1,"74":1}}],["серверному",{"2":{"54":1}}],["серверных",{"2":{"5":1}}],["сервера",{"2":{"4":1,"29":1,"35":1,"41":1,"54":6}}],["сервере",{"2":{"3":1,"4":2,"31":1,"33":2,"34":1,"54":1,"59":1,"60":1}}],["сервером",{"2":{"3":1,"54":1}}],["сервер",{"2":{"1":1,"3":2,"4":2,"5":2,"33":2,"34":1,"39":1,"53":1,"54":3}}],["сегодня",{"2":{"6":2}}],["ситуациях",{"2":{"45":1}}],["ситуация",{"2":{"44":1}}],["ситуацией",{"2":{"42":1}}],["ситуации",{"2":{"7":1}}],["синглтон",{"2":{"42":1}}],["синтез",{"2":{"42":1}}],["синтаксисом",{"2":{"11":1,"19":1}}],["синтаксисы",{"2":{"10":1}}],["синтаксис",{"2":{"10":2,"11":6}}],["синтаксиса",{"2":{"6":1,"10":1,"29":1}}],["синхронизацию",{"2":{"17":1}}],["сих",{"2":{"9":1,"18":1}}],["сильное",{"2":{"37":1}}],["сильно",{"2":{"5":1,"11":2,"38":1,"41":1,"43":1,"44":2,"47":1,"52":1,"53":2,"54":1}}],["систем",{"2":{"44":1}}],["системе",{"2":{"44":1}}],["системы",{"2":{"2":2,"44":1,"45":1,"52":1}}],["систему",{"2":{"2":1}}],["системами",{"2":{"44":1}}],["система",{"2":{"2":2}}],["сверху",{"2":{"75":1}}],["сваливает",{"2":{"44":1}}],["своя",{"2":{"33":1,"41":1}}],["своих",{"2":{"54":1}}],["своим",{"2":{"39":1,"42":1}}],["своими",{"2":{"33":1}}],["свои",{"2":{"25":1,"38":2,"42":1,"44":1,"45":1,"47":1,"52":2}}],["свободу",{"2":{"11":1}}],["свою",{"2":{"8":1,"10":1,"42":2,"45":1,"46":1}}],["своем",{"2":{"52":1}}],["своему",{"2":{"38":2}}],["свое",{"2":{"15":1,"53":1}}],["своей",{"2":{"3":1,"25":1,"54":1}}],["своего",{"2":{"3":2,"5":1,"54":1}}],["свойствами",{"2":{"54":1}}],["свойства",{"2":{"11":1}}],["свой",{"0":{"3":1},"2":{"3":2,"10":1,"11":2,"33":1,"34":2,"53":3}}],["связыванием",{"2":{"17":1}}],["связывает",{"2":{"13":1,"18":1}}],["связь",{"2":{"5":1}}],["связанность",{"2":{"45":1}}],["связанные",{"2":{"45":1}}],["связанными",{"2":{"11":1}}],["связанных",{"2":{"6":1}}],["связанный",{"2":{"1":1}}],["связаны",{"2":{"2":1,"45":1}}],["связи",{"0":{"0":1},"1":{"1":1},"2":{"1":2,"11":1,"34":1}}],["среднем",{"2":{"53":1}}],["среднего",{"2":{"7":2,"53":1}}],["среди",{"2":{"43":1}}],["средства",{"2":{"43":1,"52":1}}],["средствами",{"2":{"41":1,"52":1}}],["средство",{"2":{"38":1}}],["среда",{"2":{"39":1}}],["сравнится",{"2":{"54":1}}],["сравниваются",{"2":{"52":1}}],["сравним",{"2":{"11":2}}],["сравнении",{"2":{"7":1}}],["сравнению",{"2":{"6":1}}],["сразу",{"2":{"2":1,"17":1,"18":1,"35":1,"54":2}}],["срок",{"2":{"2":3}}],["сроком",{"2":{"2":1}}],["слабая",{"2":{"45":1}}],["слабо",{"2":{"45":1}}],["слишком",{"2":{"11":1}}],["следит",{"2":{"44":1}}],["следить",{"2":{"44":1}}],["следовательно",{"2":{"8":1}}],["следующей",{"2":{"26":1}}],["следующем",{"2":{"18":1}}],["следующее",{"2":{"18":1,"45":1}}],["следующий",{"2":{"18":1}}],["следующими",{"2":{"27":1}}],["следующим",{"2":{"9":1,"16":1}}],["следующих",{"2":{"7":1}}],["следующие",{"2":{"6":1,"10":1,"11":1}}],["следующую",{"2":{"7":1,"53":1}}],["следует",{"2":{"7":1,"25":1,"42":1}}],["служат",{"2":{"44":1}}],["служит",{"2":{"4":1}}],["слушателей",{"2":{"44":1}}],["случай",{"2":{"33":1,"53":1}}],["случаях",{"2":{"19":1,"42":2}}],["случая",{"2":{"8":1}}],["случаев",{"2":{"2":1,"40":1,"41":1,"54":2}}],["случае",{"2":{"2":3,"3":1,"4":1,"7":2,"8":1,"10":1,"11":1,"25":1,"33":1,"34":1,"38":1,"41":2,"42":1,"44":1}}],["слой",{"2":{"52":1}}],["словами",{"2":{"31":1,"42":1,"54":1}}],["слово",{"2":{"8":1,"11":3,"23":1,"25":1,"73":1}}],["сложно",{"2":{"53":1}}],["сложности",{"2":{"6":1,"11":1,"44":2,"75":1}}],["сложность",{"2":{"1":1}}],["сложным",{"2":{"54":1}}],["сложными",{"2":{"44":1}}],["сложный",{"2":{"42":1}}],["сложные",{"2":{"17":1}}],["сложных",{"2":{"6":1,"52":1}}],["сложная",{"2":{"5":1}}],["сломать",{"2":{"2":1}}],["составителя",{"2":{"75":1}}],["состоять",{"2":{"42":1}}],["состояний",{"2":{"25":1}}],["состояния",{"2":{"17":1,"19":1}}],["состоянием",{"2":{"45":1}}],["состояние",{"2":{"15":2,"19":1,"42":2}}],["состоит",{"2":{"6":1,"9":1,"10":1}}],["сопоставимое",{"2":{"43":1}}],["сопутствующей",{"2":{"42":2}}],["сопутствующие",{"2":{"42":1}}],["сопровождения",{"2":{"25":1}}],["сожалению",{"2":{"39":1,"53":1}}],["сотрудничества",{"2":{"29":1}}],["согласны",{"2":{"25":1}}],["соглашений",{"2":{"20":1,"25":1,"26":1}}],["соглашения",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"25":3,"27":1}}],["соглашение",{"2":{"11":1}}],["сочетании",{"2":{"16":1}}],["сокращения",{"0":{"74":1}}],["сокращение",{"0":{"13":1,"18":1},"2":{"18":1}}],["сокращенный",{"2":{"13":1}}],["содержат",{"2":{"52":1}}],["содержать",{"2":{"9":1,"11":1}}],["содержащая",{"2":{"42":1}}],["содержащий",{"2":{"10":1,"11":1}}],["содержание",{"2":{"27":1}}],["содержимым",{"2":{"19":1}}],["содержимое",{"2":{"8":2,"10":1,"54":1}}],["содержит",{"2":{"4":2,"10":1,"11":1,"13":1}}],["собеседованию",{"2":{"53":1}}],["соберет",{"2":{"8":1}}],["собирает",{"2":{"38":1}}],["собираются",{"2":{"19":1}}],["собрать",{"2":{"38":1}}],["собрано",{"2":{"10":1}}],["соблюдали",{"2":{"25":1}}],["событие",{"2":{"18":4}}],["события",{"0":{"24":1},"2":{"11":1}}],["собственные",{"2":{"12":1,"25":1,"29":1}}],["собственный",{"2":{"10":1}}],["собой",{"2":{"6":2,"7":1,"9":1,"10":1,"39":1}}],["социальными",{"2":{"7":1}}],["солидно",{"2":{"40":1}}],["соли",{"2":{"7":1}}],["совпадении",{"2":{"54":1}}],["совпадают",{"2":{"33":1}}],["совсем",{"2":{"44":1,"54":1}}],["советы",{"0":{"41":1},"2":{"45":1,"63":1}}],["советуется",{"2":{"33":1,"41":1}}],["совет",{"2":{"11":1,"15":1,"25":1,"53":1}}],["совершенно",{"2":{"10":1,"19":1}}],["совместно",{"2":{"11":1}}],["совместное",{"2":{"4":1}}],["совместимости",{"2":{"11":1}}],["современный",{"2":{"37":1,"38":1,"53":1}}],["современные",{"0":{"50":1},"2":{"34":1,"38":1}}],["современным",{"2":{"10":1}}],["современном",{"2":{"9":1}}],["современная",{"2":{"6":1}}],["соединения",{"2":{"5":1}}],["соответствующий",{"2":{"41":1}}],["соответствующую",{"2":{"33":1}}],["соответствующее",{"2":{"16":1}}],["соответствует",{"2":{"7":1,"33":1}}],["соответствии",{"2":{"7":1,"53":1}}],["соответственно",{"2":{"4":1,"52":1,"54":1}}],["сообщение",{"2":{"73":1}}],["сообщений",{"2":{"5":2}}],["сообщения",{"2":{"5":1}}],["создать",{"2":{"35":1,"39":1,"42":1,"45":1}}],["создают",{"2":{"16":1}}],["создаст",{"2":{"11":1}}],["создан",{"2":{"75":1}}],["созданы",{"2":{"54":1}}],["созданном",{"2":{"54":1}}],["созданному",{"2":{"11":1}}],["создана",{"2":{"33":1}}],["создание",{"0":{"38":1},"2":{"38":2,"39":1,"54":1}}],["созданию",{"2":{"11":1}}],["создания",{"2":{"7":4,"8":2,"9":2,"11":1,"19":1,"29":1,"43":1,"44":1}}],["создании",{"2":{"4":1,"7":3}}],["создаем",{"2":{"8":1,"18":1}}],["создается",{"2":{"8":1}}],["создает",{"2":{"2":1,"41":1}}],["создавать",{"2":{"6":2,"12":1,"29":1,"52":1}}],["со",{"2":{"4":2,"11":1,"13":1,"22":1,"33":1,"41":1,"42":1,"54":4}}],["сохранил",{"2":{"33":1}}],["сохранить",{"2":{"2":1,"54":1}}],["сохранения",{"2":{"11":1,"19":1}}],["сохранять",{"2":{"3":1}}],["сохраняется",{"2":{"7":1}}],["сохраняет",{"2":{"2":1,"19":1,"33":1,"38":1}}],["стейты",{"2":{"42":1}}],["стейтом",{"2":{"42":5}}],["стейт",{"2":{"42":2,"44":1}}],["стейта",{"2":{"41":1,"42":3}}],["степени",{"2":{"6":1,"11":1}}],["стиля",{"2":{"74":1}}],["стиль",{"2":{"14":1,"15":1,"25":1,"52":1}}],["стилизованной",{"2":{"52":1}}],["стилизацию",{"2":{"44":1,"47":1}}],["стили",{"2":{"10":2,"52":4}}],["стилей",{"2":{"6":1,"10":2}}],["стилем",{"2":{"6":1}}],["сторе",{"2":{"42":1}}],["сторами",{"2":{"42":1}}],["сторы",{"2":{"42":2,"60":1,"62":1}}],["стор",{"2":{"42":4}}],["сторов",{"2":{"42":1}}],["стором",{"2":{"42":1}}],["стороне",{"2":{"54":2}}],["сторонняя",{"2":{"46":1}}],["сторонней",{"2":{"42":1}}],["стороннего",{"2":{"4":1,"54":1}}],["сторонним",{"2":{"4":3}}],["сторонних",{"0":{"47":1},"2":{"4":1,"5":1}}],["сторонний",{"2":{"2":1}}],["стороны",{"2":{"4":1,"7":1}}],["стоит",{"2":{"27":1}}],["столько",{"2":{"16":1}}],["столкнуться",{"2":{"7":1}}],["стратегий",{"2":{"53":1}}],["страшном",{"2":{"41":1}}],["страдает",{"2":{"11":1}}],["странички",{"2":{"54":1}}],["страницу",{"2":{"9":2,"54":3}}],["страниц",{"2":{"6":2,"52":1}}],["странице",{"2":{"4":1,"6":1,"7":1,"8":2,"16":1,"19":2,"35":1,"43":1}}],["страницы",{"2":{"4":2,"8":2,"9":2,"54":4}}],["страница",{"2":{"4":2,"6":1,"9":1,"10":1,"54":1}}],["страницам",{"2":{"4":3}}],["странным",{"2":{"10":1}}],["странно",{"2":{"9":1}}],["структуре",{"2":{"54":1}}],["структурируя",{"2":{"48":1}}],["структура",{"2":{"7":1}}],["структуры",{"2":{"7":1}}],["структурные",{"2":{"6":1}}],["структурой",{"2":{"6":1}}],["строятся",{"2":{"18":1}}],["строительные",{"2":{"9":1}}],["строгость",{"2":{"5":1}}],["строк",{"2":{"46":1,"54":1}}],["строки",{"2":{"8":1,"11":1,"17":1,"38":1}}],["строками",{"2":{"4":1}}],["строка",{"2":{"4":1}}],["строку",{"2":{"2":1,"4":1,"41":1}}],["стало",{"2":{"42":1,"44":1}}],["стала",{"2":{"42":1}}],["стали",{"2":{"6":1,"41":1,"42":1,"52":1}}],["стадии",{"2":{"19":1}}],["старайтесь",{"2":{"49":1,"53":1}}],["стартапе",{"2":{"43":1}}],["стартового",{"2":{"7":1}}],["старой",{"2":{"33":1}}],["старший",{"2":{"2":1}}],["статей",{"2":{"52":1}}],["статистики",{"2":{"38":1}}],["статичный",{"2":{"54":2}}],["статичным",{"2":{"45":1}}],["статичных",{"2":{"34":1}}],["статичной",{"2":{"6":1}}],["стать",{"2":{"53":1}}],["статьи",{"2":{"5":1,"19":1}}],["статья",{"2":{"4":1,"43":1}}],["статье",{"2":{"2":1,"40":1,"41":1,"52":1}}],["становится",{"2":{"11":1,"42":1}}],["становятся",{"2":{"4":1}}],["станут",{"2":{"11":1}}],["станет",{"2":{"8":1}}],["стандартного",{"2":{"40":1}}],["стандартизации",{"2":{"6":1}}],["стандарты",{"0":{"50":1},"2":{"6":1,"7":1,"52":1}}],["стандарте",{"2":{"4":1}}],["стандартами",{"2":{"6":1,"25":1}}],["стандарта",{"2":{"2":1}}],["стандарт",{"2":{"2":1,"4":1}}],["ставить",{"2":{"2":1}}],["спальни",{"2":{"54":1}}],["спать",{"2":{"54":1}}],["справочную",{"2":{"53":1}}],["справочник",{"2":{"53":1}}],["спрятана",{"2":{"1":1}}],["сперва",{"2":{"37":1,"42":1,"53":1,"54":1}}],["спектр",{"2":{"29":1}}],["спецификаций",{"2":{"54":1}}],["спецификации",{"2":{"7":1}}],["специфичное",{"2":{"5":1}}],["специальную",{"2":{"12":1}}],["специальный",{"2":{"19":1}}],["специальные",{"2":{"12":1}}],["специальных",{"2":{"4":1}}],["специального",{"2":{"5":1}}],["специализированным",{"2":{"4":1}}],["списка",{"2":{"19":1}}],["списков",{"2":{"15":1}}],["список",{"2":{"4":2,"11":1,"18":1}}],["способа",{"2":{"54":1}}],["способе",{"2":{"11":1}}],["способом",{"2":{"8":1,"10":1}}],["способ",{"2":{"2":1,"11":3,"33":2,"38":1,"54":1}}],["сайтов",{"2":{"54":1}}],["сайтом",{"2":{"53":1,"74":1}}],["сайты",{"2":{"3":1}}],["сайт",{"2":{"2":1,"31":1,"33":1,"34":4,"45":1,"53":2,"54":2}}],["сайту",{"2":{"2":1,"34":2}}],["сайте",{"2":{"2":1,"3":1,"38":1,"41":1,"42":1,"54":1}}],["сайтами",{"2":{"54":1}}],["сайта",{"2":{"2":4,"33":2,"41":1,"43":1,"44":1,"45":1,"54":3}}],["самая",{"2":{"45":1}}],["самим",{"2":{"54":1}}],["сами",{"2":{"34":1,"38":1,"53":1}}],["самые",{"2":{"38":1,"44":1}}],["самых",{"2":{"29":2}}],["самым",{"2":{"7":1,"10":1,"17":1,"42":1,"54":1}}],["самый",{"2":{"2":1,"33":1,"43":1,"53":1}}],["сам",{"2":{"7":1,"41":1,"42":2,"48":1}}],["самоучитель",{"2":{"53":1}}],["самописный",{"2":{"52":1}}],["самой",{"2":{"43":1,"54":1}}],["самостоятельно",{"2":{"34":2}}],["самостоятельный",{"2":{"3":1}}],["самого",{"2":{"20":1,"33":1}}],["самому",{"2":{"44":1,"52":1}}],["самом",{"2":{"7":1,"25":1,"41":1}}],["самое",{"2":{"2":2,"39":1,"44":1,"47":1}}],["с",{"0":{"0":1},"1":{"1":1},"2":{"1":3,"2":13,"3":10,"4":3,"5":4,"6":4,"7":9,"8":4,"9":3,"10":8,"11":5,"12":1,"15":2,"16":1,"17":1,"18":4,"19":1,"20":1,"22":2,"23":1,"25":1,"26":1,"29":9,"33":4,"34":4,"35":3,"37":1,"38":3,"39":4,"40":1,"41":3,"42":9,"43":4,"44":3,"45":7,"46":1,"47":1,"49":1,"53":10,"54":11,"57":1,"74":3}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.cc321437.js b/assets/chunks/@localSearchIndexroot.cc321437.js new file mode 100644 index 000000000..bbd519317 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.cc321437.js @@ -0,0 +1 @@ +const e='{"documentCount":140,"nextId":140,"documentIds":{"0":"/backend/api.html#абстракция-канала-связи-с-бэкендом","1":"/backend/api.html#api-сервис","2":"/backend/auth.html#аутентификация-и-авторизация","3":"/backend/backend.html#варианты-задеиствовать-свои-бэкенд-для-фронтендера","4":"/backend/cors.html#cors","5":"/backend/protocols.html#протоколы-to-rest-или-не-rest","6":"/book/ru/Chapter 1_ The Vue 3 Framework.html#фреимворк-vue-3","7":"/book/ru/Chapter 1_ The Vue 3 Framework.html#прогрессивныи-фреимворк","8":"/book/ru/Chapter 1_ The Vue 3 Framework.html#использование-vue-в-веб-приложении","9":"/book/ru/Chapter 1_ The Vue 3 Framework.html#путь-сборщика-лучшии-путь","10":"/book/ru/Chapter 1_ The Vue 3 Framework.html#понимание-однофаиловых-компонентов","11":"/book/ru/Chapter 1_ The Vue 3 Framework.html#разные-варианты-options-composition-и-script-setup-api","12":"/book/ru/Chapter 1_ The Vue 3 Framework.html#изучение-встроенных-директив-в-vue-3","13":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-bind-сокращение","14":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-show","15":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-if-v-else-и-v-else-if","16":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-for-и-key","17":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-model","18":"/book/ru/Chapter 1_ The Vue 3 Framework.html#v-on-и-сокращение","19":"/book/ru/Chapter 1_ The Vue 3 Framework.html#встроенные-компоненты","20":"/book/ru/Chapter 1_ The Vue 3 Framework.html#кодовые-соглашения-code-conventions-в-книге","21":"/book/ru/Chapter 1_ The Vue 3 Framework.html#переменные-и-пропсы","22":"/book/ru/Chapter 1_ The Vue 3 Framework.html#константы","23":"/book/ru/Chapter 1_ The Vue 3 Framework.html#имена-классов-и-компонентов","24":"/book/ru/Chapter 1_ The Vue 3 Framework.html#функции-методы-события-и-имена-фаилов","25":"/book/ru/Chapter 1_ The Vue 3 Framework.html#экземпляры","26":"/book/ru/Chapter 1_ The Vue 3 Framework.html#подведение-итогов","27":"/book/ru/Chapter 1_ The Vue 3 Framework.html#вопросы-для-проверки","28":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#принципы-и-шаблоны-проектирования-программного-обеспечения","29":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#каковы-принципы-проектирования-программного-обеспечения","30":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#неполныи-список-принципов-проектирования","31":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#separation-of-concerns-разделение-ответственности","32":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#composition-over-inheritance-композиция-над-наследованием","33":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#single-responsibility-principle-принцип-единои-ответственности","34":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#encapsulation-инкапсуляция","35":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#kic-сохраняите-в-себе-все-необходимые-параметры","36":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#kic-keep-it-clean","37":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#dry-–-don-t-repeat-yourself-не-повторяися","38":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#kiss-keep-it-simple-and-short-держи-это-простым-и-коротким","39":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#code-for-the-next-пиши-код-для-следующего","40":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#что-такое-шаблон-проектирования-программного-обеспечения","41":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#краткии-справочныи-список-шаблонов","42":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#порождающие-шаблоны","43":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#поведенческие-шаблоны","44":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#структурные-шаблоны","45":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#асинхронные-шаблоны","46":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-singleton","47":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#когда-его-использовать","48":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#реализация","49":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#метод-1","50":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#метод-2","51":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-dependency-injection-инъекция-зависимостеи","52":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-1-js","53":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-2-js","54":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-3-js","55":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-4-js","56":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-5-js","57":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-6-js","58":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-dependency-injection-7-js","59":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-factory-фабрика","60":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-observer-наблюдатель","61":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-observer-1-js","62":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-command-комманда","63":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-command-1-js","64":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-proxy","65":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-proxy-1-js","66":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-decorator-декоратор","67":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-decorator-1-vue","68":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-decorator-2-vue","69":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-facade-фасад","70":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-callback-обратныи-вызов","71":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#chapter-2-callback-1-js-синхронныи-фибоначчи","72":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#шаблон-promise-обещаниe","73":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#подведение-итогов","74":"/book/ru/Chapter 2_ Software Design Principles and Patterns.html#вопросы-для-проверки","75":"/book/ru/#vue-js-3-design-patterns-and-best-practices","76":"/book/ru/#предисловие","77":"/book/ru/#для-кого-эта-книга","78":"/book/ru/#чтобы-получить-максимальную-пользу-от-этои-книги","79":"/book/ru/#скачать-фаилы-кода-примеров","80":"/book/ru/#код-в-деиствии","81":"/book/ru/not-implemented.html#глава-еще-не-переведена","82":"/book/ru/summary.html#что-включает-в-себя-эта-книга","83":"/book/ru/summary.html#глава-1-фреимворк-vue-3","84":"/book/ru/summary.html#глава-2-принципы-проектирования-программного-обеспечения-и-паттерны","85":"/book/ru/summary.html#глава-3-создание-рабочего-проекта","86":"/book/ru/summary.html#глава-4-композиция-пользовательского-интерфеиса-с-помощью-компонентов","87":"/book/ru/summary.html#глава-5-одностраничные-приложения","88":"/book/ru/summary.html#глава-6-прогрессивные-веб-приложения","89":"/book/ru/summary.html#глава-7-управление-потоками-данных","90":"/book/ru/summary.html#глава-8-многопоточность-с-помощью-веб-рабочих","91":"/book/ru/summary.html#глава-9-тестирование-и-контроль-исходных-текстов","92":"/book/ru/summary.html#глава-10-развертывание-приложения","93":"/book/ru/summary.html#глава-11-бонусная-глава-ux-patterns","94":"/book/ru/summary.html#приложение-миграция-с-vue-2-на-vue-3","95":"/deployment/ci-cd.html#ci-cd","96":"/deployment/docker.html#docker","97":"/deployment/github-actions.html#github-actions","98":"/deployment/hosting.html#хостинг","99":"/development/assets.html#ресурсы-приложения","100":"/development/assets.html#baseicon","101":"/development/assets.html#icons-js","102":"/development/building.html#создание-и-сборка-приложения","103":"/development/ide.html#настроика-ide","104":"/development/libraries.html#подскажите-удобную-библиотеку","105":"/development/misc.html#полезные-советы","106":"/development/stores.html#state-management-во-vue-3","107":"/development/testing.html#тестирование","108":"/frontend/about-frameworks.html#о-фронтенд-фреимворках","109":"/frontend/architecture.html#архитектура-фронтэнд-приложении","110":"/frontend/architecture.html#избегаите-зависимостеи","111":"/frontend/architecture.html#используите-обертки-над-компонентами-ui-библиотек-и-сторонних-утилит","112":"/frontend/architecture.html#регулярныи-рефакторинг","113":"/frontend/architecture.html#используите-css3","114":"/frontend/architecture.html#используите-современные-стандарты-и-возможности-языков","115":"/frontend/architecture.html#документируите-проект","116":"/frontend/css-ui-libs.html#css-и-ui-библиотеки","117":"/frontend/learning.html#изучение-vue","118":"/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-и-seo","119":"/misc/CHANGELOG.html#история-изменении","120":"/misc/CHANGELOG.html#v1-3-10-10-2023","121":"/misc/CHANGELOG.html#изменено","122":"/misc/CHANGELOG.html#v1-2-27-09-2023","123":"/misc/CHANGELOG.html#новое","124":"/misc/CHANGELOG.html#изменено-1","125":"/misc/CHANGELOG.html#v1-1-15-09-2023","126":"/misc/CHANGELOG.html#новое-1","127":"/misc/CHANGELOG.html#изменено-2","128":"/misc/CHANGELOG.html#v1-0-11-09-2023","129":"/misc/CHANGELOG.html#новое-2","130":"/misc/cheat-sheets.html#шпаргалки-cheat-sheet","131":"/misc/cheat-sheets.html#vue","132":"/misc/cheat-sheets.html#javascript","133":"/misc/cheat-sheets.html#html","134":"/misc/cheat-sheets.html#css","135":"/misc/cheat-sheets.html#typescript","136":"/misc/cheat-sheets.html#markdown","137":"/misc/contribute.html#внесите-лепту-в-развитие-данного-faq","138":"/misc/glossary.html#глоссарии-и-сокращения","139":"/misc/introduction.html#предисловие"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,1],"1":[2,5,123],"2":[3,1,380],"3":[6,1,258],"4":[1,1,230],"5":[6,1,144],"6":[3,1,278],"7":[2,3,478],"8":[5,3,260],"9":[5,7,231],"10":[3,3,287],"11":[8,3,541],"12":[6,3,48],"13":[5,7,60],"14":[2,7,67],"15":[4,7,97],"16":[4,7,95],"17":[2,7,92],"18":[5,7,135],"19":[2,3,264],"20":[6,3,46],"21":[3,9,18],"22":[1,9,44],"23":[4,9,17],"24":[6,9,9],"25":[3,9,119],"26":[2,3,49],"27":[3,3,68],"28":[6,1,196],"29":[6,6,64],"30":[4,6,25],"31":[6,9,195],"32":[7,9,123],"33":[7,9,210],"34":[3,9,104],"35":[7,9,1],"36":[4,9,277],"37":[8,9,182],"38":[12,9,128],"39":[9,9,167],"40":[7,6,185],"41":[4,6,39],"42":[2,19,16],"43":[2,19,14],"44":[2,19,18],"45":[2,19,70],"46":[2,10,50],"47":[3,12,52],"48":[1,12,37],"49":[2,13,79],"50":[2,13,153],"51":[6,10,78],"52":[7,16,40],"53":[6,16,95],"54":[7,16,40],"55":[7,16,102],"56":[7,16,195],"57":[7,16,116],"58":[7,16,138],"59":[4,10,86],"60":[4,10,175],"61":[6,14,235],"62":[4,10,129],"63":[6,14,135],"64":[2,10,267],"65":[6,12,255],"66":[4,10,304],"67":[6,14,111],"68":[5,14,90],"69":[4,10,273],"70":[5,10,212],"71":[8,15,244],"72":[4,10,425],"73":[2,6,92],"74":[3,6,42],"75":[8,1,4],"76":[1,8,121],"77":[4,8,49],"78":[7,8,152],"79":[4,8,25],"80":[3,8,41],"81":[4,1,1],"82":[6,1,1],"83":[5,7,20],"84":[8,7,26],"85":[5,7,39],"86":[8,7,22],"87":[4,7,15],"88":[5,7,21],"89":[5,7,32],"90":[7,7,28],"91":[7,7,35],"92":[4,7,29],"93":[6,7,29],"94":[7,7,16],"95":[2,1,64],"96":[1,1,1],"97":[2,1,450],"98":[1,1,137],"99":[2,1,203],"100":[1,3,69],"101":[2,3,107],"102":[4,1,219],"103":[2,1,861],"104":[3,1,42],"105":[2,1,262],"106":[5,1,525],"107":[1,1,162],"108":[3,1,414],"109":[3,1,273],"110":[2,4,78],"111":[9,4,41],"112":[2,4,29],"113":[2,4,47],"114":[6,4,18],"115":[2,4,30],"116":[4,1,223],"117":[2,1,431],"118":[6,1,532],"119":[2,1,1],"120":[5,2,1],"121":[1,7,9],"122":[6,2,1],"123":[1,8,6],"124":[1,8,24],"125":[6,2,1],"126":[1,8,3],"127":[1,8,4],"128":[6,2,1],"129":[1,8,3],"130":[4,1,1],"131":[1,4,5],"132":[1,4,4],"133":[1,4,4],"134":[1,4,6],"135":[1,4,8],"136":[1,4,2],"137":[6,1,37],"138":[3,1,66],"139":[1,1,73]},"averageFieldLength":[4.071428571428569,6.628571428571427,120.6214285714286],"storedFields":{"0":{"title":"Абстракция канала связи с бэкендом","titles":[]},"1":{"title":"API сервис","titles":["Абстракция канала связи с бэкендом"]},"2":{"title":"Аутентификация и авторизация","titles":[]},"3":{"title":"Варианты задействовать свой бэкенд для фронтендера","titles":[]},"4":{"title":"CORS","titles":[]},"5":{"title":"Протоколы. To REST или не REST?","titles":[]},"6":{"title":"Фреймворк Vue 3","titles":[]},"7":{"title":"Прогрессивный фреймворк","titles":["Фреймворк Vue 3"]},"8":{"title":"Использование Vue в веб-приложении","titles":["Фреймворк Vue 3"]},"9":{"title":"Путь сборщика, лучший путь...","titles":["Фреймворк Vue 3","Использование Vue в веб-приложении"]},"10":{"title":"Понимание однофайловых компонентов","titles":["Фреймворк Vue 3"]},"11":{"title":"Разные варианты - options, composition, и script setup API","titles":["Фреймворк Vue 3"]},"12":{"title":"Изучение встроенных директив в Vue 3","titles":["Фреймворк Vue 3"]},"13":{"title":"v-bind: (сокращение ":")","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"14":{"title":"v-show","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"15":{"title":"v-if, v-else и v-else-if","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"16":{"title":"v-for и :key","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"17":{"title":"v-model","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"18":{"title":"v-on: (и сокращение @)","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"19":{"title":"Встроенные компоненты","titles":["Фреймворк Vue 3"]},"20":{"title":"Кодовые соглашения (code conventions) в книге","titles":["Фреймворк Vue 3"]},"21":{"title":"Переменные и пропсы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"22":{"title":"Константы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"23":{"title":"Имена классов и компонентов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"24":{"title":"Функции, методы, события и имена файлов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"25":{"title":""Экземпляры","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"26":{"title":"Подведение итогов","titles":["Фреймворк Vue 3"]},"27":{"title":"Вопросы для проверки","titles":["Фреймворк Vue 3"]},"28":{"title":"Принципы и шаблоны проектирования программного обеспечения","titles":[]},"29":{"title":"Каковы принципы проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"30":{"title":"Неполный список принципов проектирования","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"31":{"title":"Separation of concerns (Разделение ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"32":{"title":"Composition over inheritance (Композиция над наследованием)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"33":{"title":"Single responsibility principle (Принцип единой ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"34":{"title":"Encapsulation (Инкапсуляция)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"35":{"title":"KIC - сохраняйте в себе все необходимые параметры","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"36":{"title":"KIC - keep it clean","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"37":{"title":"DRY – don’t repeat yourself (не повторяйся)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"38":{"title":"KISS - keep it simple and short (держи это простым и коротким)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"39":{"title":"Code for the next (Пиши код для следующего)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"40":{"title":"Что такое шаблон проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"41":{"title":"Краткий справочный список шаблонов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"42":{"title":"Порождающие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"43":{"title":"Поведенческие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"44":{"title":"Структурные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"45":{"title":"Асинхронные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"46":{"title":"Шаблон Singleton","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"47":{"title":"Когда его использовать","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"48":{"title":"Реализация","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"49":{"title":"Метод 1","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"50":{"title":"Метод 2","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"51":{"title":"Шаблон Dependency injection (инъекция зависимостей)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"52":{"title":"./chapter 2/dependency-injection-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"53":{"title":"./chapter 2/dependency-injection-2.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"54":{"title":"./chapter 2/dependency-injection-3.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"55":{"title":"./chapter 2/dependency-injection-4.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"56":{"title":"./chapter 2/dependency-injection-5.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"57":{"title":"./chapter 2/dependency-injection-6.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"58":{"title":"./chapter 2/dependency-injection-7.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"59":{"title":"Шаблон factory (фабрика)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"60":{"title":"Шаблон Observer (наблюдатель)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"61":{"title":"./chapter 2/Observer-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Observer (наблюдатель)"]},"62":{"title":"Шаблон Command (комманда)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"63":{"title":"./chapter 2/Command-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Command (комманда)"]},"64":{"title":"Шаблон Proxy","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"65":{"title":"./chapter 2/proxy-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Proxy"]},"66":{"title":"Шаблон Decorator (декоратор)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"67":{"title":"./chapter 2/decorator-1.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"68":{"title":"./chapter 2/decorator-2.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"69":{"title":"Шаблон Façade (фасад)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"70":{"title":"Шаблон Callback (обратный вызов)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"71":{"title":"./chapter 2/callback-1.js - Синхронный Фибоначчи","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Callback (обратный вызов)"]},"72":{"title":"Шаблон Promise (обещаниe)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"73":{"title":"Подведение итогов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"74":{"title":"Вопросы для проверки","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"75":{"title":"Vue.js 3 Design Patterns and Best Practices","titles":[]},"76":{"title":"Предисловие","titles":["Vue.js 3 Design Patterns and Best Practices"]},"77":{"title":"Для кого эта книга","titles":["Vue.js 3 Design Patterns and Best Practices"]},"78":{"title":"Чтобы получить максимальную пользу от этой книги","titles":["Vue.js 3 Design Patterns and Best Practices"]},"79":{"title":"Скачать файлы кода примеров","titles":["Vue.js 3 Design Patterns and Best Practices"]},"80":{"title":"Код в действии","titles":["Vue.js 3 Design Patterns and Best Practices"]},"81":{"title":"Глава еще не переведена","titles":[null]},"82":{"title":"Что включает в себя эта книга","titles":[]},"83":{"title":"Глава 1, Фреймворк Vue 3","titles":["Что включает в себя эта книга",null]},"84":{"title":"Глава 2, Принципы проектирования программного обеспечения и паттерны","titles":["Что включает в себя эта книга",null]},"85":{"title":"Глава 3, Создание рабочего проекта","titles":["Что включает в себя эта книга",null]},"86":{"title":"Глава 4, Композиция пользовательского интерфейса с помощью компонентов","titles":["Что включает в себя эта книга",null]},"87":{"title":"Глава 5, Одностраничные приложения","titles":["Что включает в себя эта книга",null]},"88":{"title":"Глава 6, Прогрессивные веб-приложения","titles":["Что включает в себя эта книга",null]},"89":{"title":"Глава 7, Управление потоками данных","titles":["Что включает в себя эта книга",null]},"90":{"title":"Глава 8, Многопоточность с помощью веб-рабочих","titles":["Что включает в себя эта книга",null]},"91":{"title":"Глава 9, Тестирование и контроль исходных текстов","titles":["Что включает в себя эта книга",null]},"92":{"title":"Глава 10, Развертывание приложения","titles":["Что включает в себя эта книга",null]},"93":{"title":"Глава 11, бонусная глава - UX Patterns","titles":["Что включает в себя эта книга",null]},"94":{"title":"Приложение: Миграция с Vue 2 на Vue 3","titles":["Что включает в себя эта книга",null]},"95":{"title":"CI/CD","titles":[]},"96":{"title":"Docker","titles":[]},"97":{"title":"Github Actions","titles":[]},"98":{"title":"Хостинг","titles":[]},"99":{"title":"Ресурсы приложения","titles":[]},"100":{"title":"BaseIcon","titles":["Ресурсы приложения",null,null]},"101":{"title":"icons.js","titles":["Ресурсы приложения",null,null]},"102":{"title":"Создание и сборка приложения","titles":[]},"103":{"title":"Настройка IDE","titles":[]},"104":{"title":"Подскажите удобную библиотеку","titles":[]},"105":{"title":"Полезные советы","titles":[]},"106":{"title":"State management во Vue 3","titles":[]},"107":{"title":"Тестирование","titles":[]},"108":{"title":"О фронтенд фреймворках","titles":[]},"109":{"title":"Архитектура фронтэнд приложений","titles":[]},"110":{"title":"Избегайте зависимостей","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"111":{"title":"Используйте обертки над компонентами UI библиотек и сторонних утилит","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"112":{"title":"Регулярный рефакторинг","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"113":{"title":"Используйте CSS3","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"114":{"title":"Используйте современные стандарты и возможности языков","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"115":{"title":"Документируйте проект","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"116":{"title":"CSS и UI библиотеки","titles":[]},"117":{"title":"Изучение Vue","titles":[]},"118":{"title":"SPA, PWA, SSG, SSR и SEO","titles":[]},"119":{"title":"История изменений","titles":[]},"120":{"title":"v1.3 (10-10-2023)","titles":["История изменений"]},"121":{"title":"Изменено","titles":["История изменений","v1.3 (10-10-2023)",null]},"122":{"title":"v1.2 (27-09-2023)","titles":["История изменений"]},"123":{"title":"Новое","titles":["История изменений","v1.2 (27-09-2023)",null]},"124":{"title":"Изменено","titles":["История изменений","v1.2 (27-09-2023)",null]},"125":{"title":"v1.1 (15-09-2023)","titles":["История изменений"]},"126":{"title":"Новое","titles":["История изменений","v1.1 (15-09-2023)"]},"127":{"title":"Изменено","titles":["История изменений","v1.1 (15-09-2023)"]},"128":{"title":"v1.0 (11-09-2023)","titles":["История изменений"]},"129":{"title":"Новое","titles":["История изменений","v1.0 (11-09-2023)"]},"130":{"title":"Шпаргалки (Cheat Sheet)","titles":[]},"131":{"title":"Vue","titles":["Шпаргалки (Cheat Sheet)",null]},"132":{"title":"JavaScript","titles":["Шпаргалки (Cheat Sheet)",null]},"133":{"title":"HTML","titles":["Шпаргалки (Cheat Sheet)",null]},"134":{"title":"CSS","titles":["Шпаргалки (Cheat Sheet)",null]},"135":{"title":"Typescript","titles":["Шпаргалки (Cheat Sheet)",null]},"136":{"title":"Markdown","titles":["Шпаргалки (Cheat Sheet)",null]},"137":{"title":"Внесите лепту в развитие данного FAQ","titles":[]},"138":{"title":"Глоссарий и сокращения","titles":[]},"139":{"title":"Предисловие","titles":[]}},"dirtCount":0,"index":[[">",{"2":{"137":2}}],["qbutton",{"2":{"116":2}}],["questions",{"2":{"139":1}}],["query",{"2":{"114":1}}],["queuebuilder",{"2":{"23":1}}],["quasar",{"2":{"103":4,"104":1}}],["quiet",{"2":{"103":2}}],["quicktime",{"2":{"6":1}}],["quot",{"0":{"13":2,"25":1},"2":{"1":40,"2":2,"3":4,"7":6,"8":22,"9":2,"10":4,"11":32,"13":4,"14":4,"16":8,"17":8,"18":8,"19":28,"27":2,"28":2,"34":2,"36":12,"39":2,"40":2,"50":12,"52":10,"53":4,"54":4,"55":8,"56":20,"58":36,"59":16,"60":4,"61":20,"62":4,"63":12,"64":2,"65":10,"66":2,"68":12,"69":2,"71":22,"72":18,"76":6,"97":92,"99":28,"100":60,"101":32,"102":48,"103":1298,"105":4,"106":8,"108":4,"109":4,"113":2,"117":3,"118":6}}],["ютюбе",{"2":{"117":1}}],["ютюба",{"2":{"117":1}}],["ю",{"2":{"108":1}}],["юзер",{"2":{"2":1}}],["^",{"2":{"103":2}}],["^20",{"2":{"102":2}}],["zero",{"2":{"103":2}}],["`~",{"2":{"103":2}}],["`$",{"2":{"100":8}}],["`",{"2":{"97":6,"99":2}}],["|",{"2":{"97":8,"103":2}}],["🚀",{"2":{"97":2}}],["🛎️",{"2":{"97":2}}],["yarnrc",{"2":{"103":4}}],["yarn",{"2":{"102":1,"103":8}}],["yamllint",{"2":{"103":4}}],["yaml",{"2":{"97":10,"103":14}}],["y",{"2":{"97":2}}],["your",{"2":{"97":23,"106":2}}],["yourself",{"0":{"37":1},"2":{"28":1,"103":2}}],["09",{"0":{"122":1,"125":1,"128":1},"1":{"123":1,"124":1,"126":1,"127":1,"129":1}}],["04",{"2":{"103":2}}],["0",{"0":{"128":1},"1":{"129":1},"2":{"60":1,"65":2,"70":4,"71":4,"72":2,"97":10,"118":2}}],["6",{"0":{"57":1,"88":1},"2":{"57":2,"58":4,"64":1,"65":2}}],["60",{"2":{"38":1}}],["8",{"0":{"90":1},"2":{"37":1,"40":1,"63":1,"65":6,"69":2,"71":4,"97":4}}],["karma",{"2":{"103":20}}],["kiss",{"0":{"38":1},"2":{"28":1,"38":2}}],["kic",{"0":{"35":1,"36":1},"2":{"28":1,"36":1}}],["keep",{"0":{"36":1,"38":1},"2":{"28":2,"36":1,"61":1}}],["keepalive",{"2":{"19":2}}],["keys",{"2":{"106":1}}],["key=",{"2":{"16":2}}],["key",{"0":{"16":1},"2":{"16":1,"19":1,"65":10,"97":17}}],["$dirs",{"2":{"97":2}}],["$root",{"2":{"97":6}}],["$router",{"2":{"22":1}}],["$backup",{"2":{"97":12}}],["$env",{"2":{"97":2}}],["$project",{"2":{"97":6}}],["$props",{"2":{"67":4,"68":4}}],["$github",{"2":{"97":10}}],["$target",{"2":{"97":16}}],["$store=usestore",{"2":{"22":1}}],["$notifications",{"2":{"22":1}}],["$modals",{"2":{"22":1}}],["$",{"2":{"22":1,"97":30,"99":2,"103":192}}],["50кб",{"2":{"105":1}}],["58",{"2":{"103":2}}],["5async",{"2":{"72":1}}],["5",{"0":{"56":1,"87":1},"2":{"16":3,"57":2,"61":2,"62":1,"65":2,"72":1,"93":1,"97":5}}],["цитата",{"2":{"116":1}}],["цикл",{"2":{"16":1,"36":1}}],["циклу",{"2":{"16":1}}],["цикла",{"2":{"11":1,"16":1,"36":2,"56":1}}],["цукерберг",{"2":{"108":1}}],["цепляемыми",{"2":{"66":1}}],["цепочку",{"2":{"57":1,"71":1,"72":2}}],["цепочке",{"2":{"8":1,"72":1}}],["целесообразно",{"2":{"109":1}}],["целесообразность",{"2":{"107":1}}],["целевым",{"2":{"64":1}}],["целевого",{"2":{"66":1,"67":2,"68":1}}],["целевому",{"2":{"64":1,"66":1,"68":1}}],["целевой",{"2":{"64":4,"65":2,"66":1}}],["целевая",{"2":{"64":1}}],["целей",{"2":{"6":1,"40":1}}],["целая",{"2":{"45":1}}],["целые",{"2":{"40":1}}],["целом",{"2":{"39":1,"69":1,"103":1,"116":1,"117":1,"118":2}}],["целое",{"2":{"9":1,"34":1}}],["цели",{"2":{"31":1,"97":1,"106":1}}],["целью",{"2":{"65":1}}],["цельсия",{"2":{"64":1}}],["цель",{"2":{"8":1,"64":2,"66":3}}],["центр",{"2":{"2":1}}],["70",{"2":{"117":2}}],["77",{"2":{"65":2}}],["7",{"0":{"58":1,"89":1},"2":{"11":1,"51":1,"57":2,"58":1,"65":3,"66":1}}],["4",{"0":{"55":1,"86":1},"2":{"10":2,"16":1,"17":1,"32":1,"36":1,"57":2,"58":1,"60":1,"61":2,"65":2,"66":1,"67":1,"72":5,"77":1,"78":1,"101":4,"103":2}}],["401",{"2":{"2":2}}],["+page",{"2":{"103":12}}],["+layout",{"2":{"103":14}}],["+$backups",{"2":{"97":2}}],["+f",{"2":{"70":2}}],["+",{"2":{"7":2,"65":2,"71":2,"72":6,"78":1,"97":2,"101":4}}],["щепоткой",{"2":{"7":1}}],["9",{"0":{"91":1},"2":{"65":1,"71":4,"72":2}}],["9let",{"2":{"65":1}}],["99",{"2":{"5":1,"106":3}}],["95",{"2":{"2":1,"104":1}}],["шпаргалки",{"0":{"130":1},"1":{"131":1,"132":1,"133":1,"134":1,"135":1,"136":1}}],["шагом",{"2":{"85":1}}],["шаге",{"2":{"66":1}}],["шаг",{"2":{"66":1,"85":1,"118":1}}],["шаблону",{"2":{"69":1,"106":1}}],["шаблоном",{"2":{"60":1,"64":1,"74":1}}],["шаблонов",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"28":3,"39":1,"40":2,"41":2,"45":2,"50":1,"58":1}}],["шаблон",{"0":{"40":1,"46":1,"51":1,"59":1,"60":1,"62":1,"64":1,"66":1,"69":1,"70":1,"72":1},"1":{"47":1,"48":1,"49":1,"50":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"61":1,"63":1,"65":1,"67":1,"68":1,"71":1},"2":{"11":1,"40":2,"42":3,"43":2,"44":3,"45":2,"46":1,"47":1,"50":2,"51":1,"56":1,"58":1,"59":1,"60":2,"61":1,"62":1,"63":2,"64":3,"65":1,"66":3,"68":2,"69":4,"70":3,"71":1,"72":2,"74":1,"106":1,"108":2,"109":1,"116":1}}],["шаблоне",{"2":{"11":5,"66":3,"69":1,"99":1}}],["шаблонам",{"2":{"118":1}}],["шаблонами",{"2":{"45":1,"47":1,"59":1,"65":1,"72":1}}],["шаблонах",{"2":{"69":1}}],["шаблона",{"2":{"11":1,"40":1,"48":2,"60":1,"62":2,"63":1,"64":2,"66":2,"68":1,"69":2,"71":2}}],["шаблоны",{"0":{"28":1,"42":1,"43":1,"44":1,"45":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"6":1,"19":1,"28":1,"40":2,"41":1,"44":1,"65":1,"73":4,"74":2,"84":1,"93":1}}],["штатном",{"2":{"103":1}}],["штабелируемыми",{"2":{"66":1}}],["штука",{"2":{"5":1}}],["шкале",{"2":{"66":1}}],["шлюз",{"2":{"47":1}}],["шлюза",{"2":{"46":1}}],["широкий",{"2":{"51":1}}],["широком",{"2":{"63":1}}],["широко",{"2":{"45":1,"72":1}}],["шина",{"2":{"5":1}}],["300",{"2":{"103":2}}],["30",{"2":{"103":2}}],["34console",{"2":{"71":1,"72":1}}],["34",{"2":{"71":4,"72":1}}],["32",{"2":{"65":6}}],["39",{"2":{"19":4,"67":4,"68":8,"97":12,"99":4,"103":22}}],["3",{"0":{"6":1,"12":1,"54":1,"75":1,"83":1,"85":1,"94":1,"106":1,"120":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"76":1,"77":1,"78":1,"79":1,"80":1,"121":1},"2":{"4":2,"6":3,"7":1,"8":3,"9":3,"10":2,"11":4,"16":1,"18":1,"19":2,"20":1,"26":1,"28":1,"32":1,"33":1,"34":1,"36":2,"40":2,"57":2,"58":2,"60":1,"61":3,"63":3,"64":2,"65":3,"66":1,"68":4,"69":1,"72":5,"73":1,"76":2,"78":2,"79":1,"83":1,"84":1,"89":2,"91":1,"92":1,"102":2,"103":2,"105":3,"106":9,"108":3,"109":2,"116":1,"117":4,"131":1,"139":1}}],["27",{"0":{"122":1},"1":{"123":1,"124":1}}],["22+",{"2":{"103":1}}],["29",{"2":{"103":2}}],["24",{"2":{"100":4}}],["26",{"2":{"99":2}}],["2022",{"2":{"139":1}}],["2023",{"0":{"120":1,"122":1,"125":1,"128":1},"1":{"121":1,"123":1,"124":1,"126":1,"127":1,"129":1},"2":{"103":2,"117":1,"139":1}}],["2016",{"2":{"117":1}}],["20~30",{"2":{"102":1}}],["200",{"2":{"98":1,"103":2,"118":1}}],["20",{"2":{"97":2,"106":1,"117":1}}],["21fibonaccisync",{"2":{"71":1}}],["21",{"2":{"71":3}}],["25",{"2":{"65":4}}],["2",{"0":{"50":1,"52":1,"53":2,"54":1,"55":1,"56":1,"57":1,"58":1,"61":1,"63":1,"65":1,"67":1,"68":2,"71":1,"84":1,"94":1,"122":1},"1":{"123":1,"124":1},"2":{"4":2,"5":1,"6":1,"11":4,"16":1,"31":1,"33":2,"57":2,"60":2,"61":2,"62":1,"63":2,"64":1,"65":2,"66":1,"67":3,"68":3,"69":1,"70":2,"71":20,"72":17,"94":1,"103":6,"105":7,"106":2,"108":1,"116":1,"117":3,"118":1,"134":2}}],["way",{"2":{"137":1}}],["watch",{"2":{"108":1}}],["watchman",{"2":{"103":4}}],["words",{"2":{"106":1}}],["wordseparators",{"2":{"103":2}}],["workbox",{"2":{"118":2}}],["workbench",{"2":{"103":22}}],["worker",{"2":{"118":3,"138":1}}],["workers",{"2":{"37":1,"40":1,"47":1,"63":1,"69":1,"77":1}}],["workspace",{"2":{"103":6}}],["workingissueformatscm",{"2":{"103":2}}],["work",{"2":{"97":2,"103":4}}],["workflow",{"2":{"97":3}}],["workflows",{"2":{"97":5}}],["world",{"2":{"6":1,"8":2,"10":2,"11":7}}],["windi",{"2":{"103":20}}],["windows",{"2":{"78":5}}],["window",{"2":{"36":4,"97":2,"103":8}}],["width",{"2":{"100":14}}],["wide",{"2":{"6":1}}],["with",{"2":{"97":16,"101":2,"103":2}}],["wiki",{"2":{"38":1}}],["wikipedia",{"2":{"38":1}}],["write",{"2":{"10":2,"97":2,"106":1}}],["we",{"2":{"10":2}}],["webdriverio",{"2":{"107":1}}],["webpack",{"2":{"102":4,"103":26}}],["webp",{"2":{"101":1}}],["webstorm",{"2":{"103":2}}],["website",{"2":{"97":2,"98":5}}],["websocket",{"2":{"5":1}}],["websockets",{"2":{"1":1,"5":3,"117":1}}],["web",{"2":{"6":1,"37":1,"40":1,"47":1,"63":1,"69":1,"76":1,"77":1,"78":1,"118":4}}],["www",{"2":{"4":1,"61":1,"80":1,"97":12}}],["huskyrc",{"2":{"103":4}}],["hxx",{"2":{"103":6}}],["hpp",{"2":{"103":6}}],["histoire",{"2":{"103":20}}],["history",{"2":{"103":10}}],["highlightmodifiedtabs",{"2":{"103":2}}],["hmr",{"2":{"102":1}}],["h",{"2":{"97":2,"103":8}}],["handler",{"2":{"65":5}}],["holding",{"2":{"106":2}}],["houdini",{"2":{"103":2}}],["hover",{"2":{"103":2}}],["hooks",{"2":{"11":1,"103":8}}],["hosts",{"2":{"106":1}}],["host",{"2":{"4":2,"97":14}}],["h1",{"2":{"10":6,"66":1,"67":5}}],["heidisql",{"2":{"103":1}}],["height",{"2":{"100":14}}],["heex",{"2":{"103":2}}],["hexcolorlength",{"2":{"103":2}}],["helps",{"2":{"101":2}}],["hello=",{"2":{"11":1}}],["hello",{"2":{"8":2,"10":2,"11":19}}],["heroku",{"2":{"98":1}}],["here",{"2":{"10":2}}],["header",{"2":{"114":1}}],["headerh1",{"2":{"68":6}}],["headless",{"2":{"107":1,"116":1}}],["head",{"2":{"8":5}}],["htmlnanorc",{"2":{"103":40}}],["html=",{"2":{"100":2}}],["html5",{"2":{"6":1,"114":1,"133":1}}],["html",{"0":{"133":1},"2":{"4":1,"6":5,"7":2,"8":7,"9":2,"10":7,"11":1,"12":2,"13":4,"17":2,"18":4,"19":4,"34":1,"65":1,"78":2,"93":1,"97":2,"98":1,"99":2,"103":11,"108":3,"117":1,"118":10}}],["https",{"2":{"4":10,"8":2,"18":1,"19":2,"38":1,"61":1,"79":1,"80":1,"98":1,"103":4,"118":1}}],["httponly",{"2":{"2":3}}],["http",{"2":{"1":21,"3":1,"4":4,"99":1}}],["12",{"2":{"117":1}}],["15",{"0":{"125":1},"1":{"126":1,"127":1},"2":{"110":1}}],["16гб",{"2":{"103":1}}],["11",{"0":{"93":1,"128":1},"1":{"129":1}}],["1000",{"2":{"106":1}}],["100",{"2":{"100":4,"118":1}}],["10",{"0":{"92":1,"120":2},"1":{"121":2},"2":{"78":1,"103":2,"116":1,"117":2}}],["1+pre",{"2":{"71":2}}],["1",{"0":{"49":1,"52":1,"61":1,"63":1,"65":1,"67":1,"71":1,"83":1,"125":1},"1":{"126":1,"127":1},"2":{"4":11,"5":1,"9":2,"16":1,"31":1,"50":1,"57":2,"60":1,"61":6,"63":2,"64":1,"65":6,"67":3,"68":5,"70":6,"71":14,"72":16,"78":1,"101":4,"102":2,"105":4,"106":1,"118":1}}],["хедером",{"2":{"109":1}}],["хватает",{"2":{"104":1}}],["хэш",{"2":{"99":1}}],["хранятся",{"2":{"117":1}}],["хранит",{"2":{"105":1}}],["хранить",{"2":{"2":1,"97":1,"106":1}}],["хранения",{"2":{"56":1,"57":1}}],["х",{"2":{"38":1}}],["ханту",{"2":{"37":1}}],["хочу",{"2":{"109":2,"117":1}}],["хочется",{"2":{"39":1}}],["хочет",{"2":{"3":2}}],["хостите",{"2":{"98":1}}],["хостинг",{"0":{"98":1},"2":{"98":1}}],["хост",{"2":{"97":2}}],["хостеры",{"2":{"98":1}}],["хосте",{"2":{"97":1}}],["холсте",{"2":{"59":1}}],["хоть",{"2":{"108":2}}],["хотим",{"2":{"66":1}}],["хотите",{"2":{"7":1,"10":2,"105":1}}],["хотя",{"2":{"32":1,"50":1,"70":1,"117":1}}],["хорош",{"2":{"110":1}}],["хорошие",{"2":{"108":1,"116":2}}],["хороший",{"2":{"7":1,"32":1,"36":1,"103":1}}],["хорошее",{"2":{"65":1}}],["хорошего",{"2":{"36":1}}],["хорошей",{"2":{"20":1,"84":1}}],["хорошая",{"2":{"10":1,"107":1,"109":2}}],["хорошо",{"2":{"6":1,"11":1,"69":2,"103":1,"116":1}}],["ящики",{"2":{"34":1}}],["яркий",{"2":{"34":1}}],["ячеек",{"2":{"31":1}}],["я",{"2":{"8":1,"11":2,"19":1,"33":1,"36":1,"61":2,"64":1,"65":1,"71":1,"72":2,"80":1,"109":2,"117":2}}],["языком",{"2":{"32":1}}],["языков",{"0":{"114":1},"2":{"7":1,"48":1,"50":1,"105":1,"109":1}}],["язык",{"2":{"5":1,"6":2,"25":1,"32":1,"93":1,"106":1,"117":1}}],["языках",{"2":{"33":2,"108":1,"109":1}}],["языками",{"2":{"10":1,"36":1}}],["языка",{"2":{"4":1,"32":1,"41":1,"105":1,"117":1}}],["языке",{"2":{"3":2,"11":1,"28":1,"117":1}}],["явная",{"2":{"37":1}}],["явного",{"2":{"55":1}}],["явно",{"2":{"11":1,"19":1}}],["явном",{"2":{"10":1}}],["явным",{"2":{"1":1}}],["является",{"2":{"3":1,"7":1,"8":1,"10":3,"11":4,"13":1,"27":1,"28":1,"32":1,"33":1,"34":1,"37":1,"38":1,"45":1,"49":1,"53":1,"60":1,"61":1,"64":2,"65":2,"69":3,"70":2,"71":1,"72":1,"106":1,"108":2,"109":1,"118":1}}],["являются",{"2":{"3":1,"20":1,"25":1,"30":1,"36":1,"39":1,"47":1,"49":1,"65":1,"71":1,"84":1,"105":1}}],["like",{"2":{"106":2}}],["license",{"2":{"103":2}}],["lighthouserc",{"2":{"103":40}}],["limit",{"2":{"103":6}}],["lib",{"2":{"103":2}}],["list",{"2":{"102":2,"103":2}}],["lintstagedrc",{"2":{"103":4}}],["lint",{"2":{"103":8}}],["line",{"2":{"103":2}}],["linenumbers",{"2":{"103":2}}],["link",{"2":{"80":1}}],["linux",{"2":{"78":5,"103":1}}],["life",{"2":{"11":1}}],["l",{"2":{"61":2}}],["learn",{"2":{"117":1}}],["least",{"2":{"78":2}}],["lerna",{"2":{"103":4}}],["leex",{"2":{"103":2}}],["less",{"2":{"103":2}}],["length",{"2":{"61":2,"101":4}}],["let",{"2":{"59":2,"61":4,"71":8,"72":9,"92":2,"101":2}}],["l=this",{"2":{"61":2}}],["layouts",{"2":{"109":1}}],["last",{"2":{"103":2}}],["lastindexof",{"2":{"101":4}}],["latexmk",{"2":{"103":2}}],["latest",{"2":{"97":4}}],["label+",{"2":{"68":2}}],["label",{"2":{"67":6,"68":2}}],["language",{"2":{"22":1,"103":2}}],["lang=",{"2":{"10":1,"100":2}}],["lamda",{"2":{"3":1}}],["lambda",{"2":{"3":1}}],["lts",{"2":{"78":1}}],["lt",{"2":{"8":24,"10":16,"11":16,"13":2,"14":4,"16":4,"17":2,"18":8,"19":16,"36":4,"61":2,"67":16,"68":16,"71":8,"72":6,"99":8,"100":16,"103":3,"116":8}}],["lot",{"2":{"103":2}}],["lof",{"2":{"103":2}}],["lock",{"2":{"103":26}}],["location",{"2":{"97":2}}],["localstoragename",{"2":{"97":6}}],["localstorage",{"2":{"2":1,"97":5}}],["loadicons",{"2":{"101":4}}],["loading",{"2":{"1":4,"14":4}}],["logic",{"2":{"106":2}}],["login",{"2":{"106":1}}],["logs",{"2":{"97":2,"103":2}}],["log",{"2":{"50":2,"65":2,"66":2,"71":14,"72":15,"97":2,"103":2}}],["logout",{"2":{"1":2,"106":1}}],["czrc",{"2":{"103":4}}],["cz",{"2":{"103":4}}],["cypress",{"2":{"103":20,"107":1}}],["cycle",{"2":{"11":1}}],["cmakepresets",{"2":{"103":2}}],["cmake",{"2":{"103":6}}],["cmakelists",{"2":{"103":2}}],["cxx",{"2":{"103":2}}],["cjs",{"2":{"103":8}}],["cc",{"2":{"103":2}}],["csproj",{"2":{"103":2}}],["cspell",{"2":{"103":4}}],["cshtml",{"2":{"103":4}}],["cs",{"2":{"103":24}}],["css3",{"0":{"113":1},"2":{"113":1,"114":1,"116":1}}],["cssnano",{"2":{"103":20}}],["cssnanorc",{"2":{"103":20}}],["css",{"0":{"116":1,"134":1},"2":{"6":4,"8":1,"9":1,"10":4,"14":1,"19":1,"34":1,"78":1,"98":1,"103":10,"104":1,"108":1,"113":1,"116":9,"117":1,"118":1}}],["custom",{"2":{"103":4}}],["cursorstyle",{"2":{"103":2}}],["cursorsmoothcaretanimation",{"2":{"103":2}}],["cursorblinking",{"2":{"103":2}}],["currentcolor",{"2":{"100":4}}],["ctrlcmd",{"2":{"103":2}}],["certification",{"2":{"117":1}}],["certbot",{"2":{"98":1}}],["celsius",{"2":{"65":16}}],["cpp",{"2":{"103":2}}],["cp",{"2":{"97":2}}],["cpu",{"2":{"78":1}}],["cd",{"0":{"95":1},"2":{"95":5,"97":7,"107":1,"117":1,"124":1}}],["cdn",{"2":{"8":1}}],["citation",{"2":{"103":2}}],["ci",{"0":{"95":1},"2":{"95":5,"97":1,"107":1,"117":1,"124":1}}],["circleci",{"2":{"103":4}}],["circle",{"2":{"59":7}}],["cheat",{"0":{"130":1},"1":{"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"131":1,"132":1,"133":1,"134":4}}],["check",{"2":{"103":2}}],["checkout",{"2":{"97":7}}],["chgrp",{"2":{"97":4}}],["choice",{"2":{"97":2}}],["chromium",{"2":{"78":1}}],["chrome",{"2":{"78":2,"118":1}}],["changelog",{"2":{"103":2}}],["chainable",{"2":{"66":1}}],["chapter",{"0":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"61":1,"63":1,"65":1,"67":1,"68":1,"71":1}}],["c=result",{"2":{"72":2}}],["c++",{"2":{"36":1}}],["c",{"2":{"7":3,"11":1,"36":1,"72":7,"103":2}}],["can",{"2":{"106":1}}],["cache",{"2":{"103":2}}],["cargo",{"2":{"103":4}}],["capture",{"2":{"103":190}}],["callback",{"0":{"70":1,"71":1},"1":{"71":1},"2":{"70":1,"71":13,"72":1}}],["callbacks",{"2":{"28":1,"45":1}}],["calculatecelsius",{"2":{"65":4}}],["calculatefahrenheit",{"2":{"65":4}}],["catch",{"2":{"56":2,"72":7}}],["camelcase",{"2":{"24":1}}],["case",{"2":{"22":1,"59":4,"63":6,"65":4,"115":1}}],["ca",{"2":{"7":1}}],["clangd",{"2":{"103":2}}],["clang",{"2":{"103":4}}],["classes",{"2":{"135":1}}],["classpath",{"2":{"103":2}}],["class=",{"2":{"100":2}}],["class",{"2":{"50":3,"56":1,"61":1,"63":1,"103":2}}],["closeonfiledelete",{"2":{"103":2}}],["cloud",{"2":{"3":2,"117":1}}],["clean",{"0":{"36":1},"2":{"28":1,"36":1,"61":1,"97":2}}],["clippy",{"2":{"103":4}}],["clipboard",{"2":{"103":8}}],["cli",{"2":{"102":1,"103":4}}],["click=",{"2":{"18":4,"19":2}}],["click",{"2":{"18":2}}],["client",{"2":{"4":11}}],["crowdin",{"2":{"103":4}}],["cross",{"2":{"4":1,"103":2}}],["credits",{"2":{"103":2}}],["credo",{"2":{"103":2}}],["create",{"2":{"102":2,"137":1}}],["createshape",{"2":{"59":6}}],["createapp",{"2":{"8":6}}],["crud",{"2":{"3":1,"36":1,"51":1}}],["copying",{"2":{"103":2}}],["count`",{"2":{"97":2}}],["count=5",{"2":{"97":2}}],["count",{"2":{"21":1}}],["codesandbox",{"2":{"103":1}}],["codeowners",{"2":{"103":2}}],["codecov",{"2":{"103":20}}],["codelens",{"2":{"103":8}}],["codeaction",{"2":{"103":2}}],["codeactions",{"2":{"103":2}}],["codeactionsonsave",{"2":{"103":4}}],["codeium",{"2":{"103":1}}],["code",{"0":{"20":1,"39":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"42":1,"43":1,"44":1,"45":1},"2":{"11":1,"22":1,"28":1,"63":2,"78":2,"103":11,"108":1}}],["colortheme",{"2":{"103":2}}],["color",{"2":{"10":2,"68":3,"100":6}}],["cors",{"0":{"4":1},"2":{"4":10,"121":1}}],["commitlint",{"2":{"103":8}}],["commit",{"2":{"95":1}}],["commands",{"2":{"103":2}}],["commandinvoker",{"2":{"63":2}}],["command",{"0":{"62":1,"63":1},"1":{"63":1},"2":{"28":1,"43":1,"63":7}}],["compile",{"2":{"103":2}}],["compileroptions",{"2":{"102":2}}],["completion",{"2":{"103":2}}],["compare",{"2":{"103":12}}],["computed",{"2":{"11":1,"100":6}}],["component",{"2":{"19":5,"103":14,"106":3}}],["components",{"2":{"11":1,"19":1,"102":2,"103":2,"109":1}}],["composable",{"2":{"106":9,"108":2}}],["composables",{"2":{"1":2,"11":1,"106":1,"109":1}}],["compose",{"2":{"103":2}}],["composer",{"2":{"103":4}}],["composition",{"0":{"11":1,"32":1},"2":{"11":10,"28":1,"105":3,"117":1,"124":1}}],["comaccess",{"2":{"4":2}}],["comget",{"2":{"4":1}}],["com",{"2":{"3":1,"4":12,"8":2,"61":1,"79":1,"80":1,"97":17,"98":5,"103":4}}],["connection",{"2":{"103":1}}],["conduct",{"2":{"103":2}}],["conf",{"2":{"103":2}}],["confirmsync",{"2":{"103":2}}],["confirmdraganddrop",{"2":{"103":2}}],["confirmdelete",{"2":{"103":2}}],["configs",{"2":{"103":2}}],["config",{"2":{"102":3,"103":449}}],["container",{"2":{"114":1}}],["contributors",{"2":{"103":2}}],["contributing",{"2":{"103":2}}],["controller",{"2":{"103":2,"106":3,"108":2}}],["control",{"2":{"2":1,"4":7,"135":1}}],["contentlayer",{"2":{"103":20}}],["contents",{"2":{"97":2}}],["continuous",{"2":{"95":2}}],["console",{"2":{"50":2,"65":2,"66":1,"71":10,"72":13,"97":2}}],["constructor",{"2":{"50":2,"56":2,"61":2}}],["constant",{"2":{"11":2}}],["const",{"2":{"1":6,"8":2,"11":4,"19":2,"22":1,"25":1,"49":1,"52":2,"53":1,"54":1,"56":2,"57":1,"58":2,"67":2,"68":2,"97":1,"100":6,"101":11,"105":3,"106":2}}],["concerns",{"0":{"31":1},"2":{"28":1}}],["conventions",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1}}],["convention",{"2":{"11":1}}],["cookie",{"2":{"2":3}}],["mjs",{"2":{"103":8}}],["multicursormodifier",{"2":{"103":2}}],["m",{"2":{"97":4}}],["mdsvex",{"2":{"103":2}}],["md",{"2":{"97":2,"103":6}}],["mkdir",{"2":{"97":4}}],["mvp",{"2":{"107":1}}],["mvc",{"2":{"106":1,"108":1}}],["mv",{"2":{"97":2}}],["moment",{"2":{"104":1}}],["mocha",{"2":{"103":20}}],["monospace",{"2":{"103":2}}],["mono",{"2":{"103":2}}],["mod",{"2":{"103":2}}],["module",{"2":{"103":2}}],["modules",{"2":{"101":12,"102":1,"103":4}}],["mode",{"2":{"103":2}}],["modern",{"2":{"103":2}}],["model=",{"2":{"17":2}}],["model",{"0":{"17":1},"2":{"14":1,"25":1,"36":1,"106":1,"108":1}}],["mozilla",{"2":{"78":1}}],["more",{"2":{"78":1}}],["mount",{"2":{"8":4}}],["mysql",{"2":{"103":1,"117":1}}],["myprocessfunction",{"2":{"72":5}}],["mydependency2",{"2":{"58":4}}],["mydependency1",{"2":{"58":4}}],["myfuncc",{"2":{"72":5}}],["myfuncb",{"2":{"72":5}}],["myfunca",{"2":{"72":9}}],["myfunction",{"2":{"36":6,"50":5,"61":4,"72":1}}],["myfile2",{"2":{"58":2}}],["myfile1",{"2":{"58":2}}],["myclass",{"2":{"50":10}}],["my",{"2":{"13":4,"49":4,"50":8}}],["mymethod",{"2":{"11":1}}],["management",{"0":{"106":1},"2":{"106":2}}],["manually",{"2":{"103":2}}],["mailmap",{"2":{"103":2}}],["maintainers",{"2":{"103":2}}],["maintainability",{"2":{"29":1}}],["main",{"2":{"9":1,"97":9}}],["markdownlint",{"2":{"103":4}}],["markdown",{"0":{"136":1},"2":{"103":2,"136":1}}],["map",{"2":{"101":4,"103":14}}],["mastery",{"2":{"117":1}}],["master",{"2":{"97":5,"103":2}}],["macos",{"2":{"78":4,"103":2}}],["macromedia",{"2":{"6":1}}],["menus",{"2":{"103":2}}],["method2",{"2":{"50":4}}],["method1",{"2":{"50":4}}],["methods",{"2":{"11":1}}],["metadata",{"2":{"103":2}}],["meta",{"2":{"1":2,"100":1,"101":4}}],["message",{"2":{"8":6}}],["mix",{"2":{"103":6}}],["might",{"2":{"103":2}}],["minheight",{"2":{"100":2}}],["minwidth",{"2":{"100":2}}],["middleware",{"2":{"66":1}}],["missing",{"2":{"56":2}}],["mitt",{"2":{"5":1,"61":2,"69":1}}],["microsoft",{"2":{"3":1,"78":1,"98":1,"103":1}}],["зерна",{"2":{"117":1}}],["зря",{"2":{"116":1}}],["зрения",{"2":{"70":1,"106":3,"138":1}}],["здравом",{"2":{"38":1}}],["здесь",{"2":{"5":1,"6":1,"9":1,"10":2,"11":2,"18":1,"19":2,"33":1,"36":5,"49":2,"56":2,"57":2,"58":1,"61":2,"63":8,"65":3,"66":1,"70":1,"106":1}}],["зону",{"2":{"31":1}}],["зона",{"2":{"7":1}}],["змеином",{"2":{"22":1}}],["звучит",{"2":{"9":1}}],["знал",{"2":{"117":1}}],["знатоков",{"2":{"103":1}}],["знать",{"2":{"7":1,"9":1,"11":1,"54":1,"64":1,"102":1,"117":2}}],["знающих",{"2":{"117":1}}],["знают",{"2":{"116":1}}],["знаю",{"2":{"72":1}}],["знаний",{"2":{"117":1}}],["знанию",{"2":{"117":1}}],["знание",{"2":{"28":1,"77":1}}],["знания",{"2":{"6":1,"28":1,"77":1,"117":2}}],["знаем",{"2":{"11":1,"70":1}}],["знает",{"2":{"9":1,"11":2,"64":1}}],["знаете",{"2":{"3":1}}],["знака",{"2":{"22":1,"68":1}}],["знакомимся",{"2":{"91":1}}],["знакомит",{"2":{"86":1,"89":1}}],["знакомстве",{"2":{"73":1}}],["знакомства",{"2":{"45":1}}],["знакомой",{"2":{"36":1}}],["знакомы",{"2":{"34":1,"78":1}}],["знакомым",{"2":{"10":1}}],["знаком",{"2":{"21":1}}],["знак",{"2":{"8":1}}],["значению",{"2":{"11":2}}],["значений",{"2":{"11":1}}],["значением",{"2":{"13":1,"56":1,"65":1,"108":1}}],["значение",{"2":{"7":4,"8":1,"11":7,"13":2,"14":2,"16":1,"17":2,"19":1,"50":1,"65":5,"67":1,"70":1,"71":1,"72":4,"97":1}}],["значения",{"2":{"7":1,"8":1,"11":1,"13":1,"15":1,"17":1,"19":1,"22":1,"70":1,"72":4,"108":1}}],["значении",{"2":{"3":1}}],["значительными",{"2":{"58":1}}],["значительный",{"2":{"7":1,"118":1}}],["значительные",{"2":{"6":1,"66":1}}],["значительную",{"2":{"7":1}}],["значительное",{"2":{"105":1}}],["значительно",{"2":{"7":1,"8":1,"72":1,"103":1,"109":1,"116":1,"118":1}}],["значительной",{"2":{"6":1,"70":1}}],["зазываниях",{"2":{"110":1}}],["зажимает",{"2":{"108":1}}],["занять",{"2":{"107":1}}],["занимающие",{"2":{"105":1}}],["занимаются",{"2":{"107":1}}],["занимают",{"2":{"102":1}}],["занимает",{"2":{"6":1,"64":1}}],["зачастую",{"2":{"107":1}}],["зачем",{"2":{"64":1,"106":1}}],["защитить",{"2":{"92":2}}],["защиты",{"2":{"4":1}}],["заинтересованные",{"2":{"78":1}}],["заимствован",{"2":{"32":1}}],["заложим",{"2":{"73":1}}],["залогинился",{"2":{"2":1,"106":1}}],["займет",{"2":{"71":1}}],["забыл",{"2":{"113":1}}],["забыть",{"2":{"37":1,"56":1,"105":1}}],["заботу",{"2":{"108":1}}],["заботитесь",{"2":{"101":1}}],["заботятся",{"2":{"77":1}}],["забот",{"2":{"60":1}}],["заставим",{"2":{"64":1}}],["заставлять",{"2":{"2":1}}],["заслуживает",{"2":{"56":1}}],["затрагиваемым",{"2":{"139":1}}],["затратами",{"2":{"109":1}}],["затраты",{"2":{"47":1}}],["зато",{"2":{"70":1}}],["затем",{"2":{"2":1,"3":1,"9":2,"31":1,"50":2,"52":1,"58":1,"62":2,"68":1,"72":1,"76":1,"101":1,"118":3}}],["заумной",{"2":{"39":1}}],["завернуть",{"2":{"71":1}}],["завершении",{"2":{"70":1}}],["завершения",{"2":{"70":1}}],["завершает",{"2":{"28":1}}],["зависящие",{"2":{"108":1}}],["зависящих",{"2":{"70":1}}],["зависят",{"2":{"28":1}}],["зависеть",{"2":{"70":1}}],["зависанию",{"2":{"70":1}}],["зависимой",{"2":{"51":1,"58":1}}],["зависимое",{"2":{"7":1}}],["зависимость",{"2":{"53":1,"55":1,"56":3,"57":3,"58":1,"106":1,"110":1,"116":2}}],["зависимостями",{"2":{"53":1,"74":1}}],["зависимостей",{"0":{"51":1,"110":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"7":1,"22":1,"28":1,"51":1,"52":1,"53":1,"55":2,"56":3,"57":2,"59":1,"65":1,"105":1,"108":2}}],["зависимости",{"2":{"2":1,"7":2,"10":1,"11":1,"15":1,"30":1,"41":2,"45":1,"51":1,"52":1,"53":1,"55":2,"56":4,"58":2,"61":1,"63":1,"73":1,"99":1,"118":1}}],["зависит",{"2":{"4":1,"7":1,"8":1,"28":1,"55":1}}],["загуглите",{"2":{"110":1}}],["заглянуть",{"2":{"103":1}}],["заглавными",{"2":{"22":1,"25":1}}],["заголовком",{"2":{"66":1}}],["заголовков",{"2":{"4":1}}],["загромождает",{"2":{"11":1}}],["загружаясь",{"2":{"99":1}}],["загружать",{"2":{"9":1,"19":1}}],["загрузки",{"2":{"97":2,"99":1,"105":1}}],["загрузка",{"2":{"97":1}}],["загрузке",{"2":{"58":1,"97":1,"103":1,"118":1}}],["загрузку",{"2":{"56":1}}],["загрузить",{"2":{"79":1}}],["загрузит",{"2":{"9":2}}],["захостите",{"2":{"117":1}}],["захостить",{"2":{"3":1,"98":1}}],["захотеть",{"2":{"7":1}}],["закэшировать",{"2":{"118":1}}],["заказчик",{"2":{"109":1,"113":1}}],["заканчивая",{"2":{"10":1,"29":1,"31":1}}],["закрытый",{"2":{"97":1}}],["закрепить",{"2":{"27":1,"73":1}}],["закодированные",{"2":{"58":1}}],["законченный",{"2":{"117":1}}],["закончите",{"2":{"76":1}}],["закон",{"2":{"7":1}}],["заключает",{"2":{"40":1}}],["заключается",{"2":{"7":4,"11":1,"19":1,"36":1,"37":1,"39":1,"53":1,"58":2,"62":1,"66":1,"72":1}}],["заключенного",{"2":{"9":1}}],["заранее",{"2":{"118":1}}],["зарегистрируйте",{"2":{"117":1}}],["зарегистрированное",{"2":{"57":1}}],["зарегистрироваться",{"2":{"117":1}}],["зарегистрировать",{"2":{"57":1,"61":1}}],["зарезервированное",{"2":{"11":1}}],["зарекомендовавшие",{"2":{"6":1}}],["зародились",{"2":{"6":1}}],["задаваемые",{"2":{"139":1}}],["задает",{"2":{"105":1}}],["заданного",{"2":{"70":1}}],["заданном",{"2":{"9":1}}],["заданному",{"2":{"3":1}}],["задание",{"2":{"65":1}}],["задания",{"2":{"55":1}}],["задачей",{"2":{"108":1}}],["задача",{"2":{"69":1,"103":1}}],["задачи",{"2":{"33":1,"40":1,"68":1}}],["задач",{"2":{"31":1,"40":1,"62":1,"63":1}}],["задать",{"2":{"2":1,"108":2}}],["задействовать",{"0":{"3":1},"2":{"118":1}}],["за",{"2":{"2":1,"5":1,"6":1,"7":1,"11":1,"15":1,"19":3,"25":1,"33":1,"36":3,"37":1,"38":1,"39":1,"55":1,"56":1,"60":1,"61":1,"65":1,"69":2,"70":1,"80":2,"85":1,"103":1,"105":2,"106":4,"108":6,"117":1}}],["замечаем",{"2":{"65":1}}],["замечательным",{"2":{"8":1}}],["заметки",{"2":{"118":1}}],["заметьте",{"2":{"57":1,"71":1}}],["заметили",{"2":{"56":1}}],["заметить",{"2":{"11":1,"66":1,"72":1}}],["замену",{"2":{"105":2,"108":1,"111":1}}],["замена",{"2":{"72":1,"105":1}}],["заменив",{"2":{"71":1}}],["заменится",{"2":{"19":1}}],["замените",{"2":{"18":1}}],["заменить",{"2":{"1":1,"109":1,"116":2}}],["замены",{"2":{"32":1,"105":1}}],["заменяются",{"2":{"21":1}}],["заменено",{"2":{"8":1}}],["заморозить",{"2":{"71":1}}],["заморожено",{"2":{"70":1}}],["заморочки",{"2":{"2":1}}],["заморачиваться",{"2":{"3":1}}],["запущен",{"2":{"107":1}}],["запутывающее",{"2":{"106":1}}],["запуск",{"2":{"129":1}}],["запуске",{"2":{"118":2}}],["запускалось",{"2":{"118":1}}],["запуска",{"2":{"78":1}}],["запускаются",{"2":{"11":1,"103":1}}],["запускается",{"2":{"102":1}}],["запускает",{"2":{"9":1}}],["запустим",{"2":{"9":1}}],["запустить",{"2":{"3":2,"103":1}}],["запланированы",{"2":{"62":1}}],["заполнено",{"2":{"106":1}}],["заполнить",{"2":{"57":1}}],["запомнить",{"2":{"64":1}}],["запомните",{"2":{"10":1}}],["запасного",{"2":{"19":1}}],["записываются",{"2":{"23":1}}],["записанный",{"2":{"2":1}}],["записи",{"2":{"2":1,"11":1}}],["запрошенное",{"2":{"65":1}}],["запрошен",{"2":{"4":1}}],["запросом",{"2":{"118":1}}],["запросов",{"2":{"1":1,"4":1,"5":2}}],["запросы",{"2":{"5":1,"49":1,"103":1,"118":2}}],["запрос",{"2":{"4":3}}],["запросе",{"2":{"2":2}}],["запросами",{"2":{"45":1}}],["запросам",{"2":{"4":1}}],["запроса",{"2":{"1":1,"4":4,"118":1}}],["запрашивает",{"2":{"4":1}}],["запрашиваемого",{"2":{"4":1}}],["запрашиваемому",{"2":{"2":1}}],["запрашивать",{"2":{"3":1}}],["запрашивающий",{"2":{"2":1}}],["запрещены",{"2":{"2":1}}],["nls",{"2":{"103":4}}],["nx",{"2":{"103":4}}],["nvmrc",{"2":{"103":4}}],["nix",{"2":{"103":6}}],["nativetabs",{"2":{"103":2}}],["named",{"2":{"101":2}}],["name=",{"2":{"99":2}}],["name",{"2":{"11":3,"17":3,"57":8,"61":26,"97":24,"99":4,"100":8,"101":16}}],["npx",{"2":{"102":4}}],["npm",{"2":{"102":1,"103":8,"105":1,"110":1}}],["npmjs",{"2":{"61":1}}],["n",{"2":{"60":1,"70":8,"71":17,"72":10,"97":2,"103":2}}],["null",{"2":{"56":2,"57":3,"103":2}}],["nuxt",{"2":{"7":1,"103":4}}],["nest",{"2":{"103":4}}],["nesting",{"2":{"103":4}}],["never",{"2":{"103":2}}],["netlify",{"2":{"98":1,"103":4}}],["network",{"2":{"3":1}}],["newitem",{"2":{"108":6}}],["new",{"2":{"50":2,"56":2,"59":4,"65":2,"72":11,"97":4,"101":4}}],["next",{"0":{"39":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"28":1,"103":4}}],["nginx",{"2":{"3":1,"78":1,"98":1}}],["nodе",{"2":{"103":1}}],["nodemon",{"2":{"103":8}}],["node",{"2":{"3":2,"78":1,"97":4,"102":5,"103":11,"117":1,"118":1}}],["not",{"2":{"103":2,"105":2}}],["notation",{"2":{"49":1}}],["notificationinterceptor",{"2":{"1":4}}],["nosql",{"2":{"3":1,"106":1}}],["bit",{"2":{"106":1}}],["bind",{"0":{"13":1},"2":{"13":1}}],["bzl",{"2":{"103":2}}],["bbl",{"2":{"103":2}}],["blg",{"2":{"103":2}}],["bloc",{"2":{"103":2}}],["blame",{"2":{"103":6}}],["bound",{"2":{"106":2}}],["boundary",{"2":{"103":2}}],["bower",{"2":{"103":6}}],["body",{"2":{"8":6}}],["by",{"2":{"97":2}}],["be",{"2":{"97":4,"103":2}}],["better",{"2":{"78":1}}],["best",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"79":1,"117":1}}],["before",{"2":{"71":8,"72":4}}],["b=result",{"2":{"72":2}}],["bracketpairs",{"2":{"103":2}}],["branch",{"2":{"97":2}}],["branches",{"2":{"97":4}}],["break",{"2":{"63":6,"65":2}}],["browserslist",{"2":{"103":4}}],["browser",{"2":{"2":1,"78":1,"103":2}}],["builddata",{"2":{"97":8}}],["build",{"2":{"97":19,"102":2,"103":8}}],["built",{"2":{"18":1,"19":2}}],["button",{"2":{"18":8,"19":4,"116":1}}],["bundleconfig",{"2":{"103":4}}],["bundle",{"2":{"9":1,"102":6}}],["bundler",{"2":{"9":1}}],["business",{"2":{"106":2}}],["bus",{"2":{"5":1}}],["b",{"2":{"7":4,"72":7,"105":4}}],["babel",{"2":{"103":20}}],["babelrc",{"2":{"103":20}}],["bazelproject",{"2":{"103":2}}],["bazelignore",{"2":{"103":2}}],["bazelrc",{"2":{"103":2}}],["bazel",{"2":{"103":6}}],["baseinput",{"2":{"111":1}}],["baseicon",{"0":{"100":1},"2":{"99":3,"102":4}}],["basebutton",{"2":{"109":1,"111":1,"116":3}}],["base",{"2":{"100":2}}],["base64",{"2":{"99":1}}],["based",{"2":{"2":3}}],["banner",{"2":{"99":1}}],["backers",{"2":{"103":2}}],["backend",{"2":{"3":1}}],["backups",{"2":{"97":2}}],["backup",{"2":{"97":15}}],["baas",{"2":{"3":5}}],["эстетики",{"2":{"138":1}}],["эволюция",{"2":{"116":1}}],["эван",{"2":{"108":1}}],["эмпирическое",{"2":{"47":1}}],["элегантно",{"2":{"39":1}}],["элементом",{"2":{"17":1}}],["элементов",{"2":{"2":1,"6":1,"15":2,"16":2,"19":5,"31":1,"37":1,"61":1,"105":4,"107":1}}],["элементу",{"2":{"17":1}}],["элементарное",{"2":{"117":1}}],["элементарно",{"2":{"99":1}}],["элементами",{"2":{"15":1,"18":1,"43":1}}],["элемента",{"2":{"10":1,"12":2,"16":2,"31":1,"108":1,"118":1}}],["элемент",{"2":{"8":4,"14":2,"15":4,"19":1,"67":1,"138":1}}],["элементы",{"2":{"6":1,"10":1,"19":1,"31":1,"93":1,"95":1,"108":1,"114":1,"118":1}}],["эффективней",{"2":{"105":1,"108":2,"118":1}}],["эффективные",{"2":{"48":1}}],["эффективным",{"2":{"38":1}}],["эффективности",{"2":{"105":1}}],["эффективно",{"2":{"28":1,"109":1}}],["эффективного",{"2":{"16":1}}],["эффектов",{"2":{"37":1}}],["эндрю",{"2":{"37":1}}],["эндпойнту",{"2":{"3":2}}],["эндпойнтам",{"2":{"3":1}}],["эндпойнтов",{"2":{"3":1}}],["экосистеме",{"2":{"103":1}}],["экономичным",{"2":{"3":1}}],["эквивалентности",{"2":{"72":1}}],["эквивалентна",{"2":{"14":1}}],["экстраполированного",{"2":{"68":1}}],["экспериментировал",{"2":{"108":1}}],["экспериментальной",{"2":{"19":1}}],["экспортируем",{"2":{"50":1}}],["экспортируете",{"2":{"106":1}}],["экспортирует",{"2":{"10":1,"51":1}}],["экспортирующий",{"2":{"49":1}}],["экспорт",{"2":{"11":1}}],["экран",{"2":{"33":1,"118":1}}],["экране",{"2":{"19":1}}],["экземпляров",{"2":{"106":1}}],["экземпляром",{"2":{"56":1}}],["экземпляры",{"0":{"25":1},"2":{"19":1,"25":1}}],["экземпляру",{"2":{"11":1}}],["экземпляр",{"2":{"8":1,"46":1,"50":2}}],["эти",{"2":{"9":2,"10":1,"11":2,"15":1,"16":1,"25":1,"26":1,"27":1,"60":1,"68":1,"71":1,"73":2,"106":2}}],["этими",{"2":{"64":1}}],["этим",{"2":{"7":1,"10":1,"37":1,"67":1}}],["этих",{"2":{"4":1,"6":1,"7":4,"17":1,"28":2,"29":1,"31":1,"39":1,"60":1,"61":1,"69":1,"71":1,"107":1,"117":1,"118":1}}],["этапе",{"2":{"28":1,"109":1}}],["эта",{"0":{"77":1,"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"7":1,"11":1,"14":1,"17":1,"18":1,"28":1,"33":1,"34":1,"36":1,"63":1,"64":1,"65":1,"70":1,"73":1,"76":1,"77":1,"78":1,"86":1,"89":1,"90":1,"93":1,"103":1}}],["эту",{"2":{"5":1,"11":1,"37":2,"60":1,"66":1,"71":1,"99":1,"107":1,"117":1}}],["этого",{"2":{"9":1,"10":3,"11":1,"12":1,"15":1,"31":1,"33":2,"36":2,"37":1,"39":1,"48":2,"49":1,"57":1,"60":1,"61":1,"62":1,"63":1,"64":1,"66":2,"67":1,"69":1,"70":1,"98":1,"102":1,"105":1,"106":1,"108":1,"109":1,"117":2,"118":2}}],["этому",{"2":{"34":1,"36":1,"45":1,"51":1,"117":1}}],["этом",{"2":{"7":2,"8":2,"9":1,"11":2,"17":1,"19":1,"34":1,"36":1,"39":1,"54":2,"60":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":2,"70":1,"72":2,"94":1,"98":1,"99":1,"102":1,"106":2,"107":2,"108":3,"117":1}}],["этой",{"0":{"78":1},"2":{"2":1,"6":4,"7":1,"11":3,"18":2,"19":1,"20":2,"26":1,"27":1,"28":1,"31":3,"33":1,"34":1,"40":1,"41":1,"57":1,"59":1,"61":3,"65":3,"66":2,"71":1,"73":1,"78":3,"79":1,"80":3,"83":1,"84":1,"85":2,"88":1,"91":1,"92":1,"97":1,"104":1,"105":1,"106":1,"116":1}}],["этот",{"2":{"2":1,"7":2,"8":2,"9":1,"11":3,"14":1,"31":2,"32":2,"33":2,"34":2,"36":1,"37":1,"38":2,"39":2,"45":1,"46":1,"47":1,"49":2,"50":3,"51":1,"52":1,"55":1,"56":1,"58":2,"59":1,"60":1,"62":2,"63":1,"64":2,"66":1,"69":3,"72":3,"97":1,"103":1,"109":2,"117":2}}],["это",{"0":{"38":1},"2":{"2":3,"3":3,"4":3,"6":1,"7":9,"8":4,"9":1,"10":7,"11":16,"15":1,"16":1,"17":1,"18":1,"19":4,"25":2,"28":4,"29":2,"31":1,"32":2,"33":3,"34":2,"36":2,"37":3,"40":3,"46":1,"49":1,"50":1,"51":1,"53":3,"54":1,"55":3,"56":6,"57":1,"58":4,"60":2,"61":2,"62":1,"63":1,"64":5,"65":6,"66":6,"67":1,"69":2,"70":6,"71":4,"72":7,"73":2,"76":2,"87":1,"95":1,"98":1,"99":2,"102":1,"106":8,"107":1,"108":10,"109":6,"110":2,"111":1,"112":1,"113":1,"115":1,"116":1,"117":4,"118":4}}],["other",{"2":{"106":1}}],["ok",{"2":{"105":4}}],["out",{"2":{"103":4}}],["output",{"2":{"103":2}}],["our",{"2":{"10":2}}],["openclose",{"2":{"103":2}}],["open",{"2":{"69":1}}],["option",{"2":{"22":1}}],["options",{"0":{"11":1},"2":{"11":6,"97":2,"103":2,"105":1}}],["observerclass",{"2":{"61":5}}],["observerpattern",{"2":{"61":2}}],["observer",{"0":{"60":1,"61":1},"1":{"61":1},"2":{"28":1,"43":1,"65":2,"69":1,"105":1}}],["object",{"2":{"14":1,"36":1,"49":1,"101":2}}],["overrides",{"2":{"103":2}}],["over",{"0":{"32":1},"2":{"28":1}}],["official",{"2":{"78":1}}],["off",{"2":{"61":6,"103":2,"106":1}}],["of",{"0":{"31":1},"2":{"28":1,"78":3,"99":2,"103":2,"118":1}}],["oreilly",{"2":{"117":1}}],["or",{"2":{"78":6}}],["organizeimports",{"2":{"103":2}}],["org",{"2":{"18":1,"19":2,"38":1}}],["origin",{"2":{"4":11}}],["oracle",{"2":{"3":1,"98":1}}],["one",{"2":{"118":1}}],["ontaskerrors",{"2":{"103":2}}],["onlyenabledextensions",{"2":{"103":2}}],["only",{"2":{"103":4}}],["onbeforeunmount",{"2":{"36":5}}],["onmounted",{"2":{"36":5}}],["on",{"0":{"18":1},"2":{"2":1,"18":3,"61":5,"97":10,"103":4}}],["oauth",{"2":{"2":2}}],["dx",{"2":{"116":1,"138":1}}],["dprint",{"2":{"103":8}}],["dlint",{"2":{"103":8}}],["day",{"2":{"104":2}}],["dangerfile",{"2":{"103":4}}],["dart",{"2":{"103":12}}],["dark",{"2":{"103":2}}],["date=`date",{"2":{"97":2}}],["date",{"2":{"97":14,"103":2}}],["datanpx",{"2":{"102":1}}],["data",{"2":{"8":3,"11":7,"61":6,"63":7,"97":4,"102":1}}],["dynamic",{"2":{"99":2}}],["dt",{"2":{"97":2}}],["d",{"2":{"97":2,"103":32}}],["dbmanager",{"2":{"51":1,"52":6,"53":5,"54":4,"55":8,"56":20,"58":12}}],["dropdown",{"2":{"116":1}}],["draw",{"2":{"59":5}}],["dry",{"0":{"37":1},"2":{"28":1}}],["drive",{"2":{"2":3}}],["docs",{"2":{"97":2,"98":1}}],["dockerignore",{"2":{"103":2}}],["dockerfile",{"2":{"103":4}}],["docker",{"0":{"96":1},"2":{"103":3}}],["document",{"2":{"14":1,"36":1,"117":1}}],["don",{"0":{"37":1},"2":{"28":1}}],["dosubscribe",{"2":{"24":1}}],["dom",{"2":{"14":1,"15":2,"17":1,"36":1}}],["dialyzer",{"2":{"103":2}}],["dialogstyle",{"2":{"103":2}}],["diffeditor",{"2":{"103":2}}],["diffdecorationsgutterwidth",{"2":{"103":2}}],["dirname",{"2":{"102":2}}],["dirs",{"2":{"97":2}}],["dir=`echo",{"2":{"97":4}}],["dir=your",{"2":{"97":2}}],["dir=dev",{"2":{"97":2}}],["dir=",{"2":{"97":4}}],["dir",{"2":{"97":48}}],["directives",{"2":{"18":1}}],["dist",{"2":{"97":4,"99":1,"103":2}}],["dispatch",{"2":{"97":3}}],["dispatcher",{"2":{"61":9}}],["displaylanguage",{"2":{"103":2}}],["display",{"2":{"14":1}}],["div",{"2":{"8":6,"11":4,"14":5,"68":4,"100":2}}],["details",{"2":{"114":1}}],["debounce",{"2":{"110":1}}],["debuganyway",{"2":{"103":2}}],["debug",{"2":{"103":2}}],["deno",{"2":{"103":4}}],["deep",{"2":{"100":2}}],["description",{"2":{"97":2}}],["designer",{"2":{"103":4}}],["design",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"79":1,"117":1}}],["deprecated",{"2":{"106":1}}],["deploy",{"2":{"97":27}}],["dependencies",{"2":{"57":6,"97":4}}],["dependency2",{"2":{"58":2}}],["dependency1",{"2":{"58":2}}],["dependencyservice",{"2":{"57":4,"58":10}}],["dependency",{"0":{"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"28":1,"42":1,"56":2,"57":4,"58":4}}],["delivery",{"2":{"95":1}}],["dexiedb",{"2":{"69":1}}],["defineconfig",{"2":{"102":2}}],["defineprops",{"2":{"67":2,"68":2,"100":2}}],["defaultformatter",{"2":{"103":8}}],["default",{"2":{"1":2,"11":4,"49":2,"50":2,"52":2,"53":2,"54":2,"57":2,"97":4,"100":12,"102":2,"103":4}}],["degrees",{"2":{"65":9}}],["decorator",{"0":{"66":1,"67":1,"68":1},"1":{"67":1,"68":1},"2":{"28":1,"44":1,"68":2,"72":1}}],["developer",{"2":{"138":1}}],["devdependencies",{"2":{"102":2,"103":1}}],["dev",{"2":{"4":1,"97":15,"98":2,"102":1,"118":1}}],["devtools",{"2":{"3":1,"106":2}}],["guide",{"2":{"117":2}}],["guides",{"2":{"103":2}}],["gui",{"2":{"108":1}}],["gulp",{"2":{"103":4}}],["generation",{"2":{"118":1}}],["gemfile",{"2":{"103":4}}],["getsvgicon",{"2":{"100":6,"101":4}}],["gets",{"2":{"99":4}}],["getimageurl",{"2":{"100":4,"101":4}}],["getitem",{"2":{"97":2}}],["getinstance",{"2":{"48":1}}],["gettimestamp",{"2":{"66":3}}],["getter",{"2":{"65":1}}],["gettoken",{"2":{"1":2}}],["getall",{"2":{"52":2,"53":2,"54":2}}],["getallprojects",{"2":{"52":2,"53":2,"54":2,"55":2}}],["get",{"2":{"1":2,"4":1,"65":3,"101":4}}],["getuserdata",{"2":{"1":4}}],["gql",{"2":{"103":4}}],["gz",{"2":{"103":2}}],["gls",{"2":{"103":2}}],["glo",{"2":{"103":2}}],["global",{"2":{"106":1}}],["glob",{"2":{"100":1,"101":4}}],["glg",{"2":{"103":2}}],["governance",{"2":{"103":2}}],["go",{"2":{"103":12}}],["google",{"2":{"2":8,"3":2,"98":1,"117":1,"118":3}}],["g",{"2":{"103":2}}],["grid",{"2":{"114":1,"134":2}}],["grunt",{"2":{"103":4}}],["great",{"2":{"103":2}}],["graphgl",{"2":{"5":1}}],["gh",{"2":{"97":3}}],["ghz",{"2":{"78":1}}],["gitpod",{"2":{"103":4}}],["gitmessage",{"2":{"103":2}}],["gitmodules",{"2":{"103":2}}],["gitattributes",{"2":{"103":2}}],["gitlens",{"2":{"103":8}}],["gitlab",{"2":{"95":1,"103":4}}],["gitignore",{"2":{"97":2,"103":2}}],["git",{"2":{"91":1,"95":1,"97":4,"103":20}}],["githubpullrequests",{"2":{"103":2}}],["githubissues",{"2":{"103":2}}],["github",{"0":{"97":1},"2":{"79":2,"95":2,"97":27,"98":3,"103":12,"117":2,"123":1,"137":1}}],["gb",{"2":{"78":2}}],["gatsby",{"2":{"103":10}}],["gateway",{"2":{"3":1}}],["garaguso",{"2":{"75":1}}],["gt",{"2":{"8":24,"10":16,"11":16,"13":2,"14":4,"16":4,"17":2,"18":8,"19":16,"36":8,"61":4,"67":16,"68":16,"70":2,"71":2,"72":32,"97":27,"99":8,"100":20,"103":3,"116":8,"118":2}}],["gmail",{"2":{"2":1}}],["x",{"2":{"105":4}}],["xshell",{"2":{"103":1}}],["xss",{"2":{"2":1}}],["xo",{"2":{"103":8}}],["xaml",{"2":{"103":4}}],["xdv",{"2":{"103":2}}],["xmlhttprequest",{"2":{"118":1}}],["xml",{"2":{"69":1,"103":8}}],["xhr",{"2":{"1":1}}],["живом",{"2":{"92":1}}],["живущий",{"2":{"2":1}}],["жизнь",{"2":{"97":1,"108":1}}],["жизненно",{"2":{"39":1}}],["жизненного",{"2":{"11":1,"36":2,"56":1}}],["жизненный",{"2":{"36":1}}],["жизни",{"2":{"2":4}}],["жить",{"2":{"7":1}}],["железу",{"2":{"118":1}}],["железо",{"2":{"118":1}}],["желательно",{"2":{"117":1}}],["желаю",{"2":{"80":1}}],["жесткие",{"2":{"102":1}}],["жестко",{"2":{"58":1,"108":1}}],["жесткое",{"2":{"53":1}}],["же",{"2":{"2":2,"7":4,"9":1,"11":3,"15":1,"17":1,"29":1,"31":2,"33":1,"37":2,"39":2,"49":1,"50":1,"52":1,"53":1,"55":1,"56":2,"59":1,"61":3,"64":5,"65":2,"66":4,"67":1,"68":1,"69":1,"71":1,"72":1,"97":1,"98":1,"103":1,"105":1,"106":3,"107":2,"108":1,"109":1,"111":1,"117":1,"118":1}}],["флексбокса",{"2":{"113":1}}],["флагманом",{"2":{"108":1}}],["фоне",{"2":{"108":1}}],["фон",{"2":{"101":1}}],["форсирует",{"2":{"97":1}}],["формочки",{"2":{"118":1}}],["формы",{"2":{"106":1}}],["формальный",{"2":{"11":1}}],["форматировании",{"2":{"118":1}}],["форматирование",{"2":{"103":1}}],["форматирует",{"2":{"103":1}}],["форматируете",{"2":{"36":1}}],["формат",{"2":{"11":1,"72":1,"101":1}}],["формата",{"2":{"5":1,"118":1}}],["формате",{"2":{"3":1,"11":1,"101":1,"118":1}}],["формируя",{"2":{"9":1}}],["формирует",{"2":{"3":1,"118":1}}],["формирование",{"2":{"1":1}}],["формулу",{"2":{"7":1,"70":2}}],["форму",{"2":{"2":1,"137":1}}],["факт",{"2":{"106":1}}],["фактического",{"2":{"97":1,"118":1}}],["факторов",{"2":{"70":1}}],["фактором",{"2":{"64":1}}],["фактор",{"2":{"66":1,"108":1}}],["фаренгейта",{"2":{"64":1,"65":2}}],["фабрики",{"2":{"59":2}}],["фабрика",{"0":{"59":1}}],["фасадов",{"2":{"69":1}}],["фасадный",{"2":{"69":1}}],["фасада",{"2":{"68":1,"69":1}}],["фасад",{"0":{"69":1},"2":{"28":1,"65":1,"69":1}}],["файлу",{"2":{"36":1}}],["файле",{"2":{"10":1}}],["файлы",{"0":{"79":1},"2":{"9":1,"79":1,"97":1,"99":1,"102":1,"118":1}}],["файл",{"2":{"9":3,"10":3,"51":1,"53":1,"97":4,"100":1,"103":1,"118":2}}],["файлов",{"0":{"24":1},"2":{"9":1,"97":1,"98":1,"100":1,"102":1}}],["файлах",{"2":{"103":1}}],["файла",{"2":{"4":1,"52":1,"97":3,"118":1}}],["фиксит",{"2":{"109":1}}],["фиксации",{"2":{"25":1}}],["финальном",{"2":{"109":1}}],["фибоначчи",{"0":{"71":1},"2":{"70":1,"72":1}}],["фильтрации",{"2":{"65":1}}],["фигуру",{"2":{"59":1}}],["фигурные",{"2":{"8":1}}],["футером",{"2":{"109":1}}],["фундаментальное",{"2":{"108":1}}],["фундаментальной",{"2":{"7":1}}],["фундаментальный",{"2":{"71":1}}],["фундаментальную",{"2":{"28":1}}],["функционал",{"2":{"109":1,"115":1}}],["функционала",{"2":{"105":2,"116":1}}],["функциональной",{"2":{"106":1}}],["функциональном",{"2":{"33":1}}],["функциональностью",{"2":{"11":1,"33":2,"66":1}}],["функциональность",{"2":{"7":1,"11":1,"12":1,"32":2,"37":1,"60":3,"66":2,"67":1}}],["функциональности",{"2":{"7":3,"25":1,"32":1,"64":1,"66":3}}],["функциональным",{"2":{"32":1,"66":1}}],["функциональные",{"2":{"31":1,"38":1}}],["функциональную",{"2":{"31":1}}],["функциях",{"2":{"72":1,"108":1}}],["функциями",{"2":{"106":1}}],["функциям",{"2":{"31":1}}],["функция",{"2":{"11":1,"18":1,"33":1,"36":1,"57":2,"59":1,"65":1,"66":1,"70":3,"71":1,"105":1,"106":1,"109":1,"110":1}}],["функцией",{"2":{"11":1,"18":1,"31":1,"66":1,"71":1}}],["функцию",{"2":{"8":1,"18":1,"33":2,"36":3,"50":1,"55":1,"56":2,"59":1,"60":1,"61":3,"62":1,"65":1,"71":3,"72":3,"100":1,"106":1,"110":1}}],["функций",{"2":{"7":2,"11":1,"36":2,"40":1,"46":1,"54":1,"58":1,"60":1,"66":1,"67":1,"69":1,"72":1,"74":1,"106":3}}],["функции",{"0":{"24":1},"2":{"3":2,"7":1,"8":1,"11":6,"22":1,"25":1,"31":1,"33":2,"36":2,"41":1,"51":1,"53":1,"55":1,"57":1,"58":1,"61":1,"65":3,"70":5,"71":3,"72":9,"106":6,"108":1}}],["фулстек",{"2":{"5":1,"103":1}}],["фулстеков",{"2":{"5":1}}],["фрагменте",{"2":{"40":1}}],["фрагмент",{"2":{"36":1}}],["фрагментом",{"2":{"29":1}}],["фрагмента",{"2":{"8":1,"71":1}}],["фреймворку",{"2":{"15":1}}],["фреймворке",{"2":{"7":1,"105":1,"108":1}}],["фреймворком",{"2":{"6":1,"10":1,"12":1,"25":1,"27":2,"105":1}}],["фреймворков",{"2":{"6":1,"7":2,"26":1,"76":1,"108":1}}],["фреймворки",{"2":{"6":1,"7":2,"9":1,"19":1,"108":2}}],["фреймворк",{"0":{"6":1,"7":1,"83":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1},"2":{"6":1,"7":6,"8":1,"9":1,"18":2,"19":1,"28":1,"34":1,"76":1,"83":1,"89":2,"106":1}}],["фреймворках",{"0":{"108":1},"2":{"124":1}}],["фреймворка",{"2":{"4":1,"6":1,"7":3,"8":1,"36":1,"60":1,"76":2,"77":1,"83":1,"105":2}}],["фронтенда",{"2":{"106":3}}],["фронтенде",{"2":{"106":2,"107":1,"108":2,"109":1,"117":1}}],["фронтендеру",{"2":{"95":1}}],["фронтендера",{"0":{"3":1}}],["фронтендом",{"2":{"4":1}}],["фронтенд",{"0":{"108":1},"2":{"3":1,"98":1,"103":1,"107":1,"108":1,"109":1,"118":1,"121":1,"124":2}}],["фронте",{"2":{"2":3,"5":2,"107":2,"108":1,"109":2,"117":1}}],["фронту",{"2":{"2":1,"3":1}}],["фронт",{"2":{"2":3,"3":2,"103":1}}],["фронта",{"2":{"2":1,"3":1,"108":1}}],["фронтэнде",{"2":{"108":1}}],["фронтэндер",{"2":{"3":1}}],["фронтэнд",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"2":1,"3":1,"5":1,"139":1}}],["ей",{"2":{"40":1,"116":1}}],["единственное",{"2":{"72":1}}],["единственным",{"2":{"53":1}}],["единственный",{"2":{"11":2}}],["единиц",{"2":{"69":1}}],["единую",{"2":{"50":1,"62":1}}],["единый",{"2":{"37":1,"116":1}}],["единой",{"0":{"33":1},"2":{"33":1}}],["единое",{"2":{"9":1,"34":1}}],["единая",{"2":{"28":1,"31":1,"60":1}}],["еще",{"0":{"81":1},"2":{"7":1,"9":1,"18":1,"19":1,"26":1,"31":2,"36":1,"38":1,"39":1,"58":1,"68":1,"103":4,"105":1,"108":1,"117":1,"118":2}}],["ее",{"2":{"7":1,"8":1,"10":2,"11":2,"13":1,"31":1,"36":2,"38":1,"53":1,"55":1,"56":2,"61":1,"70":1,"109":1}}],["еvent",{"2":{"5":1}}],["ему",{"2":{"2":1,"61":1,"72":1,"95":1,"106":1,"118":1}}],["естественно",{"2":{"33":1,"97":1,"106":1}}],["есть",{"2":{"2":3,"3":4,"6":1,"7":4,"10":2,"11":3,"19":1,"27":1,"32":2,"36":1,"38":1,"61":1,"62":1,"64":2,"66":3,"68":1,"71":1,"72":4,"97":3,"101":1,"103":1,"104":2,"106":3,"108":3,"109":2,"110":1,"116":1,"117":6,"118":3}}],["если",{"2":{"2":5,"3":2,"4":5,"6":1,"7":1,"9":1,"10":4,"11":2,"13":2,"15":2,"16":1,"19":1,"25":1,"27":2,"31":2,"33":1,"36":3,"37":2,"39":2,"46":1,"49":2,"50":1,"53":1,"55":2,"56":2,"57":1,"61":2,"62":1,"63":1,"64":1,"65":1,"66":1,"70":1,"78":1,"97":1,"98":1,"99":2,"101":1,"102":3,"103":1,"105":1,"106":5,"110":2,"111":1,"113":1,"116":1,"117":4,"118":2}}],["её",{"2":{"2":2,"99":1,"108":2,"110":2}}],["его",{"0":{"47":1},"2":{"2":9,"3":2,"4":1,"7":2,"8":2,"10":1,"11":5,"14":2,"18":1,"19":1,"20":1,"33":1,"36":1,"37":4,"39":1,"50":1,"54":1,"57":1,"58":2,"61":2,"62":1,"64":4,"65":1,"66":4,"67":1,"69":3,"71":2,"72":1,"92":2,"97":1,"102":1,"103":2,"106":1,"108":1,"109":3,"115":1,"116":1,"117":1,"118":7,"138":2}}],["jest",{"2":{"103":20,"107":1}}],["jenkins",{"2":{"95":1,"103":4}}],["j",{"2":{"102":1}}],["jpg",{"2":{"101":1}}],["jpeg",{"2":{"98":1}}],["jasmine",{"2":{"103":20}}],["jamesives",{"2":{"97":4}}],["javascirpt",{"2":{"77":1}}],["javascript",{"0":{"132":1},"2":{"3":1,"6":3,"7":2,"8":3,"9":4,"10":6,"11":4,"13":1,"15":1,"16":1,"17":2,"18":2,"25":1,"32":3,"33":1,"34":1,"36":2,"37":1,"46":1,"48":3,"49":2,"57":1,"60":1,"64":1,"66":1,"69":1,"70":2,"72":1,"73":1,"78":2,"84":1,"91":1,"99":1,"102":2,"103":4,"104":1,"105":2,"106":2,"108":1,"109":1,"116":3,"117":6,"118":4,"132":1}}],["java",{"2":{"6":1,"11":1,"48":1,"103":2}}],["jobs",{"2":{"97":4}}],["jwt",{"2":{"2":4,"138":2}}],["jslint",{"2":{"103":4}}],["jslet",{"2":{"65":1,"72":3}}],["jsx",{"2":{"103":6}}],["jsasync",{"2":{"72":1}}],["jsmyfunction",{"2":{"72":1}}],["jsfibonaccisync",{"2":{"71":1}}],["jsf",{"2":{"70":1}}],["jsfunction",{"2":{"59":1,"71":2,"72":1}}],["jsdispatcher",{"2":{"61":1}}],["jsconfig",{"2":{"103":22}}],["jsconsole",{"2":{"66":1,"71":2,"72":1}}],["jsconst",{"2":{"49":1,"53":1,"54":1,"57":1,"97":1,"101":1,"105":1}}],["jsclass",{"2":{"50":1,"56":1,"61":1,"63":1}}],["json5",{"2":{"103":2}}],["jsonc",{"2":{"103":2}}],["jsonplaceholder",{"2":{"3":1}}],["json",{"2":{"1":1,"3":1,"5":8,"49":1,"50":2,"55":1,"97":7,"99":1,"101":7,"102":5,"103":96,"117":1,"118":2}}],["jsimport",{"2":{"1":3,"50":1,"52":1,"55":1,"56":1,"58":2,"61":2,"99":1,"102":1}}],["js",{"0":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"61":1,"63":1,"65":1,"71":1,"75":1,"101":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"1":4,"3":3,"9":2,"11":1,"51":1,"53":1,"55":4,"56":9,"61":4,"78":1,"79":1,"98":1,"99":4,"101":1,"102":5,"103":39,"104":2,"106":1,"108":3,"109":1,"117":3,"118":1}}],["русском",{"2":{"117":2}}],["рутинного",{"2":{"108":1}}],["рука",{"2":{"103":1}}],["руководство",{"2":{"94":1}}],["руководству",{"2":{"7":1}}],["руководящие",{"2":{"28":1}}],["рублей",{"2":{"98":1}}],["ручном",{"2":{"97":1,"103":1}}],["рисуйте",{"2":{"115":1}}],["рисунка",{"2":{"60":1}}],["рисунок",{"2":{"9":1,"31":1,"33":1,"60":2,"62":1,"64":1,"66":1,"69":1}}],["рисует",{"2":{"59":1}}],["риски",{"2":{"36":1}}],["рядом",{"2":{"36":1,"72":1}}],["ряд",{"2":{"11":2}}],["ряда",{"2":{"9":1,"66":1,"70":1}}],["родился",{"2":{"118":1}}],["родительский",{"2":{"33":1,"57":1}}],["родительскому",{"2":{"11":1}}],["родительского",{"2":{"10":1,"11":1}}],["рода",{"2":{"65":1}}],["роста",{"2":{"11":1,"112":1}}],["роли",{"2":{"108":1}}],["роль",{"2":{"106":1,"108":1,"117":1}}],["ролью",{"2":{"2":1}}],["ролям",{"2":{"2":1}}],["рывка",{"2":{"7":1}}],["рефакторинг",{"0":{"112":1},"2":{"112":1}}],["рефакторите",{"2":{"39":1}}],["регулярный",{"0":{"112":1}}],["регистрировать",{"2":{"66":1}}],["регистрируя",{"2":{"60":1}}],["регистрирует",{"2":{"108":1}}],["регистрируется",{"2":{"61":1}}],["регистрируете",{"2":{"36":1}}],["регистрируем",{"2":{"36":1}}],["регистрацию",{"2":{"36":1}}],["регистрации",{"2":{"33":4,"36":1,"56":2,"58":1,"60":1,"61":1}}],["регистра",{"2":{"23":1}}],["регистре",{"2":{"21":1,"22":1}}],["рекламных",{"2":{"110":1}}],["рекомендует",{"2":{"103":1}}],["рекомендуется",{"2":{"34":1,"55":3,"78":1,"98":1,"102":1}}],["рекомендации",{"2":{"28":1,"29":1}}],["рекомендаций",{"2":{"20":1}}],["реконнект",{"2":{"5":1}}],["редактор",{"2":{"103":1}}],["редакторе",{"2":{"103":1}}],["редко",{"2":{"2":1,"33":1,"50":1}}],["репозиторий",{"2":{"103":1}}],["репозитория",{"2":{"97":4}}],["репозитории",{"2":{"95":1}}],["режиме",{"2":{"72":2,"97":1,"103":2,"106":1,"107":1}}],["режима",{"2":{"4":1}}],["резюме",{"2":{"117":1}}],["резервировать",{"2":{"36":1}}],["результирующее",{"2":{"7":1}}],["результата",{"2":{"71":2}}],["результате",{"2":{"66":1}}],["результат",{"2":{"3":1,"11":1,"72":1}}],["рендеринга",{"2":{"70":1}}],["рендерингу",{"2":{"19":1}}],["рендеринге",{"2":{"13":1}}],["реактивная",{"2":{"11":1,"13":2,"105":1,"108":1}}],["реактивный",{"2":{"106":2,"108":2}}],["реактивных",{"2":{"11":1,"76":1,"105":1,"108":1}}],["реактивным",{"2":{"11":2}}],["реактивными",{"2":{"11":1,"64":1}}],["реактивные",{"2":{"8":1,"11":2,"22":1,"106":3,"108":2}}],["реактивного",{"2":{"60":1}}],["реактивной",{"2":{"11":1,"13":1}}],["реактивном",{"2":{"7":2,"108":1}}],["реактивностью",{"2":{"108":2}}],["реактивность",{"2":{"7":1,"65":2,"66":1,"74":1,"108":2}}],["реактивности",{"2":{"6":1,"64":2,"65":1,"108":2}}],["реактивную",{"2":{"6":1,"11":2,"106":1,"108":1}}],["реально",{"2":{"110":1}}],["реальном",{"2":{"65":1,"66":1}}],["реальности",{"2":{"40":1}}],["реальный",{"2":{"117":1}}],["реальные",{"2":{"107":1}}],["реальным",{"2":{"26":1}}],["реальными",{"2":{"3":1}}],["реальных",{"2":{"7":1}}],["реализовывать",{"2":{"73":1}}],["реализовали",{"2":{"63":1}}],["реализовать",{"2":{"56":2,"60":1,"61":1,"63":1,"64":1,"72":1}}],["реализовано",{"2":{"65":1}}],["реализован",{"2":{"53":1,"58":1,"63":1,"64":1}}],["реализованы",{"2":{"6":1,"7":1,"38":1}}],["реализуемые",{"2":{"66":1}}],["реализует",{"2":{"62":1,"66":1}}],["реализуют",{"2":{"59":1}}],["реализацией",{"2":{"62":1,"65":1}}],["реализаций",{"2":{"50":1,"51":1,"69":2}}],["реализация",{"0":{"48":1},"1":{"49":1,"50":1},"2":{"38":1,"40":1,"48":1,"49":1,"60":1,"61":3,"62":1,"63":2,"64":1,"72":1,"105":1}}],["реализацию",{"2":{"37":1,"40":1,"50":1,"56":2,"61":1,"63":1,"73":1,"110":1}}],["реализации",{"2":{"5":1,"19":1,"26":1,"28":2,"40":1,"45":1,"48":1,"49":2,"53":1,"55":2,"56":1,"57":1,"58":1,"59":1,"60":2,"62":1,"64":1,"84":1,"86":2,"90":1,"105":2,"115":1}}],["решили",{"2":{"109":3}}],["решить",{"2":{"97":1,"99":1}}],["решений",{"2":{"97":1,"118":1}}],["решению",{"2":{"76":1}}],["решения",{"2":{"19":1,"28":4,"33":1,"40":1,"61":1,"71":1,"118":1}}],["решением",{"2":{"3":1,"103":1}}],["решение",{"2":{"3":1,"4":2,"5":1,"7":1,"40":1,"66":1,"76":1,"108":1,"117":1}}],["решётки",{"2":{"8":1}}],["решать",{"2":{"55":1}}],["решают",{"2":{"41":1}}],["решали",{"2":{"6":1}}],["решает",{"2":{"2":1,"7":1,"33":1,"106":1}}],["релевантные",{"2":{"3":1}}],["ресурса",{"2":{"99":1}}],["ресурсами",{"2":{"3":1,"99":1,"118":2}}],["ресурсам",{"2":{"2":1,"46":1,"99":1}}],["ресурсом",{"2":{"64":1}}],["ресурсов",{"2":{"4":2,"99":1,"118":1}}],["ресурсы",{"0":{"99":1},"1":{"100":1,"101":1},"2":{"36":1,"70":1,"99":4,"102":1,"109":1,"117":1}}],["ресурсу",{"2":{"2":1,"4":2,"47":1}}],["ресурс",{"2":{"2":2,"4":2,"117":1}}],["рано",{"2":{"110":1}}],["раньше",{"2":{"71":3,"72":1,"103":1}}],["ранее",{"2":{"10":1,"61":1,"66":1,"97":1}}],["равна",{"2":{"14":1}}],["равно",{"2":{"11":1,"14":1,"56":1,"70":1,"117":1}}],["рабочем",{"2":{"92":1}}],["рабочему",{"2":{"37":1}}],["рабочего",{"0":{"85":1},"2":{"8":1,"9":1,"10":1,"11":1,"61":1,"71":1}}],["рабочих",{"0":{"90":1}}],["рабочими",{"2":{"69":1,"90":1}}],["рабочие",{"2":{"31":1}}],["рабочий",{"2":{"9":1,"85":1,"95":2}}],["работу",{"2":{"85":1,"107":1}}],["работе",{"2":{"19":1,"27":1,"40":1,"103":2,"108":2}}],["работа",{"2":{"58":1}}],["работала",{"2":{"61":1}}],["работало",{"2":{"50":1}}],["работали",{"2":{"11":1,"33":1,"36":1}}],["работающий",{"2":{"51":1}}],["работающих",{"2":{"38":1}}],["работают",{"2":{"3":1,"10":1,"36":1,"38":1,"45":1,"66":1,"70":1,"106":1}}],["работать",{"2":{"3":1,"5":1,"7":1,"9":1,"19":1,"59":1,"64":1,"73":1,"78":1,"103":2,"106":1,"118":1}}],["работает",{"2":{"2":2,"30":1,"49":1,"59":1,"63":1,"64":1,"65":3,"103":1,"105":3,"108":1,"110":1,"117":1,"118":2}}],["работы",{"2":{"2":1,"3":1,"4":1,"7":1,"10":1,"18":1,"26":1,"27":1,"37":1,"39":1,"69":1,"72":2,"99":1,"104":1,"118":2,"138":3}}],["рамками",{"2":{"10":1}}],["рамках",{"2":{"7":1,"12":1}}],["рамки",{"2":{"6":1,"7":1,"33":1,"36":1,"37":1,"39":1}}],["расшаривать",{"2":{"106":1}}],["расширить",{"2":{"117":1}}],["расширяемость",{"2":{"116":1}}],["расширяет",{"2":{"66":1,"93":1}}],["расширять",{"2":{"7":1,"102":1}}],["расширений",{"2":{"103":1}}],["расширении",{"2":{"78":1,"108":1}}],["расширением",{"2":{"10":1}}],["расширения",{"2":{"4":1,"32":1,"66":1,"103":2}}],["располагались",{"2":{"116":1}}],["располагается",{"2":{"69":1}}],["расползлись",{"2":{"106":1}}],["располнела",{"2":{"105":1}}],["распределение",{"2":{"118":1}}],["распределения",{"2":{"57":1}}],["распределенных",{"2":{"38":1}}],["распределяются",{"2":{"2":1}}],["распространяется",{"2":{"34":1}}],["распространяющихся",{"2":{"10":1}}],["распространены",{"2":{"117":1}}],["распространенного",{"2":{"116":1}}],["распространенность",{"2":{"108":1}}],["распространенной",{"2":{"91":1}}],["распространенные",{"2":{"108":1}}],["распространенными",{"2":{"6":1}}],["распространенный",{"2":{"2":1,"46":1}}],["распространен",{"2":{"68":1}}],["распространения",{"2":{"8":1}}],["раскрывается",{"2":{"63":1}}],["раскрывает",{"2":{"8":1,"64":1}}],["рассказывается",{"2":{"84":1}}],["рассказано",{"2":{"17":1}}],["рассказать",{"2":{"7":1}}],["рассуждений",{"2":{"40":1}}],["рассмотренными",{"2":{"72":1}}],["рассмотрены",{"2":{"66":1}}],["рассмотрении",{"2":{"60":1}}],["рассмотрели",{"2":{"61":1,"64":1,"73":1}}],["рассмотрим",{"2":{"6":1,"7":1,"8":1,"10":2,"11":1,"12":1,"17":1,"19":2,"28":1,"31":1,"36":1,"37":1,"40":2,"45":1,"48":1,"57":1,"58":1,"59":1,"60":1,"61":2,"64":2,"65":1,"66":2,"67":1,"70":1,"71":2}}],["рассматриваемое",{"2":{"78":1}}],["рассматриваем",{"2":{"56":1}}],["рассматривается",{"2":{"76":1}}],["рассматривает",{"2":{"31":1,"118":1}}],["рассматривать",{"2":{"9":1,"11":1,"31":1,"32":1,"34":1,"66":1}}],["рассматриваться",{"2":{"8":1}}],["рассматриваются",{"2":{"6":1}}],["раздаются",{"2":{"118":1}}],["разделять",{"2":{"106":1}}],["разделяет",{"2":{"66":1}}],["разделить",{"2":{"31":2,"33":1}}],["разделив",{"2":{"7":1}}],["разделах",{"2":{"10":1,"124":1}}],["раздела",{"2":{"10":1}}],["разделена",{"2":{"31":1}}],["разделение",{"0":{"31":1},"2":{"28":1,"31":2,"33":1,"60":1,"116":1}}],["разделения",{"2":{"10":1,"31":2,"38":1}}],["разделенных",{"2":{"4":1}}],["разделе",{"2":{"4":1,"8":1,"18":1,"36":1}}],["разделы",{"2":{"2":1}}],["раза",{"2":{"106":1}}],["разгрузки",{"2":{"63":1}}],["развертывания",{"2":{"95":1,"97":1}}],["развертыванием",{"2":{"97":1}}],["развертывание",{"0":{"92":1}}],["разворачивать",{"2":{"36":1}}],["развивается",{"2":{"108":1}}],["развиваться",{"2":{"33":1}}],["развитие",{"0":{"137":1},"2":{"39":1}}],["развития",{"2":{"6":1}}],["разбираться",{"2":{"118":1}}],["разбиения",{"2":{"108":2}}],["разбивается",{"2":{"109":1}}],["разбивает",{"2":{"31":1}}],["разбрасывать",{"2":{"36":1}}],["размышления",{"2":{"39":1}}],["размонтированием",{"2":{"36":1}}],["размонтировании",{"2":{"19":1}}],["разместить",{"2":{"36":1,"98":3}}],["разместим",{"2":{"10":1}}],["размер",{"2":{"11":1,"99":2,"110":1}}],["размера",{"2":{"7":3,"36":2,"99":1}}],["размещено",{"2":{"8":1}}],["размещения",{"2":{"3":1,"8":1,"98":1,"118":1}}],["разметки",{"2":{"6":1}}],["различающихся",{"2":{"106":1}}],["различаются",{"2":{"30":1}}],["различать",{"2":{"70":1}}],["различным",{"2":{"39":1}}],["различными",{"2":{"3":1,"31":1,"63":1,"108":1}}],["различный",{"2":{"10":1}}],["различные",{"2":{"6":2,"71":1}}],["различных",{"2":{"6":1,"50":1,"64":1,"117":1}}],["различие",{"2":{"6":1,"7":1}}],["разряда",{"2":{"113":1}}],["разрабатываешь",{"2":{"109":1}}],["разрабатываемого",{"2":{"95":1}}],["разрабатывать",{"2":{"108":1,"109":1,"118":1}}],["разработкой",{"2":{"107":1}}],["разработка",{"2":{"28":1,"107":1,"124":1,"126":1,"127":1}}],["разработку",{"2":{"7":1,"28":1,"108":1,"116":2}}],["разработки",{"2":{"7":2,"11":1,"34":1,"36":1,"38":1,"39":1,"40":1,"69":1,"73":1,"86":1,"98":1,"103":3,"107":1,"108":1,"109":1}}],["разработке",{"2":{"4":1,"27":1,"28":1,"29":1,"38":1,"40":1,"77":1,"103":1,"118":1}}],["разработан",{"2":{"7":1}}],["разработчику",{"2":{"116":1,"117":1}}],["разработчиком",{"2":{"93":1,"117":1}}],["разработчиков",{"2":{"20":1,"50":1,"77":1,"94":1,"107":1,"117":1,"139":1}}],["разработчики",{"2":{"39":1,"69":1,"78":1,"116":2}}],["разработчика",{"2":{"8":1,"69":1,"78":1,"106":2,"115":1,"117":1,"138":1}}],["разработчик",{"2":{"3":1,"7":1,"28":1,"106":1}}],["разрешили",{"2":{"118":1}}],["разрешает",{"2":{"4":1}}],["разрешать",{"2":{"2":1}}],["разрешено",{"2":{"72":1}}],["разрешен",{"2":{"4":3}}],["разрешений",{"2":{"109":1}}],["разрешения",{"2":{"2":1}}],["разрешение",{"2":{"2":2,"70":1}}],["разному",{"2":{"118":1}}],["разного",{"2":{"108":1}}],["разницу",{"2":{"71":1}}],["разницей",{"2":{"15":1,"66":1}}],["разница",{"2":{"7":1,"27":1,"74":1,"117":1}}],["разницы",{"2":{"2":1}}],["разными",{"2":{"63":1}}],["разных",{"2":{"4":1,"37":1,"45":1,"106":1,"109":1,"124":1}}],["разный",{"2":{"2":1}}],["разные",{"0":{"11":1},"2":{"2":1,"102":1,"109":1,"118":1}}],["раз",{"2":{"2":3,"7":1,"11":1,"13":1,"38":1,"46":1,"49":1,"50":1,"55":1,"102":2,"106":1,"118":1}}],["sw",{"2":{"118":1,"138":1}}],["swagger",{"2":{"117":1}}],["switch",{"2":{"59":2,"63":2,"65":2}}],["svelte",{"2":{"103":6,"108":3}}],["svgo",{"2":{"103":20}}],["svgresources",{"2":{"101":8}}],["svg",{"2":{"100":4,"101":3,"102":1,"103":4}}],["synctex",{"2":{"103":2}}],["sass",{"2":{"103":2}}],["save",{"2":{"103":2}}],["smoothscrolling",{"2":{"103":2}}],["sftp",{"2":{"103":1}}],["sfc",{"2":{"10":3,"18":1,"19":1,"103":2,"108":1}}],["s3",{"2":{"98":1}}],["snickerbockers",{"2":{"97":3}}],["snake",{"2":{"22":1}}],["ssg",{"0":{"118":1},"2":{"118":3}}],["ssd",{"2":{"103":1}}],["ssr",{"0":{"118":1},"2":{"103":2,"106":2,"118":9}}],["ss06",{"2":{"103":2}}],["ss03",{"2":{"103":2}}],["ss02",{"2":{"103":2}}],["ss01",{"2":{"103":2}}],["ssl",{"2":{"98":2}}],["ssh",{"2":{"97":23,"103":2}}],["sso",{"2":{"2":2}}],["s",{"2":{"92":2,"97":2,"99":1,"102":1,"106":1}}],["solvery",{"2":{"117":1}}],["somearr",{"2":{"108":8}}],["someimage",{"2":{"99":2}}],["somefunc",{"2":{"3":1}}],["social",{"2":{"99":1}}],["source",{"2":{"69":1,"97":2,"103":6}}],["square",{"2":{"59":5}}],["sql",{"2":{"5":1,"97":2,"103":1,"106":2,"117":1}}],["store",{"2":{"106":2}}],["story",{"2":{"103":2}}],["storage",{"2":{"78":1}}],["sticky",{"2":{"103":2}}],["stickyscroll",{"2":{"103":2}}],["stringhelpers",{"2":{"109":1}}],["string",{"2":{"99":2,"100":12}}],["staged",{"2":{"103":4}}],["staging",{"2":{"97":6}}],["stackblitz",{"2":{"103":5}}],["stackable",{"2":{"66":1}}],["stateful",{"2":{"106":1}}],["state",{"0":{"106":1},"2":{"103":2,"106":5}}],["static",{"2":{"99":2,"118":1}}],["stash",{"2":{"103":6}}],["steps",{"2":{"97":4}}],["studio",{"2":{"78":1}}],["stupid",{"2":{"28":1}}],["stylelint",{"2":{"103":8}}],["styleci",{"2":{"103":4}}],["style=",{"2":{"68":2,"100":4}}],["style",{"2":{"10":5,"67":4,"100":4,"103":1,"117":2}}],["sponsors",{"2":{"103":2}}],["spec",{"2":{"103":2}}],["special",{"2":{"19":1}}],["splice",{"2":{"61":2}}],["spas",{"2":{"88":1}}],["span",{"2":{"16":5}}],["spa",{"0":{"118":1},"2":{"2":1,"118":10}}],["sum",{"2":{"103":4}}],["suggestselection",{"2":{"103":2}}],["sudo",{"2":{"97":6}}],["substring",{"2":{"101":4}}],["submodules",{"2":{"97":6}}],["sub",{"2":{"60":1,"64":1}}],["suspense",{"2":{"19":1}}],["supabase",{"2":{"3":2,"117":1}}],["sheet",{"0":{"130":1},"1":{"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"131":1,"132":1,"133":1,"134":4}}],["shell",{"2":{"103":2,"109":1}}],["shims",{"2":{"103":2}}],["sh",{"2":{"103":4}}],["shrinkwrap",{"2":{"103":4}}],["shnpx",{"2":{"102":1}}],["shpnpm",{"2":{"102":1}}],["short",{"0":{"38":1}}],["showdocumentation",{"2":{"103":2}}],["showsuggestionsassnippets",{"2":{"103":2}}],["show=",{"2":{"14":2}}],["show",{"0":{"14":1},"2":{"14":1,"15":3,"19":1}}],["shallowref",{"2":{"105":2}}],["shaking",{"2":{"101":2,"110":1}}],["shape2",{"2":{"59":4}}],["shape1",{"2":{"59":4}}],["sha",{"2":{"7":1}}],["sharing",{"2":{"4":1}}],["src",{"2":{"13":1,"99":1,"102":4}}],["src=",{"2":{"8":2,"13":2,"99":6,"100":2}}],["scmitem",{"2":{"103":2}}],["scmgroupinline",{"2":{"103":2}}],["scmgroup",{"2":{"103":2}}],["scm",{"2":{"103":4}}],["scss",{"2":{"100":2,"103":2}}],["scoped",{"2":{"10":4,"67":2,"100":2}}],["scripts",{"2":{"97":2}}],["script",{"0":{"11":1},"2":{"8":10,"10":5,"11":15,"19":4,"36":5,"67":4,"68":4,"97":4,"100":4,"103":1,"105":1}}],["side",{"2":{"118":1}}],["size",{"2":{"100":10}}],["size=",{"2":{"99":2}}],["simpledialog",{"2":{"103":2}}],["simple",{"0":{"38":1},"2":{"28":1,"103":8}}],["site",{"2":{"4":4,"97":25,"118":1}}],["sign",{"2":{"2":1}}],["singlequote",{"2":{"103":2}}],["singleclick",{"2":{"103":2}}],["singleton",{"0":{"46":1},"1":{"47":1,"48":1,"49":1,"50":1},"2":{"28":1,"42":1,"49":4,"50":12,"56":1,"61":4,"74":1}}],["single",{"0":{"33":1},"2":{"2":1,"28":1,"118":1}}],["seo",{"0":{"118":1},"2":{"118":1}}],["section",{"2":{"114":1}}],["security",{"2":{"103":2}}],["secrets",{"2":{"97":3}}],["sentry",{"2":{"103":4}}],["semi",{"2":{"103":2}}],["search",{"2":{"103":2}}],["separate",{"2":{"103":2}}],["separation",{"0":{"31":1},"2":{"28":1}}],["select",{"2":{"17":1,"116":2}}],["servers",{"2":{"78":1}}],["server",{"2":{"4":4,"97":5,"103":10,"118":1}}],["service",{"2":{"3":1,"25":1,"103":2,"118":3,"138":1}}],["services",{"2":{"1":2}}],["setsomearr",{"2":{"108":2}}],["setitem",{"2":{"97":2}}],["setimmediate",{"2":{"71":3,"72":1}}],["setting",{"2":{"97":2,"103":1}}],["settings",{"2":{"97":1,"103":1}}],["settokencallback",{"2":{"1":2}}],["setdbmanager",{"2":{"56":2}}],["setup",{"0":{"11":1},"2":{"10":3,"11":8,"19":2,"36":3,"67":2,"68":2,"97":7,"100":2,"103":1,"105":1}}],["setlogoutcallback",{"2":{"1":2}}],["set",{"2":{"1":2,"65":3,"66":1,"101":4}}],["setbaseurl",{"2":{"1":2}}],["п",{"2":{"107":1,"109":1,"138":1}}],["пк",{"2":{"103":2}}],["песочницы",{"2":{"103":1}}],["песочнице",{"2":{"102":1}}],["пет",{"2":{"97":1}}],["перспективе",{"2":{"40":1}}],["первых",{"2":{"117":1,"139":1}}],["первый",{"2":{"11":1,"36":1,"49":1,"66":1,"72":1}}],["первую",{"2":{"72":1}}],["первой",{"2":{"28":1,"117":1,"118":1}}],["первоначальном",{"2":{"13":1}}],["первого",{"2":{"8":1,"55":1}}],["первоклассные",{"2":{"6":1}}],["первом",{"2":{"2":2,"50":1,"64":1,"73":1,"118":1}}],["переименовывая",{"2":{"112":1}}],["переименовываются",{"2":{"99":1}}],["перемещая",{"2":{"112":1}}],["переменным",{"2":{"11":2}}],["переменными",{"2":{"11":1}}],["переменные",{"0":{"21":1},"2":{"8":1,"10":1,"11":4,"36":1,"72":1,"106":1,"108":2}}],["переменных",{"2":{"7":1,"11":1,"19":1,"105":1}}],["переменной",{"2":{"7":2,"8":1,"11":3,"13":2,"17":2,"19":2,"105":2,"106":1,"108":2}}],["переменная",{"2":{"7":2,"8":1,"11":1,"13":3,"14":2,"72":1,"108":2}}],["переменную",{"2":{"7":1,"11":2,"14":1,"18":1,"50":1,"106":2,"108":1}}],["переписывание",{"2":{"107":1}}],["переписываете",{"2":{"106":1}}],["переписывать",{"2":{"66":1}}],["перезагрузку",{"2":{"97":1}}],["переведена",{"0":{"81":1}}],["перевешивают",{"2":{"72":1}}],["перевести",{"2":{"5":1}}],["перейти",{"2":{"69":1}}],["перейдем",{"2":{"58":1}}],["перехваченные",{"2":{"66":1}}],["перехвачена",{"2":{"65":1}}],["перехватывает",{"2":{"67":1}}],["перехватывается",{"2":{"65":1}}],["перехватывать",{"2":{"64":1}}],["перехватывая",{"2":{"64":1}}],["переходит",{"2":{"32":1}}],["переходов",{"2":{"19":1}}],["перехода",{"2":{"19":1,"95":1}}],["переход",{"2":{"5":1,"111":1}}],["пересылает",{"2":{"118":1}}],["пересылаемый",{"2":{"2":1}}],["перестанет",{"2":{"110":1}}],["перестает",{"2":{"60":1,"106":1}}],["пересчитали",{"2":{"108":1}}],["перенесена",{"2":{"56":1}}],["переносится",{"2":{"48":1,"103":1}}],["переносить",{"2":{"19":1}}],["переносе",{"2":{"6":1}}],["переключатель",{"2":{"65":1}}],["переключаться",{"2":{"15":1}}],["перекрестного",{"2":{"4":1}}],["перерасти",{"2":{"7":1}}],["передавать",{"2":{"72":1,"108":1}}],["передаваемые",{"2":{"68":1}}],["передавая",{"2":{"8":1,"61":1,"64":1}}],["передают",{"2":{"62":1}}],["переданному",{"2":{"71":1}}],["переданную",{"2":{"57":1}}],["переданным",{"2":{"15":1}}],["передача",{"2":{"55":1,"56":2}}],["передачи",{"2":{"11":1,"55":1}}],["передает",{"2":{"61":1}}],["передается",{"2":{"53":1}}],["передаем",{"2":{"8":1,"71":1,"72":1}}],["передать",{"2":{"10":1,"39":1,"61":1,"106":2}}],["передаёт",{"2":{"2":1}}],["перед",{"2":{"7":2,"11":1,"36":2,"54":1,"56":1,"66":1,"72":1,"99":1,"117":1}}],["перелогиниваться",{"2":{"2":1}}],["перелогин",{"2":{"2":1}}],["пытается",{"2":{"103":1}}],["пытаются",{"2":{"65":1,"109":1}}],["пытаться",{"2":{"32":1,"33":1,"38":1,"109":1}}],["пять",{"2":{"16":1}}],["пищеварительной",{"2":{"31":1}}],["пишут",{"2":{"39":1}}],["пишутся",{"2":{"21":1,"24":1}}],["пишет",{"2":{"118":1}}],["пишете",{"2":{"36":1,"37":1}}],["пишем",{"2":{"10":1}}],["пиши",{"0":{"39":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"28":1,"37":1}}],["писать",{"2":{"11":1,"25":1,"106":1,"108":1}}],["папке",{"2":{"99":1}}],["папки",{"2":{"99":2}}],["папку",{"2":{"99":3}}],["пабло",{"2":{"80":1}}],["память",{"2":{"36":1}}],["памяти",{"2":{"36":3,"103":1}}],["паттерн",{"2":{"105":1}}],["паттернах",{"2":{"76":1}}],["паттернов",{"2":{"26":1,"28":1,"76":1,"77":1,"78":1,"93":1}}],["паттерны",{"0":{"84":1},"2":{"6":2,"76":1,"90":1,"116":1}}],["пакетов",{"2":{"103":1}}],["пакетами",{"2":{"102":1}}],["пакета",{"2":{"11":1,"104":1}}],["пакет",{"2":{"9":1,"62":1,"103":1,"110":1}}],["пару",{"2":{"103":1,"105":1,"113":1}}],["параграфы",{"2":{"117":1}}],["параметру",{"2":{"71":1}}],["параметре",{"2":{"63":1}}],["параметр",{"2":{"56":1,"72":1}}],["параметрами",{"2":{"97":1}}],["параметра",{"2":{"53":1,"56":1,"61":1,"71":1}}],["параметров",{"2":{"51":1,"70":1}}],["параметры",{"0":{"35":1},"2":{"11":2,"34":1,"60":1}}],["парадигм",{"2":{"32":1}}],["парадигму",{"2":{"6":1}}],["парадигмы",{"2":{"6":2,"32":1}}],["пароль",{"2":{"2":1,"106":1}}],["паутина",{"2":{"6":1}}],["пусть",{"2":{"109":1,"113":1}}],["пустой",{"2":{"57":1,"61":1}}],["пуша",{"2":{"97":1}}],["публикации",{"2":{"60":2}}],["пункта",{"2":{"55":1}}],["пункт",{"2":{"36":1}}],["путях",{"2":{"102":1}}],["путь",{"0":{"9":2},"2":{"10":1,"26":1}}],["путем",{"2":{"4":1,"32":1,"66":1}}],["пупкина",{"2":{"2":1}}],["пупкин",{"2":{"2":1}}],["плевел",{"2":{"117":1}}],["плохо",{"2":{"116":1}}],["плохой",{"2":{"37":1,"105":1}}],["плохая",{"2":{"106":2}}],["плохие",{"2":{"40":1,"116":1}}],["плохую",{"2":{"40":1}}],["платежей",{"2":{"109":1}}],["платить",{"2":{"11":1}}],["плане",{"2":{"105":1,"106":1,"116":1}}],["планами",{"2":{"98":1}}],["планы",{"2":{"3":2}}],["плагина",{"2":{"118":1}}],["плагинами",{"2":{"102":1}}],["плагины",{"2":{"6":1,"102":1,"106":1}}],["плагинов",{"2":{"6":1,"10":1,"102":1,"103":1}}],["плюсы",{"2":{"116":2}}],["плюс",{"2":{"2":1,"11":1,"97":1,"106":1}}],["покупателей",{"2":{"118":1}}],["показ",{"2":{"109":1}}],["показывали",{"2":{"117":1,"118":1}}],["показывания",{"2":{"97":1}}],["показывать",{"2":{"33":1,"108":1,"118":1}}],["показываться",{"2":{"15":1}}],["показывают",{"2":{"15":1}}],["показывая",{"2":{"15":1}}],["показывает",{"2":{"14":1}}],["показа",{"2":{"15":2,"99":1}}],["показано",{"2":{"11":1,"62":1,"71":2,"91":1}}],["показаться",{"2":{"10":3,"36":1,"66":1,"72":1}}],["пока",{"2":{"6":1,"7":1,"10":1,"19":2,"31":1,"36":1,"39":1,"51":1,"53":1,"67":1,"70":1,"72":1}}],["поисковых",{"2":{"118":1}}],["поисковиков",{"2":{"118":1}}],["поисковик",{"2":{"118":1}}],["поисковиками",{"2":{"118":1}}],["поискать",{"2":{"101":1}}],["поиграйте",{"2":{"117":1}}],["поизучайте",{"2":{"117":1}}],["поэкспериментируйте",{"2":{"117":1}}],["поэтому",{"2":{"7":1,"8":1,"9":1,"11":2,"19":2,"25":1,"26":1,"30":1,"32":1,"36":1,"49":1,"56":2,"60":1,"64":1,"103":2,"105":1,"106":1,"108":1,"109":1,"118":1}}],["пояснить",{"2":{"66":1}}],["появляются",{"2":{"103":1}}],["появления",{"2":{"118":1}}],["появлению",{"2":{"11":1}}],["появлением",{"2":{"6":1}}],["появятся",{"2":{"19":1}}],["появился",{"2":{"106":1,"118":1}}],["появилось",{"2":{"105":1,"106":1}}],["появилась",{"2":{"64":1,"108":1}}],["появились",{"2":{"6":1,"28":1,"106":1}}],["появится",{"2":{"4":1,"14":1}}],["побочных",{"2":{"37":1}}],["почти",{"2":{"37":1,"117":1}}],["почему",{"2":{"5":1,"27":2,"74":3,"108":1,"116":1,"117":1}}],["пожалуйста",{"2":{"56":1}}],["пожалуй",{"2":{"31":1}}],["похудеет",{"2":{"105":1}}],["похоже",{"2":{"55":1}}],["похожей",{"2":{"36":1}}],["похожим",{"2":{"66":1}}],["похожи",{"2":{"15":1}}],["похакать",{"2":{"3":1}}],["повысит",{"2":{"115":1}}],["повысить",{"2":{"109":1}}],["повышает",{"2":{"109":1}}],["повышается",{"2":{"109":1,"118":1}}],["повышение",{"2":{"139":1}}],["повышению",{"2":{"90":1}}],["повышения",{"2":{"64":1}}],["повсеместно",{"2":{"69":1}}],["повторения",{"2":{"49":1}}],["повторяющегося",{"2":{"108":1}}],["повторяющихся",{"2":{"28":1}}],["повторяйтесь",{"2":{"69":1}}],["повторяйся",{"0":{"37":1}}],["повторяться",{"2":{"28":1}}],["повторно",{"2":{"11":1}}],["повторного",{"2":{"11":1,"29":1,"40":1,"53":1}}],["поведенческие",{"0":{"43":1}}],["поведение",{"2":{"6":1,"12":1,"33":1,"47":1,"108":1}}],["поведением",{"2":{"6":1}}],["поверх",{"2":{"7":2}}],["поговорим",{"2":{"10":1}}],["помещаться",{"2":{"99":1}}],["помещаются",{"2":{"99":1}}],["поместить",{"2":{"109":1}}],["поместит",{"2":{"10":1}}],["помимо",{"2":{"60":1,"69":1,"76":1}}],["помните",{"2":{"56":1}}],["помнить",{"2":{"9":1,"10":1,"36":1,"106":1}}],["поможет",{"2":{"28":2,"64":1,"76":2,"117":1}}],["помогает",{"2":{"19":1,"36":1,"117":1}}],["помогают",{"2":{"9":1,"116":1,"117":1}}],["помогающая",{"2":{"7":1}}],["помогут",{"2":{"6":1,"20":1}}],["помочь",{"2":{"4":1,"27":1,"73":1,"117":1}}],["помощьюобещаний",{"2":{"72":1}}],["помощью",{"0":{"86":1,"90":1},"2":{"3":1,"10":2,"11":1,"18":2,"19":1,"32":1,"36":1,"58":1,"61":2,"64":2,"69":3,"71":2,"73":1,"76":1,"90":1,"92":2,"98":1,"103":1,"106":1}}],["поймать",{"2":{"105":1}}],["поймете",{"2":{"33":1}}],["поймем",{"2":{"7":1}}],["пойдет",{"2":{"3":1}}],["потратьте",{"2":{"103":1,"113":1}}],["потребностей",{"2":{"73":1}}],["потребляют",{"2":{"70":1}}],["потребуется",{"2":{"70":1}}],["потребует",{"2":{"7":1}}],["потери",{"2":{"101":1}}],["потерять",{"2":{"2":1}}],["потом",{"2":{"106":2,"118":2}}],["потомок",{"2":{"106":1}}],["потомком",{"2":{"106":1}}],["потому",{"2":{"49":1,"71":1,"97":1,"106":1,"118":1}}],["потока",{"2":{"63":1,"70":2,"71":1,"72":1,"89":1}}],["потоками",{"0":{"89":1},"2":{"51":1,"63":1,"89":1}}],["потоке",{"2":{"37":1,"70":1,"108":1}}],["потоком",{"2":{"10":1,"11":1,"45":1,"58":1,"108":1}}],["поток",{"2":{"7":1,"39":1,"70":2,"105":1}}],["поздно",{"2":{"110":1}}],["позволить",{"2":{"55":1}}],["позволит",{"2":{"28":1,"36":1,"73":1,"76":1}}],["позволяют",{"2":{"98":1,"102":1}}],["позволяющая",{"2":{"66":1}}],["позволяющее",{"2":{"47":1}}],["позволяющие",{"2":{"6":1,"36":1}}],["позволяющий",{"2":{"4":1}}],["позволяя",{"2":{"70":1,"95":1}}],["позволяет",{"2":{"7":1,"10":1,"19":1,"31":1,"40":1,"57":1,"61":2,"72":1,"97":1,"103":1,"106":1,"108":2,"109":2,"118":2}}],["позаботится",{"2":{"11":1}}],["позже",{"2":{"8":1,"19":1,"32":1,"37":1,"118":1}}],["познакомимся",{"2":{"6":1}}],["попробуйте",{"2":{"101":1,"103":1,"117":2}}],["попробует",{"2":{"101":1}}],["попутно",{"2":{"6":1}}],["популярен",{"2":{"59":1}}],["популярна",{"2":{"105":1}}],["популярности",{"2":{"103":1}}],["популярность",{"2":{"25":1}}],["популярным",{"2":{"118":1}}],["популярные",{"2":{"102":1}}],["популярных",{"2":{"6":1}}],["популярный",{"2":{"3":1,"97":1}}],["популяризация",{"2":{"5":2}}],["попытка",{"2":{"5":1,"65":1}}],["порой",{"2":{"117":1}}],["порог",{"2":{"108":1}}],["порождающие",{"0":{"42":1}}],["порождают",{"2":{"40":1}}],["порождает",{"2":{"9":1}}],["поработайте",{"2":{"117":2}}],["поработаем",{"2":{"62":1}}],["пора",{"2":{"69":1}}],["порекомендовать",{"2":{"25":1}}],["порядки",{"2":{"118":1}}],["порядке",{"2":{"9":1}}],["порядка",{"2":{"9":1}}],["порядок",{"2":{"5":1}}],["пор",{"2":{"7":1,"9":1,"18":1,"19":1,"39":1,"53":1,"69":1,"72":1}}],["портом",{"2":{"4":1}}],["портал",{"2":{"2":1}}],["посмотрим",{"2":{"72":1}}],["посмотрите",{"2":{"71":1,"103":1,"117":1}}],["посмотреть",{"2":{"7":1,"80":1,"102":1,"103":1,"117":1,"118":1}}],["посвящена",{"2":{"45":1,"90":1}}],["посвящены",{"2":{"40":1}}],["поскольку",{"2":{"7":1,"8":1,"11":1,"19":1,"20":1,"33":1,"36":1,"55":1,"60":1,"64":1,"65":3,"66":1,"67":1,"69":1,"70":1,"72":1}}],["последовательную",{"2":{"72":1}}],["последовательно",{"2":{"70":1,"71":1}}],["последовательной",{"2":{"25":1}}],["последующих",{"2":{"50":2}}],["последствия",{"2":{"40":1}}],["последние",{"2":{"105":1}}],["последних",{"2":{"97":1}}],["последний",{"2":{"55":1}}],["последним",{"2":{"29":1,"72":1}}],["последней",{"2":{"10":1,"31":1}}],["последняя",{"2":{"6":1,"76":1}}],["после",{"2":{"5":1,"15":1,"18":1,"45":1,"49":1,"55":1,"57":1,"61":2,"66":1,"67":1,"70":3,"85":1,"95":1,"97":2,"98":1,"106":1,"118":3}}],["посылать",{"2":{"5":1}}],["посредником",{"2":{"4":1}}],["построчно",{"2":{"61":1,"63":1,"65":1}}],["построению",{"2":{"76":1}}],["построения",{"2":{"7":3,"68":1}}],["построен",{"2":{"7":1,"9":1}}],["построенные",{"2":{"7":1,"106":1}}],["построены",{"2":{"7":1}}],["построить",{"2":{"7":1,"76":1}}],["постепенно",{"2":{"6":1,"7":1,"76":1}}],["поставлены",{"2":{"62":1}}],["поставщиков",{"2":{"5":1}}],["поставив",{"2":{"3":1}}],["поставить",{"2":{"3":1,"103":1}}],["постоянным",{"2":{"2":1}}],["поняв",{"2":{"19":1}}],["понятную",{"2":{"116":1}}],["понятные",{"2":{"102":1}}],["понятным",{"2":{"5":1,"39":1}}],["понять",{"2":{"20":1,"47":1,"73":1,"106":1,"117":1}}],["понятий",{"2":{"9":1,"85":1}}],["понятия",{"2":{"7":1,"9":1,"26":1,"37":1,"60":1,"83":1,"93":1,"109":1}}],["понятии",{"2":{"7":1}}],["понятие",{"2":{"2":1,"8":1,"37":1,"108":1}}],["понадобятся",{"2":{"64":1}}],["понадобится",{"2":{"8":1,"56":1,"102":1}}],["поначалу",{"2":{"10":1}}],["понимается",{"2":{"38":1}}],["понимаются",{"2":{"99":1}}],["понимают",{"2":{"37":1}}],["понимания",{"2":{"28":1,"62":1,"70":1,"72":1,"78":1,"92":1}}],["понимание",{"0":{"10":1},"2":{"28":1,"76":1,"117":1}}],["понимать",{"2":{"2":1,"7":1,"40":1,"117":1}}],["подгружается",{"2":{"118":1}}],["подготовки",{"2":{"117":1}}],["подготовлены",{"2":{"19":1}}],["подарила",{"2":{"118":1}}],["подскажите",{"0":{"104":1}}],["подсоединение",{"2":{"103":1}}],["подсистем",{"2":{"31":1,"69":1}}],["подсистемы",{"2":{"31":1}}],["поделился",{"2":{"103":1}}],["подключать",{"2":{"99":1,"106":1,"110":2}}],["подключаются",{"2":{"99":1}}],["подключить",{"2":{"98":1}}],["подводит",{"2":{"86":1}}],["подвесить",{"2":{"71":1}}],["подведение",{"0":{"26":1,"73":1}}],["подвижные",{"2":{"66":1}}],["подписчиков",{"2":{"60":1}}],["подписываются",{"2":{"60":1}}],["подписывания",{"2":{"2":1}}],["подчеркнуть",{"2":{"36":1}}],["подчеркивания",{"2":{"21":1}}],["подчеркивает",{"2":{"7":1}}],["под",{"2":{"33":1,"61":1,"99":1,"107":1,"108":1}}],["поддиректории",{"2":{"99":1}}],["поддиректориями",{"2":{"97":1}}],["поддомены",{"2":{"98":1}}],["поддается",{"2":{"38":1,"118":1}}],["поддавайтесь",{"2":{"32":1}}],["поддержка",{"2":{"106":2}}],["поддержки",{"2":{"105":2,"117":1}}],["поддержкой",{"2":{"102":1}}],["поддержку",{"2":{"33":1}}],["поддерживаемость",{"2":{"116":1}}],["поддерживает",{"2":{"32":1}}],["поддерживается",{"2":{"10":1,"11":2,"101":1}}],["поддерживаться",{"2":{"106":1,"110":1}}],["поддерживать",{"2":{"33":1,"64":1,"109":1}}],["поддерживая",{"2":{"17":1}}],["подразумевается",{"2":{"118":1}}],["подразумевает",{"2":{"7":1,"31":1}}],["подробностей",{"2":{"40":1}}],["подробно",{"2":{"10":2,"11":1,"58":1,"66":1,"67":1,"99":1}}],["подробная",{"2":{"4":1}}],["подробнее",{"2":{"2":1,"17":1,"45":1,"51":1,"102":1}}],["подходящая",{"2":{"109":1}}],["подходящем",{"2":{"3":1}}],["подходят",{"2":{"106":1}}],["подходить",{"2":{"76":1}}],["подходит",{"2":{"72":1,"103":1,"108":1,"109":1,"118":2}}],["подходите",{"2":{"28":1}}],["подходом",{"2":{"37":1}}],["подходов",{"2":{"7":1,"69":1}}],["подход",{"2":{"33":1,"40":1,"52":1,"55":3,"56":2,"58":1,"65":2,"69":1,"72":1,"116":1,"118":1}}],["подходы",{"2":{"11":1,"76":1,"108":1}}],["подходу",{"2":{"7":1}}],["подхода",{"2":{"7":1,"11":1,"42":1,"53":1,"76":1}}],["подобранных",{"2":{"103":1}}],["подобные",{"2":{"118":1}}],["подобных",{"2":{"40":1}}],["подобный",{"2":{"3":1,"4":1,"68":1,"116":1}}],["подобное",{"2":{"36":1,"51":1}}],["подобно",{"2":{"16":1}}],["подобном",{"2":{"11":1}}],["подождите",{"2":{"11":1}}],["подозрительные",{"2":{"2":1}}],["полиморфизмом",{"2":{"109":1}}],["полтора",{"2":{"106":1}}],["положить",{"2":{"99":1}}],["положение",{"2":{"64":1}}],["пользоваться",{"2":{"106":1,"108":1,"116":1}}],["пользователем",{"2":{"108":1,"109":1}}],["пользователей",{"2":{"6":1,"37":1,"107":1,"109":1,"118":2}}],["пользователю",{"2":{"2":1,"97":1,"108":1}}],["пользователи",{"2":{"2":1}}],["пользователям",{"2":{"2":1}}],["пользователя",{"2":{"2":7,"70":1,"97":1,"109":1,"118":3,"138":1}}],["пользовательский",{"2":{"71":1,"118":1}}],["пользовательским",{"2":{"29":1}}],["пользовательских",{"2":{"7":2,"69":1,"76":1,"86":1}}],["пользовательского",{"0":{"86":1},"2":{"10":2,"17":1,"32":1,"33":1,"36":1,"58":2,"66":2,"67":1,"70":1,"93":2}}],["пользователь",{"2":{"2":6,"17":1,"19":1,"105":1,"106":1,"108":2}}],["пользуется",{"2":{"106":1}}],["пользу",{"0":{"78":1},"2":{"78":1}}],["полным",{"2":{"45":1}}],["полный",{"2":{"18":1,"40":1,"106":1}}],["полностью",{"2":{"7":1,"11":1,"15":1}}],["полноценного",{"2":{"64":1}}],["полноценное",{"2":{"3":1}}],["полноценной",{"2":{"3":1}}],["полно",{"2":{"3":1,"116":1}}],["полезные",{"0":{"105":1},"2":{"103":1,"109":1,"117":1,"127":1}}],["полезных",{"2":{"103":1}}],["полезным",{"2":{"71":1,"72":1}}],["полезны",{"2":{"66":1,"68":1,"77":1,"95":1,"107":1,"118":1}}],["полезность",{"2":{"107":1}}],["полезного",{"2":{"103":1}}],["полезной",{"2":{"97":1}}],["полезно",{"2":{"64":1,"71":1,"112":1}}],["полезен",{"2":{"50":1,"60":1,"62":1,"70":1,"117":1,"118":1}}],["полем",{"2":{"63":1}}],["поле",{"2":{"11":2,"16":1,"106":1,"108":1}}],["полей",{"2":{"8":1}}],["полями",{"2":{"10":1,"11":1}}],["поля",{"2":{"8":1,"11":3,"57":1,"63":1,"108":1}}],["полученные",{"2":{"61":1}}],["получению",{"2":{"60":1}}],["получения",{"2":{"11":1,"48":1,"56":1,"70":1}}],["получении",{"2":{"2":1}}],["получив",{"2":{"57":1}}],["получится",{"2":{"51":1,"117":1}}],["получит",{"2":{"13":1,"72":1}}],["получить",{"0":{"78":1},"2":{"2":1,"11":3,"58":1,"64":1,"72":1,"95":1,"98":1,"118":1}}],["получила",{"2":{"72":1}}],["получили",{"2":{"37":1}}],["получил",{"2":{"11":1}}],["получаем",{"2":{"65":1,"72":1}}],["получаете",{"2":{"98":1}}],["получается",{"2":{"11":1,"33":1,"72":1,"97":1,"99":1,"105":1,"109":1,"118":3}}],["получает",{"2":{"2":1,"4":1,"65":1,"66":1,"70":1,"72":4,"118":1}}],["получат",{"2":{"78":1}}],["получателя",{"2":{"63":6}}],["получателей",{"2":{"62":1}}],["получать",{"2":{"3":1,"117":1,"118":1}}],["получая",{"2":{"56":1}}],["по",{"2":{"2":4,"3":3,"4":3,"6":4,"7":3,"8":1,"9":1,"11":3,"16":1,"18":1,"26":2,"28":1,"31":2,"32":1,"33":2,"34":1,"36":1,"38":1,"40":1,"41":1,"53":2,"55":1,"56":3,"57":4,"58":1,"60":3,"61":2,"65":1,"70":2,"72":2,"73":1,"78":1,"79":1,"94":1,"97":2,"98":1,"99":4,"100":1,"102":2,"103":2,"105":2,"106":5,"107":1,"109":2,"115":1,"116":1,"117":7,"118":8,"139":1}}],["пр",{"2":{"102":1}}],["прямым",{"2":{"106":1}}],["прямых",{"2":{"59":1}}],["прямо",{"2":{"103":1}}],["прямое",{"2":{"56":1}}],["прекрасный",{"2":{"117":1}}],["презентационный",{"2":{"116":1}}],["претенциозной",{"2":{"105":1}}],["претерпела",{"2":{"6":1}}],["прерывается",{"2":{"72":1}}],["прерывании",{"2":{"66":1}}],["преобразовывать",{"2":{"64":1,"65":1}}],["преобразованным",{"2":{"65":1}}],["преобразованы",{"2":{"62":1}}],["преобразования",{"2":{"9":1,"65":1}}],["префикс",{"2":{"13":1}}],["превзойти",{"2":{"11":1}}],["превратить",{"2":{"71":1}}],["превратится",{"2":{"18":1}}],["превратим",{"2":{"70":1}}],["превратилось",{"2":{"66":1}}],["превратился",{"2":{"37":1}}],["превратятся",{"2":{"11":1}}],["превращается",{"2":{"10":1}}],["преследуете",{"2":{"8":1}}],["преимущество",{"2":{"58":1}}],["преимуществом",{"2":{"9":1,"10":1}}],["преимущества",{"2":{"33":1,"58":1,"72":1}}],["преимуществами",{"2":{"7":2,"106":1}}],["преимуществ",{"2":{"7":1,"11":2}}],["преимущественно",{"2":{"5":1,"106":1,"108":1}}],["прежде",{"2":{"7":1,"72":1}}],["прежним",{"2":{"5":1,"6":1}}],["предварительный",{"2":{"117":1}}],["предварительно",{"2":{"117":2,"118":1}}],["предварительное",{"2":{"77":1}}],["предназначались",{"2":{"117":1}}],["предназначена",{"2":{"77":1}}],["предназначен",{"2":{"72":1}}],["предназначенных",{"2":{"6":1}}],["пределами",{"2":{"106":1,"108":1}}],["пределы",{"2":{"19":2}}],["преданность",{"2":{"80":1}}],["предисловие",{"0":{"76":1,"139":1}}],["предыдущую",{"2":{"117":1}}],["предыдущей",{"2":{"68":1}}],["предыдущем",{"2":{"55":1,"63":1}}],["предыдущий",{"2":{"18":1,"52":1,"60":1,"66":1,"72":1}}],["предыдущие",{"2":{"18":1}}],["предыдущих",{"2":{"10":1}}],["предусмотренные",{"2":{"93":1}}],["предусмотрены",{"2":{"12":1}}],["предупредить",{"2":{"33":1}}],["предпочтительнее",{"2":{"72":1}}],["предпочтительно",{"2":{"15":1}}],["предполагает",{"2":{"78":1}}],["предполагалось",{"2":{"65":1}}],["предположим",{"2":{"51":1}}],["предписаны",{"2":{"25":1}}],["предписано",{"2":{"19":1}}],["предписанный",{"2":{"10":1}}],["предписывает",{"2":{"7":1,"9":1,"11":1,"40":1,"71":1}}],["предписывается",{"2":{"7":1}}],["предписывают",{"2":{"7":1}}],["предотвратить",{"2":{"36":1}}],["предотвращая",{"2":{"10":1}}],["предоставить",{"2":{"55":1}}],["предоставленные",{"2":{"78":1}}],["предоставлена",{"2":{"56":1}}],["предоставления",{"2":{"4":1}}],["предоставляемыми",{"2":{"91":1}}],["предоставляется",{"2":{"4":1,"19":1}}],["предоставляет",{"2":{"3":4,"4":1,"6":1,"11":1,"18":2,"19":1,"59":1,"64":3,"72":2}}],["предоставляющих",{"2":{"25":1,"69":1}}],["предоставляются",{"2":{"12":1,"51":1}}],["предоставляют",{"2":{"3":1,"6":1,"7":1,"34":1,"44":1,"98":1,"116":1}}],["предоставлять",{"2":{"4":1,"34":1,"106":1}}],["предостережение",{"2":{"32":1,"38":1}}],["представьте",{"2":{"106":1}}],["представим",{"2":{"33":1,"66":1,"72":1}}],["представить",{"2":{"9":1,"64":1,"69":1}}],["представления",{"2":{"108":1}}],["представление",{"2":{"6":1,"9":2,"31":1,"33":1,"34":1,"60":1,"62":1,"65":1,"67":1,"71":1}}],["представлен",{"2":{"87":1}}],["представлены",{"2":{"83":1,"88":1,"90":1,"92":1,"93":1}}],["представлена",{"2":{"70":1,"89":1}}],["представленная",{"2":{"61":1}}],["представлено",{"2":{"33":1,"94":1}}],["представлять",{"2":{"66":1,"106":1}}],["представляют",{"2":{"9":1}}],["представляет",{"2":{"7":1,"10":1,"76":1,"83":1}}],["представлял",{"2":{"6":1}}],["предстоит",{"2":{"7":1}}],["предложил",{"2":{"117":1,"118":1}}],["предложить",{"2":{"7":1,"69":1,"137":1}}],["предложений",{"2":{"108":1}}],["предложения",{"2":{"15":1}}],["предлагает",{"2":{"7":1,"9":1}}],["предлагаемого",{"2":{"7":1}}],["предлагают",{"2":{"116":1,"117":1}}],["предлагаю",{"2":{"5":1,"61":1}}],["предлагающих",{"2":{"3":1}}],["предмет",{"2":{"3":1}}],["прагматичный",{"2":{"37":1}}],["практической",{"2":{"28":1}}],["практику",{"2":{"40":1}}],["практик",{"2":{"33":1,"39":1,"56":1,"117":1,"138":1}}],["практикой",{"2":{"20":1,"105":1}}],["практиками",{"2":{"117":1}}],["практика",{"2":{"10":1,"106":1}}],["практике",{"2":{"7":1,"10":1,"29":1,"33":1,"37":1,"40":1,"56":1,"69":1,"70":1}}],["практики",{"2":{"2":1,"6":1,"36":1,"39":1,"40":1,"116":1,"117":1}}],["правда",{"2":{"70":1}}],["правило",{"2":{"37":1,"47":1,"78":1}}],["правильных",{"2":{"117":1}}],["правильным",{"2":{"37":1}}],["правильно",{"2":{"10":1,"70":1}}],["правила",{"2":{"6":1,"7":1,"10":1,"29":1,"67":1,"108":1}}],["правая",{"2":{"103":1}}],["права",{"2":{"2":1}}],["право",{"2":{"2":3}}],["пройти",{"2":{"117":1}}],["проапгрейдиться",{"2":{"116":1}}],["прогон",{"2":{"107":1}}],["програмную",{"2":{"118":1}}],["программными",{"2":{"108":1}}],["программное",{"2":{"76":1,"78":1}}],["программном",{"2":{"31":1}}],["программно",{"2":{"7":1}}],["программной",{"2":{"6":1,"7":1,"31":1,"40":1,"76":1}}],["программного",{"0":{"28":1,"29":1,"40":1,"84":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"5":1,"6":1,"28":1,"29":2,"38":1,"39":1,"40":1,"73":1,"84":2,"107":1}}],["программы",{"2":{"7":1,"10":1,"98":1,"103":1,"105":1,"108":2}}],["программировать",{"2":{"109":1}}],["программировали",{"2":{"69":1}}],["программированию",{"2":{"117":2}}],["программирование",{"2":{"28":1,"74":1,"108":1}}],["программировании",{"2":{"7":4,"33":1}}],["программирования",{"2":{"3":2,"6":2,"7":1,"32":1,"34":1,"108":2}}],["программистов",{"2":{"108":1,"139":1}}],["программистские",{"2":{"108":1}}],["программистам",{"2":{"108":1}}],["программиста",{"2":{"28":1,"109":1}}],["программист",{"2":{"7":2,"37":1,"105":1,"108":1}}],["программу",{"2":{"7":1,"38":1}}],["программа",{"2":{"4":1,"7":1}}],["прогрессивность",{"2":{"7":1}}],["прогрессивного",{"2":{"6":1,"76":1}}],["прогрессивные",{"0":{"88":1}}],["прогрессивным",{"2":{"27":1}}],["прогрессивный",{"0":{"7":1},"2":{"6":1,"7":2,"69":1,"83":1}}],["прогрессивных",{"2":{"6":1}}],["процентов",{"2":{"105":1}}],["процессов",{"2":{"45":1}}],["процессор",{"2":{"25":1,"103":1}}],["процессы",{"2":{"40":1}}],["процессу",{"2":{"28":1,"29":1}}],["процесс",{"2":{"9":1,"37":1,"72":1,"95":1,"107":1}}],["процесса",{"2":{"8":1,"11":1,"28":1,"71":1,"97":1}}],["процессе",{"2":{"7":1,"9":1,"37":1}}],["прочесть",{"2":{"118":1}}],["прочих",{"2":{"118":1}}],["прочим",{"2":{"109":1}}],["прочие",{"2":{"99":1}}],["прочтение",{"2":{"80":1}}],["профессионального",{"2":{"112":1}}],["профессиональной",{"2":{"80":1}}],["профессиональное",{"2":{"39":1}}],["продакшне",{"2":{"107":1}}],["продуктовый",{"2":{"117":1}}],["продукт",{"2":{"95":1}}],["продолжает",{"2":{"71":1}}],["продолжить",{"2":{"70":1}}],["продолжительность",{"2":{"70":1}}],["продвигает",{"2":{"34":1}}],["продвижения",{"2":{"6":1,"18":1,"26":1,"73":1}}],["прозрачное",{"2":{"97":1}}],["прозрачно",{"2":{"66":1}}],["прозрачный",{"2":{"2":1,"101":1}}],["проиграет",{"2":{"118":1}}],["проиндексировать",{"2":{"118":1}}],["произошло",{"2":{"106":1}}],["произойдет",{"2":{"70":1}}],["производительное",{"2":{"108":1}}],["производительность",{"2":{"15":1,"110":1}}],["производительности",{"2":{"7":2,"64":1,"88":1,"90":1,"105":1,"106":1,"118":1}}],["производительней",{"2":{"103":1}}],["производительных",{"2":{"77":1}}],["производительная",{"2":{"76":1}}],["производстве",{"2":{"61":1}}],["происходить",{"2":{"97":1,"106":1}}],["происходит",{"2":{"65":2,"71":1,"118":1}}],["промисов",{"2":{"117":1}}],["промисы",{"2":{"28":1}}],["промежуточного",{"2":{"108":1}}],["промежуточное",{"2":{"64":1}}],["промежуточных",{"2":{"66":1}}],["прошлый",{"2":{"39":1}}],["прошли",{"2":{"26":1}}],["проп",{"2":{"106":1}}],["пропсов",{"2":{"106":1}}],["пропсы",{"0":{"21":1},"2":{"106":1}}],["прописать",{"2":{"97":1}}],["прописано",{"2":{"16":1}}],["прописаны",{"2":{"7":1}}],["пропорционально",{"2":{"71":1}}],["пропустили",{"2":{"65":1}}],["прояснить",{"2":{"64":1}}],["проясняться",{"2":{"11":1}}],["проявляется",{"2":{"65":1,"107":1}}],["проявляться",{"2":{"29":1}}],["проявившиеся",{"2":{"11":1}}],["проектом",{"2":{"85":1}}],["проектов",{"2":{"40":1,"85":2,"102":1,"108":1,"116":1}}],["проекты",{"2":{"78":1}}],["проектированию",{"2":{"76":1}}],["проектирование",{"2":{"66":1}}],["проектирования",{"0":{"28":1,"29":1,"30":1,"40":1,"84":1},"1":{"29":1,"30":1,"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"37":2,"38":2,"39":2,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"6":2,"26":1,"28":2,"29":1,"30":1,"39":2,"40":2,"45":1,"58":1,"60":1,"73":1,"74":1,"76":2,"77":2,"78":1,"84":1,"89":1}}],["проект",{"0":{"115":1},"2":{"60":1,"73":1,"85":2,"97":2,"102":2,"109":1,"113":1}}],["проекте",{"2":{"29":2,"97":1,"102":1,"106":1,"116":1,"138":1}}],["проектах",{"2":{"25":1,"40":1,"97":1,"107":1}}],["проекта",{"0":{"85":1},"2":{"3":1,"9":1,"10":1,"11":1,"61":1,"95":1,"97":2,"98":1,"107":1,"109":1,"115":1,"117":1,"138":1}}],["проксирования",{"2":{"64":1,"65":2}}],["прокси",{"2":{"4":1,"5":1,"28":1,"40":1,"64":8,"65":6,"66":6,"68":1,"69":2,"108":1}}],["пробегаемся",{"2":{"61":1}}],["пробелы",{"2":{"21":1}}],["пробелами",{"2":{"4":1}}],["проблему",{"2":{"40":1,"97":1,"99":1}}],["проблемам",{"2":{"31":1}}],["проблема",{"2":{"11":1,"36":1,"72":1}}],["проблемы",{"2":{"4":2,"6":1,"19":1,"28":1,"40":2,"41":1,"106":1,"117":1,"118":1}}],["проблем",{"2":{"3":1,"7":1,"28":1,"31":1,"37":1,"71":1,"76":1}}],["протестированы",{"2":{"69":1}}],["протестировать",{"2":{"3":1}}],["противном",{"2":{"56":1}}],["противоположную",{"2":{"40":1}}],["протяжении",{"2":{"9":1}}],["протоколу",{"2":{"98":1,"99":1}}],["протоколирования",{"2":{"66":1}}],["протоколам",{"2":{"6":1}}],["протоколы",{"0":{"5":1},"2":{"5":1,"117":1}}],["протоколом",{"2":{"4":1}}],["проводить",{"2":{"108":1}}],["провести",{"2":{"7":1}}],["проверенная",{"2":{"139":1}}],["проверенных",{"2":{"138":1}}],["проверенное",{"2":{"7":1,"40":1}}],["проверено",{"2":{"118":1}}],["проверьте",{"2":{"118":1}}],["проверить",{"2":{"71":1,"117":1}}],["проверив",{"2":{"2":1}}],["проверка",{"2":{"64":1,"106":3}}],["проверку",{"2":{"56":1,"65":1}}],["проверки",{"0":{"27":1,"74":1}}],["проверяем",{"2":{"50":1,"57":1,"61":1,"65":1,"72":1}}],["проверяет",{"2":{"2":2,"97":1,"103":1}}],["проверять",{"2":{"2":1,"107":1}}],["провайдеры",{"2":{"98":2}}],["провайдерами",{"2":{"117":1}}],["провайдера",{"2":{"3":1,"109":1}}],["провайдер",{"2":{"3":1}}],["провайдеров",{"2":{"3":1}}],["проще",{"2":{"3":1,"33":1,"105":1,"116":1,"118":1}}],["прослойка",{"2":{"118":1}}],["прослушивания",{"2":{"36":1}}],["просматривать",{"2":{"36":1}}],["просмотреть",{"2":{"27":1}}],["просмотра",{"2":{"11":1}}],["просишь",{"2":{"2":1}}],["пространство",{"2":{"102":1}}],["простейший",{"2":{"66":1}}],["прост",{"2":{"62":1,"70":2}}],["простую",{"2":{"7":1,"71":1}}],["просты",{"2":{"118":1}}],["простые",{"2":{"38":1,"67":1,"68":1,"71":1,"105":1}}],["простых",{"2":{"6":2,"118":1}}],["простым",{"0":{"38":1},"2":{"1":1,"28":1,"38":1,"66":1,"69":1}}],["простор",{"2":{"40":1}}],["простота",{"2":{"38":1}}],["простому",{"2":{"95":1}}],["простом",{"2":{"19":1,"64":1,"67":1,"108":1}}],["простое",{"2":{"9":1,"51":1,"118":1}}],["простого",{"2":{"6":1,"64":1}}],["просто",{"2":{"2":1,"11":1,"18":1,"39":1,"51":1,"56":2,"57":1,"61":1,"65":1,"66":1,"71":1,"98":1,"105":1,"106":2,"109":1,"116":1,"117":1}}],["простой",{"2":{"2":1,"8":1,"31":1,"49":1,"57":1,"60":1,"61":1,"65":1,"66":1,"69":1,"72":1,"76":1,"90":1,"117":1}}],["приблизить",{"2":{"118":1}}],["пригодится",{"2":{"117":1}}],["пригодиться",{"2":{"103":1}}],["приятней",{"2":{"116":1}}],["приятно",{"2":{"11":1}}],["признательность",{"2":{"80":1}}],["придумали",{"2":{"118":1}}],["придумать",{"2":{"74":1}}],["придерживаются",{"2":{"116":1}}],["придерживаться",{"2":{"7":1,"70":1,"117":1}}],["придется",{"2":{"7":1,"39":1,"50":1}}],["причины",{"2":{"64":1,"116":1}}],["причин",{"2":{"64":1}}],["причем",{"2":{"64":1,"70":2,"117":2}}],["причудливо",{"2":{"7":1}}],["приемник",{"2":{"63":1}}],["приемники",{"2":{"62":1}}],["приемнику",{"2":{"62":1}}],["привязывайтесь",{"2":{"113":1}}],["привязана",{"2":{"106":1}}],["приводятся",{"2":{"84":1}}],["приводят",{"2":{"70":1}}],["приводится",{"2":{"40":1}}],["приватному",{"2":{"56":2}}],["привычным",{"2":{"50":1}}],["привычными",{"2":{"39":1}}],["приветствуется",{"2":{"137":1}}],["приведет",{"2":{"70":1}}],["приведем",{"2":{"31":1,"55":1}}],["приведенный",{"2":{"53":1,"61":1}}],["приведенные",{"2":{"20":1}}],["приведен",{"2":{"4":1,"36":1,"58":1}}],["привести",{"2":{"11":1,"32":1,"33":1,"74":1}}],["привел",{"2":{"19":1}}],["привели",{"2":{"11":2,"73":1}}],["привело",{"2":{"6":1}}],["прикрепляем",{"2":{"36":1}}],["прикладного",{"2":{"34":1}}],["природе",{"2":{"20":1,"72":1}}],["присутствует",{"2":{"106":1}}],["пристальное",{"2":{"78":1}}],["приспособленным",{"2":{"76":1}}],["присоединяет",{"2":{"62":1}}],["присоединении",{"2":{"17":1}}],["присвоение",{"2":{"56":2}}],["присвоить",{"2":{"53":1,"54":1,"65":1}}],["присваивание",{"2":{"65":1}}],["присваивая",{"2":{"56":1,"65":1}}],["присваиваем",{"2":{"55":1,"56":1,"57":1,"65":1}}],["присваивает",{"2":{"17":1}}],["присваивается",{"2":{"7":1,"17":1}}],["примитивах",{"2":{"105":1}}],["примитивов",{"2":{"105":1}}],["примитивные",{"2":{"17":1,"106":1}}],["примите",{"2":{"11":1}}],["примет",{"2":{"7":1}}],["применить",{"2":{"67":1}}],["применимы",{"2":{"39":1}}],["применим",{"2":{"32":1,"56":1}}],["применяет",{"2":{"70":1}}],["применяется",{"2":{"2":1,"11":1,"39":1,"70":1}}],["применяться",{"2":{"28":1,"29":1}}],["применять",{"2":{"7":1,"28":1,"38":1,"47":1,"73":1}}],["применения",{"2":{"36":1,"48":1,"97":1}}],["применению",{"2":{"7":1}}],["применение",{"2":{"5":1,"31":1,"39":1,"40":1,"45":1,"73":1}}],["примеры",{"2":{"20":1,"71":1,"73":1,"74":1,"84":1,"91":1,"117":1}}],["примерам",{"2":{"48":1,"78":1}}],["примерами",{"2":{"19":1}}],["примерах",{"2":{"17":1,"45":1,"50":1,"69":1}}],["примера",{"2":{"11":1,"31":1,"33":1,"65":1,"71":1,"72":1}}],["примеров",{"0":{"79":1},"2":{"7":1,"9":1,"11":1,"28":1,"34":1,"76":1,"79":1}}],["примере",{"2":{"7":1,"8":1,"11":1,"19":1,"36":1,"56":1,"60":1,"61":1,"64":2,"65":1,"66":1}}],["примеру",{"2":{"7":1,"51":1}}],["пример",{"2":{"1":2,"4":1,"8":1,"11":1,"16":1,"17":1,"18":1,"19":1,"34":1,"36":1,"53":1,"54":1,"55":1,"57":1,"63":1,"64":1,"65":1,"66":3,"70":2,"72":2,"74":1,"97":2}}],["примерно",{"2":{"1":1,"59":1,"106":1,"118":1}}],["приходила",{"2":{"118":1}}],["приходится",{"2":{"11":2,"15":1,"103":1}}],["приходя",{"2":{"109":1}}],["приходятся",{"2":{"106":1,"108":1}}],["приходящих",{"2":{"5":1}}],["принести",{"2":{"106":1}}],["принадлежат",{"2":{"106":1}}],["принадлежит",{"2":{"37":1}}],["принимает",{"2":{"57":1}}],["принимают",{"2":{"34":1}}],["принимающий",{"2":{"4":1}}],["принимать",{"2":{"28":1}}],["принять",{"2":{"66":1}}],["принято",{"2":{"9":1,"60":1}}],["приняты",{"2":{"6":1}}],["принципе",{"2":{"39":1,"108":1}}],["принципом",{"2":{"37":1,"74":1}}],["принципов",{"0":{"30":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1},"2":{"26":1,"28":2,"29":1,"39":1,"76":1}}],["принципу",{"2":{"34":1}}],["принципах",{"2":{"77":1}}],["принципами",{"2":{"31":1}}],["принципа",{"2":{"31":1,"33":1,"36":2,"39":1,"60":1}}],["принципы",{"0":{"28":1,"29":1,"84":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"28":2,"29":2,"30":2,"39":1,"73":1,"84":1}}],["принцип",{"0":{"33":1},"2":{"4":1,"31":3,"32":3,"33":2,"34":2,"36":1,"37":1,"38":3,"39":2,"55":1,"61":1}}],["приложению",{"2":{"10":1,"106":1,"109":1}}],["приложении",{"0":{"8":1},"1":{"9":1},"2":{"7":1,"8":1,"11":1,"37":2,"40":1,"46":1,"56":1,"57":1,"63":1,"89":1,"94":1,"99":2,"106":3,"118":1}}],["приложением",{"2":{"8":1,"76":1,"118":1,"138":2}}],["приложение",{"0":{"94":1},"2":{"3":2,"6":1,"7":4,"8":3,"9":2,"10":2,"31":1,"66":1,"70":1,"92":1,"99":1,"109":1,"116":1,"117":1,"118":3}}],["приложений",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"2":1,"6":2,"7":5,"9":2,"28":2,"34":1,"37":1,"73":1,"77":2,"78":1,"87":1,"118":1}}],["приложениях",{"2":{"41":1,"45":2,"72":1}}],["приложениями",{"2":{"6":1,"40":1}}],["приложения",{"0":{"87":1,"88":1,"92":1,"99":1,"102":1},"1":{"100":1,"101":1},"2":{"1":1,"5":1,"6":2,"7":6,"8":5,"9":4,"10":1,"18":1,"19":1,"31":2,"33":1,"36":2,"37":2,"38":1,"43":1,"44":1,"47":1,"56":1,"64":2,"69":1,"73":1,"76":1,"86":2,"89":1,"90":1,"97":1,"99":2,"102":3,"105":1,"107":1,"108":1,"109":4,"110":1,"118":4,"138":1}}],["при",{"2":{"2":3,"3":1,"4":2,"5":1,"6":1,"7":6,"8":1,"9":2,"11":1,"13":2,"15":2,"17":1,"19":3,"25":1,"27":1,"28":1,"29":1,"34":1,"40":2,"50":2,"60":1,"64":1,"66":3,"69":1,"70":1,"71":2,"72":1,"73":1,"77":1,"97":4,"99":2,"103":2,"107":2,"108":3,"116":1,"117":1,"118":8,"138":2}}],["геттеров",{"2":{"106":1}}],["генерации",{"2":{"118":1}}],["генерация",{"2":{"102":1,"118":1}}],["генерируется",{"2":{"118":1}}],["генерировать",{"2":{"97":1}}],["генерить",{"2":{"118":1}}],["генерит",{"2":{"2":2}}],["гарагусо",{"2":{"80":1}}],["глоссарий",{"0":{"138":1}}],["глобален",{"2":{"106":1}}],["глобальный",{"2":{"106":1}}],["глобальным",{"2":{"106":2,"109":1}}],["глобальными",{"2":{"106":1}}],["глобальное",{"2":{"106":1}}],["глобальному",{"2":{"47":1}}],["глобальная",{"2":{"8":1}}],["глючит",{"2":{"103":1}}],["глубокого",{"2":{"72":1}}],["глазах",{"2":{"65":1}}],["гласит",{"2":{"32":1,"33":1,"39":1}}],["глава",{"0":{"81":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":2},"2":{"28":1,"40":1,"73":1,"86":1,"87":1,"89":1,"90":1,"93":1}}],["главах",{"2":{"7":1,"69":1}}],["главой",{"2":{"28":1}}],["главу",{"2":{"27":1,"30":1}}],["главным",{"2":{"36":1,"109":1,"117":1}}],["главных",{"2":{"10":1}}],["главного",{"2":{"9":1,"63":1}}],["главы",{"2":{"6":1,"27":1}}],["главе",{"2":{"6":1,"9":1,"10":3,"11":2,"17":1,"26":2,"28":1,"31":1,"32":1,"36":1,"37":1,"51":1,"58":2,"61":2,"63":1,"64":1,"66":1,"67":1,"69":1,"73":2,"83":1,"84":1,"85":2,"88":1,"91":2,"92":1}}],["гибки",{"2":{"108":1}}],["гибкость",{"2":{"5":1,"7":1,"71":1}}],["гибче",{"2":{"106":1}}],["гипертекста",{"2":{"6":1}}],["гуглить",{"2":{"3":2,"117":1}}],["греется",{"2":{"103":1}}],["грамотная",{"2":{"138":1}}],["градусов",{"2":{"65":1}}],["градусах",{"2":{"65":1}}],["градусы",{"2":{"64":2,"66":1}}],["графически",{"2":{"64":1,"66":1}}],["графическая",{"2":{"62":1}}],["графическое",{"2":{"31":1,"33":1,"60":1,"62":1}}],["границы",{"2":{"66":1}}],["границах",{"2":{"7":1}}],["гранулировано",{"2":{"2":1}}],["громоздким",{"2":{"19":1}}],["группах",{"2":{"39":1}}],["групповой",{"2":{"39":1}}],["группировки",{"2":{"36":1}}],["грузить",{"2":{"3":1,"118":1}}],["грубое",{"2":{"31":1}}],["грубо",{"2":{"2":1,"4":1,"109":1}}],["где",{"2":{"2":1,"3":1,"7":1,"8":1,"10":1,"11":1,"38":1,"63":1,"98":1,"106":1,"107":1,"108":2,"112":1}}],["гостинице",{"2":{"118":1}}],["гостей",{"2":{"2":1}}],["готовности",{"2":{"88":2}}],["готова",{"2":{"55":1}}],["готовым",{"2":{"103":1}}],["готовые",{"2":{"61":1}}],["готовы",{"2":{"19":1,"26":1,"27":1}}],["готовых",{"2":{"18":1}}],["годы",{"2":{"105":1}}],["год",{"2":{"39":1,"98":1}}],["года",{"2":{"117":1,"139":1}}],["годах",{"2":{"38":1}}],["годами",{"2":{"28":1}}],["гораздо",{"2":{"31":1,"45":1,"71":1}}],["говорит",{"2":{"109":1}}],["говорилось",{"2":{"25":1}}],["говорил",{"2":{"11":1,"61":1}}],["говорю",{"2":{"65":1,"71":1}}],["говоря",{"2":{"2":1,"4":1,"33":1,"108":1,"109":1,"118":1}}],["чуть",{"2":{"118":1}}],["чужих",{"2":{"116":1}}],["чужие",{"2":{"69":1}}],["чрезвычайно",{"2":{"50":1,"69":1}}],["чрезмерного",{"2":{"38":1}}],["читаемая",{"2":{"117":1}}],["читаемым",{"2":{"25":1,"39":1}}],["читать",{"2":{"117":1}}],["чисел",{"2":{"72":3,"105":1}}],["число",{"2":{"109":1}}],["числом",{"2":{"71":2}}],["числе",{"2":{"71":1}}],["числа",{"2":{"8":1,"17":1,"70":1}}],["чистом",{"2":{"116":1}}],["чистоте",{"2":{"39":1}}],["чистый",{"2":{"32":1,"55":1,"113":1}}],["чистым",{"2":{"28":1,"39":1}}],["чистая",{"2":{"17":1}}],["чате",{"2":{"139":1}}],["чаще",{"2":{"13":1,"18":1,"28":1,"37":1,"39":1,"41":1}}],["частями",{"2":{"62":1}}],["частях",{"2":{"28":1,"73":2}}],["частей",{"2":{"38":1,"69":1}}],["часто",{"2":{"7":2,"11":1,"12":1,"15":2,"19":1,"27":1,"28":1,"34":1,"40":5,"48":1,"50":2,"60":1,"62":1,"64":1,"77":1,"99":1,"105":1,"118":1,"139":2}}],["частью",{"2":{"8":1,"14":1,"36":1,"39":1,"40":1,"69":1,"71":1,"106":1}}],["часть",{"2":{"5":2,"7":1,"10":1,"28":1,"36":1,"103":1,"105":1}}],["частично",{"2":{"106":3,"108":2}}],["частичной",{"2":{"64":1}}],["частичном",{"2":{"64":1}}],["части",{"2":{"2":1,"28":1,"31":4,"38":1,"51":1,"66":2,"117":1}}],["чтения",{"2":{"11":2,"36":1}}],["чтобы",{"0":{"78":1},"2":{"2":1,"8":2,"10":2,"11":4,"14":1,"18":1,"19":1,"25":2,"27":2,"32":1,"39":1,"49":1,"50":3,"52":1,"57":2,"61":3,"62":1,"64":1,"65":1,"66":1,"67":1,"69":2,"71":3,"73":1,"93":1,"97":1,"98":2,"99":1,"102":2,"106":1,"108":2,"117":2,"118":5}}],["что",{"0":{"40":1,"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"2":8,"3":2,"4":1,"5":2,"7":14,"8":3,"9":5,"10":6,"11":12,"14":2,"15":2,"16":1,"17":1,"18":2,"19":1,"27":2,"28":1,"31":2,"32":1,"33":3,"34":1,"36":6,"37":2,"39":3,"40":2,"45":1,"46":1,"47":1,"49":2,"50":2,"51":3,"53":2,"55":1,"56":4,"58":3,"59":1,"60":1,"61":1,"63":1,"64":8,"65":4,"66":10,"68":2,"69":2,"70":2,"71":3,"72":10,"73":1,"74":1,"78":1,"83":1,"95":1,"97":3,"99":1,"102":2,"105":1,"106":13,"107":3,"108":3,"109":4,"110":1,"116":3,"117":4,"118":4}}],["члену",{"2":{"65":1}}],["членов",{"2":{"11":1}}],["членам",{"2":{"11":1}}],["член",{"2":{"11":1}}],["чего",{"2":{"105":1,"106":1,"108":1}}],["черед",{"2":{"69":1}}],["через",{"2":{"1":1,"2":5,"3":1,"5":1,"37":1,"39":1,"46":1,"47":1,"49":1,"51":1,"59":2,"61":1,"97":1,"99":1,"102":1,"103":1,"105":2,"106":1,"116":1}}],["черные",{"2":{"34":1}}],["черты",{"2":{"32":1}}],["человеческий",{"2":{"31":1}}],["человек",{"2":{"30":1,"39":1,"103":1,"117":2}}],["человекоемкой",{"2":{"28":1}}],["четко",{"2":{"10":1,"34":1}}],["четкое",{"2":{"6":1}}],["четкость",{"2":{"5":1}}],["четыре",{"2":{"2":1}}],["чем",{"2":{"1":1,"7":1,"11":1,"18":1,"27":1,"38":2,"40":1,"56":1,"71":2,"72":1,"74":1,"98":1,"102":2,"106":1,"108":1,"113":1,"116":1}}],["аудио",{"2":{"99":1}}],["аутентификацию",{"2":{"3":1}}],["аутентификацией",{"2":{"2":1}}],["аутентификации",{"2":{"2":1,"106":1,"138":2}}],["аутентификация",{"0":{"2":1},"2":{"2":5}}],["апгрейд",{"2":{"118":1}}],["апдейта",{"2":{"97":1}}],["аппаратному",{"2":{"78":1}}],["аппаратное",{"2":{"78":1}}],["аппаратного",{"2":{"70":1}}],["апплеты",{"2":{"6":1}}],["аспекте",{"2":{"107":1,"108":1}}],["аспекты",{"2":{"83":1}}],["асинхронная",{"2":{"71":1}}],["асинхронное",{"2":{"74":1}}],["асинхронном",{"2":{"72":1}}],["асинхронной",{"2":{"70":1,"71":1}}],["асинхронного",{"2":{"62":1}}],["асинхронным",{"2":{"72":1}}],["асинхронными",{"2":{"45":1,"72":1}}],["асинхронных",{"2":{"69":1,"70":2,"71":1}}],["асинхронные",{"0":{"45":1},"2":{"19":1,"70":2}}],["асинхронную",{"2":{"37":1,"70":1,"71":1}}],["алиаса",{"2":{"102":1}}],["алиасы",{"2":{"102":1}}],["алиас",{"2":{"102":2}}],["алгоритмы",{"2":{"38":1}}],["алгоритм",{"2":{"36":1}}],["альтернативной",{"2":{"56":1}}],["альтернативный",{"2":{"11":1}}],["альтернативой",{"2":{"33":1}}],["альтернатива",{"2":{"3":1,"64":1}}],["аргумента",{"2":{"8":1,"57":1,"65":1}}],["архитектура",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"109":4,"138":1}}],["архитектур",{"2":{"76":1}}],["архитектуры",{"2":{"29":1,"31":1,"41":1,"78":1,"84":2,"90":1}}],["архитектурно",{"2":{"106":1}}],["архитектурной",{"2":{"105":1}}],["архитектурный",{"2":{"31":1}}],["архитектурными",{"2":{"7":1}}],["архитектурная",{"2":{"7":1}}],["архитектурой",{"2":{"7":1}}],["азы",{"2":{"7":1}}],["автоматизацией",{"2":{"117":1}}],["автоматизации",{"2":{"95":1,"97":2}}],["автоматического",{"2":{"7":1,"97":1}}],["автоматически",{"2":{"6":1,"7":1,"11":1,"64":1,"65":1,"66":1,"97":1,"108":1}}],["автономным",{"2":{"76":1}}],["автономного",{"2":{"8":1}}],["автор",{"2":{"75":1}}],["авторство",{"2":{"37":1}}],["авторизационный",{"2":{"2":1}}],["авторизация",{"0":{"2":1},"2":{"2":4}}],["аналогу",{"2":{"118":1}}],["аналогов",{"2":{"108":1}}],["аналогом",{"2":{"106":1}}],["аналогией",{"2":{"109":1}}],["аналогичный",{"2":{"117":1}}],["аналогичные",{"2":{"106":1}}],["аналогичен",{"2":{"39":1}}],["аналоги",{"2":{"106":1}}],["аналог",{"2":{"106":1}}],["антипаттерны",{"2":{"40":1}}],["антипаттерном",{"2":{"40":1}}],["анимации",{"2":{"19":3}}],["анимацию",{"2":{"6":1,"118":1}}],["английского",{"2":{"117":1}}],["английском",{"2":{"117":2}}],["англ",{"2":{"4":1}}],["актуальность",{"2":{"139":1}}],["актуален",{"2":{"11":1}}],["активно",{"2":{"108":1}}],["аккуратней",{"2":{"107":1}}],["аккаунта",{"2":{"109":1}}],["аккаунт",{"2":{"2":1}}],["аккаунтом",{"2":{"2":1}}],["академическое",{"2":{"56":1}}],["академических",{"2":{"6":1}}],["абы",{"2":{"5":1}}],["абсолютно",{"2":{"117":1}}],["абсолютном",{"2":{"3":1}}],["абстрагированный",{"2":{"40":1}}],["абстрагирование",{"2":{"1":1,"37":1}}],["абстрагировать",{"2":{"37":1}}],["абстракции",{"2":{"28":1,"51":1}}],["абстракция",{"0":{"0":1},"1":{"1":1},"2":{"31":1}}],["абстрактны",{"2":{"26":1}}],["абстрактное",{"2":{"25":1}}],["адаптивноcти",{"2":{"113":1}}],["адаптивность",{"2":{"109":1,"116":1}}],["адаптировать",{"2":{"38":1}}],["адаптации",{"2":{"40":1}}],["адаптацию",{"2":{"33":1}}],["адрес",{"2":{"13":1}}],["адресу",{"2":{"4":1,"79":1}}],["админ",{"2":{"2":1}}],["админке",{"2":{"2":1}}],["атомарного",{"2":{"31":1}}],["аттрибутах",{"2":{"116":1}}],["аттрибут",{"2":{"8":1}}],["атрибута",{"2":{"13":1,"14":1,"16":1,"56":1}}],["атрибуту",{"2":{"11":1,"56":2}}],["атрибуты",{"2":{"11":1,"12":1,"29":1}}],["атрибут",{"2":{"7":2,"10":3,"11":1,"13":1,"16":2,"67":1,"68":1}}],["ат",{"2":{"2":2}}],["а",{"2":{"2":2,"3":1,"4":2,"7":4,"8":1,"9":1,"10":1,"11":4,"18":1,"19":1,"21":1,"31":2,"32":1,"36":3,"39":1,"40":2,"45":1,"50":3,"51":2,"55":1,"60":1,"62":1,"63":1,"64":3,"66":1,"67":1,"68":1,"69":1,"71":1,"76":1,"88":1,"91":2,"105":2,"106":5,"108":1,"109":1,"111":1,"117":4,"118":5}}],["мнение",{"2":{"139":1}}],["множественного",{"2":{"105":1}}],["множество",{"2":{"32":1,"41":1,"48":1,"53":1,"103":2,"108":1,"118":1}}],["множества",{"2":{"31":1}}],["многим",{"2":{"39":1}}],["многие",{"2":{"36":1,"98":1,"103":1,"109":1,"117":1}}],["многих",{"2":{"25":1,"33":1}}],["многолетним",{"2":{"118":1}}],["многопоточной",{"2":{"108":1}}],["многопоточности",{"2":{"90":1}}],["многопоточность",{"0":{"90":1},"2":{"37":1,"40":1,"63":1,"69":1}}],["многопоточным",{"2":{"76":1}}],["многочисленные",{"2":{"47":1}}],["многого",{"2":{"37":1}}],["многоцелевые",{"2":{"33":1}}],["многословным",{"2":{"72":1}}],["многословно",{"2":{"64":1,"72":1}}],["многословность",{"2":{"11":1}}],["многословной",{"2":{"11":1}}],["многословен",{"2":{"11":1,"72":1}}],["многом",{"2":{"8":1,"28":1}}],["многое",{"2":{"7":1}}],["многократно",{"2":{"7":1,"9":1}}],["много",{"2":{"2":1,"3":1,"4":1,"31":1,"33":1,"64":1,"99":1,"103":1,"104":1,"105":1,"108":1}}],["мучается",{"2":{"113":1}}],["мутировать",{"2":{"33":1}}],["мусора",{"2":{"36":1}}],["мусор",{"2":{"19":1}}],["миру",{"2":{"118":1}}],["мир",{"2":{"116":1}}],["мире",{"2":{"9":1,"66":1,"78":1}}],["мидл",{"2":{"109":1}}],["микрософт",{"2":{"118":1}}],["микросервисов",{"2":{"109":1}}],["микросервиса",{"2":{"108":1}}],["микро",{"2":{"103":1}}],["миксинов",{"2":{"11":1}}],["миксины",{"2":{"11":2,"105":4}}],["миграция",{"0":{"94":1},"2":{"11":1}}],["миграции",{"2":{"11":1,"94":1}}],["минут",{"2":{"117":1}}],["минусы",{"2":{"116":2}}],["минуя",{"2":{"7":1}}],["минисервере",{"2":{"103":1}}],["мини",{"2":{"103":2}}],["минимальной",{"2":{"57":1}}],["минимум",{"2":{"33":1,"64":1,"103":1,"106":1,"115":1,"117":2}}],["миниатюре",{"2":{"3":1}}],["мыслить",{"2":{"109":1}}],["мыслит",{"2":{"28":1}}],["мышку",{"2":{"103":1}}],["мыши",{"2":{"18":1}}],["мышления",{"2":{"7":1}}],["мы",{"2":{"6":3,"7":2,"8":11,"9":4,"10":13,"11":14,"12":1,"13":1,"17":3,"18":8,"19":3,"20":1,"25":1,"26":3,"28":1,"31":4,"32":1,"34":1,"36":4,"37":2,"40":3,"41":1,"50":5,"51":1,"52":1,"55":1,"56":7,"57":6,"58":2,"59":1,"61":8,"63":3,"64":2,"65":15,"66":5,"67":4,"68":5,"69":6,"70":2,"71":6,"72":11,"73":5,"85":1,"91":1,"97":2,"109":5}}],["мае",{"2":{"117":1}}],["маршрутизатор",{"2":{"87":1}}],["маршрутизации",{"2":{"63":1}}],["максимальную",{"0":{"78":1},"2":{"78":1}}],["максимально",{"2":{"28":1,"116":1,"118":1}}],["материала",{"2":{"58":1}}],["манифест",{"2":{"118":3}}],["манипулирования",{"2":{"6":1,"15":1}}],["манипуляции",{"2":{"2":1}}],["манере",{"2":{"25":1}}],["магические",{"2":{"105":1}}],["магия",{"2":{"17":1}}],["магию",{"2":{"10":1}}],["магазине",{"2":{"118":1}}],["магазина",{"2":{"109":1}}],["магазин",{"2":{"2":1}}],["маске",{"2":{"100":1}}],["маска",{"2":{"4":2}}],["массива",{"2":{"105":3,"108":1,"117":1}}],["массиву",{"2":{"61":1}}],["массив",{"2":{"61":2,"62":1,"105":3,"108":1}}],["массивы",{"2":{"17":1}}],["массиве",{"2":{"16":1}}],["масштабируемых",{"2":{"108":1}}],["масштабирования",{"2":{"7":1}}],["масштабе",{"2":{"63":1}}],["масштабах",{"2":{"15":1}}],["маленького",{"2":{"99":1}}],["маленьких",{"2":{"9":1,"31":1}}],["маленький",{"2":{"2":1}}],["малого",{"2":{"7":2}}],["машины",{"2":{"103":1}}],["машине",{"2":{"63":1}}],["машин",{"2":{"6":1}}],["метрике",{"2":{"118":1}}],["метрики",{"2":{"118":1}}],["методом",{"2":{"118":1}}],["методов",{"2":{"56":1,"58":1,"105":1}}],["методу",{"2":{"72":1}}],["метода",{"2":{"48":1,"61":1,"66":1,"118":1}}],["методами",{"2":{"72":1,"117":1}}],["методам",{"2":{"11":1}}],["методе",{"2":{"11":1,"50":1}}],["методы",{"0":{"24":1},"2":{"4":1,"6":1,"8":1,"9":1,"34":1,"36":1,"50":1,"61":1,"64":1,"72":1,"106":1}}],["метод",{"0":{"49":1,"50":1},"2":{"2":1,"8":3,"11":1,"33":1,"50":3,"56":2,"59":2,"61":3,"63":1,"72":3}}],["медленней",{"2":{"106":1}}],["механизмы",{"2":{"106":1}}],["межпроцессные",{"2":{"72":1}}],["межстрочные",{"2":{"39":1}}],["между",{"2":{"4":1,"6":3,"7":3,"10":1,"11":2,"27":1,"37":1,"40":1,"43":1,"44":1,"58":1,"60":1,"63":1,"64":1,"65":1,"66":1,"69":1,"74":2,"89":1,"93":1,"103":1,"106":2,"117":1,"118":1}}],["мелких",{"2":{"38":1,"106":1}}],["мелкие",{"2":{"31":1}}],["мельчайшей",{"2":{"31":1}}],["мест",{"2":{"118":1}}],["места",{"2":{"105":1}}],["месте",{"2":{"10":1,"37":1,"58":1,"108":1}}],["место",{"2":{"6":1,"19":1,"108":1}}],["мере",{"2":{"6":2,"9":1,"11":2,"18":1,"26":1,"34":1,"53":1,"57":1,"65":1,"70":1,"73":1,"78":1}}],["меры",{"2":{"2":1}}],["ментор",{"2":{"117":2}}],["меню",{"2":{"109":1}}],["менее",{"2":{"65":1,"69":1,"70":1,"72":1,"118":1}}],["менеджера",{"2":{"97":1}}],["менеджер",{"2":{"2":3}}],["меньше",{"2":{"39":1,"108":1}}],["меньший",{"2":{"11":1,"108":1}}],["меняем",{"2":{"109":1}}],["меняете",{"2":{"106":1}}],["меняет",{"2":{"11":1}}],["меняется",{"2":{"1":1}}],["меняться",{"2":{"105":1}}],["менять",{"2":{"99":1}}],["меняющими",{"2":{"15":1}}],["меняются",{"2":{"16":1,"105":1}}],["меняют",{"2":{"7":1}}],["мобильное",{"2":{"118":1}}],["морган",{"2":{"117":1}}],["морскими",{"2":{"38":1}}],["мощь",{"2":{"109":1}}],["мощным",{"2":{"71":1}}],["мощных",{"2":{"6":1}}],["мощная",{"2":{"7":1}}],["мощности",{"2":{"6":1}}],["моем",{"2":{"102":1}}],["моему",{"2":{"33":1,"41":1}}],["мой",{"2":{"40":1}}],["монитора",{"2":{"103":1}}],["монитор",{"2":{"103":1}}],["мониторингом",{"2":{"2":1}}],["монтируется",{"2":{"36":1}}],["монтирования",{"2":{"36":1}}],["монолитных",{"2":{"33":1}}],["моменты",{"2":{"117":1,"139":1}}],["моментов",{"2":{"107":1}}],["момент",{"2":{"19":1,"30":1,"55":1,"56":1,"105":1,"118":1}}],["могущие",{"2":{"139":1}}],["могут",{"2":{"4":2,"6":1,"7":2,"11":1,"15":1,"19":1,"29":2,"58":1,"62":1,"66":1,"73":1,"76":1,"78":1,"99":1,"103":1,"108":2,"109":1,"110":1,"117":1}}],["могли",{"2":{"56":2,"65":1}}],["мог",{"2":{"10":1,"118":1}}],["модифицирует",{"2":{"67":1}}],["модификаций",{"2":{"71":1}}],["модификации",{"2":{"14":1}}],["модификатор",{"2":{"10":1}}],["модуля",{"2":{"106":1}}],["модуле",{"2":{"106":1,"108":1,"109":1}}],["модулей",{"2":{"34":1}}],["модули",{"2":{"33":1,"49":2,"69":1,"106":2,"109":2,"112":1}}],["модульная",{"2":{"109":1}}],["модульными",{"2":{"7":1}}],["модуль",{"2":{"1":2,"10":1,"37":2,"49":2,"58":1,"109":7}}],["моделям",{"2":{"113":1}}],["моделей",{"2":{"25":1}}],["модели",{"2":{"7":1}}],["модель",{"2":{"7":2,"106":2,"108":1,"116":1}}],["мои",{"2":{"5":1}}],["можем",{"2":{"8":1,"10":5,"11":3,"12":1,"17":1,"18":2,"19":1,"31":1,"57":1,"58":1,"65":1,"66":1,"67":1,"71":3}}],["можете",{"2":{"7":5,"9":1,"11":2,"20":1,"25":2,"27":2,"40":1,"49":1,"55":1,"64":2,"71":1,"74":2,"99":1,"137":1}}],["может",{"2":{"2":1,"3":2,"4":1,"5":1,"6":1,"7":4,"9":1,"10":3,"11":3,"14":1,"19":2,"31":1,"32":1,"33":1,"36":2,"37":1,"38":1,"45":1,"46":1,"50":2,"57":1,"60":1,"63":2,"64":4,"66":3,"71":1,"72":2,"78":1,"97":1,"99":1,"102":1,"103":1,"105":1,"106":6,"107":1,"108":3,"110":1,"116":3,"117":1,"118":6}}],["можно",{"2":{"1":1,"2":4,"3":2,"5":1,"7":2,"8":1,"9":3,"18":1,"19":3,"25":1,"31":2,"33":3,"37":1,"40":2,"53":1,"57":1,"61":1,"63":1,"64":1,"66":3,"69":1,"71":2,"72":2,"74":1,"79":1,"80":1,"98":3,"99":1,"103":2,"105":1,"106":3,"108":3,"109":2,"116":1,"117":4,"118":3}}],["н",{"2":{"117":1}}],["нём",{"2":{"113":1}}],["нулей",{"2":{"69":1}}],["нуля",{"2":{"7":1,"73":1}}],["ну",{"2":{"69":1}}],["нужен",{"2":{"57":1,"97":1,"102":1,"106":2,"117":2,"118":1}}],["нужный",{"2":{"107":1}}],["нужны",{"2":{"105":1,"109":1,"118":1}}],["нужных",{"2":{"105":1}}],["нужные",{"2":{"3":1,"85":1}}],["нужную",{"2":{"58":1}}],["нужна",{"2":{"5":1,"7":1,"32":1,"36":1,"101":1,"105":1,"110":1}}],["нужное",{"2":{"97":1}}],["нужно",{"2":{"2":2,"7":1,"8":1,"9":1,"11":2,"15":1,"19":1,"33":1,"56":1,"61":1,"64":1,"72":1,"97":1,"99":2,"102":2,"105":1,"106":2,"107":2,"109":1,"116":1,"117":1,"118":2}}],["нюансов",{"2":{"4":1}}],["ним",{"2":{"69":1,"73":1,"113":1,"117":1,"118":1}}],["ними",{"2":{"2":1,"7":2,"10":1,"66":1,"73":1}}],["низком",{"2":{"64":1}}],["нижнем",{"2":{"21":1}}],["ниже",{"2":{"4":1,"137":1}}],["ни",{"2":{"11":1,"45":1,"56":1}}],["ничего",{"2":{"9":1,"11":1,"117":1}}],["них",{"2":{"6":1,"7":1,"11":2,"12":1,"19":1,"31":1,"32":1,"39":1,"45":1,"50":1,"60":1,"61":1,"62":1,"66":1,"69":1,"72":1,"84":1,"102":1,"105":1,"107":1,"109":1,"111":1}}],["никакой",{"2":{"106":1,"118":1}}],["никаких",{"2":{"5":1}}],["никогда",{"2":{"5":1,"117":1}}],["нормально",{"2":{"118":1}}],["нормальный",{"2":{"52":1}}],["номер",{"2":{"118":1}}],["ноут",{"2":{"103":1}}],["нотацию",{"2":{"12":1}}],["новую",{"2":{"110":1}}],["новички",{"2":{"78":1}}],["новичка",{"2":{"5":1}}],["новая",{"2":{"71":1,"118":1}}],["нововведением",{"2":{"106":1}}],["новостей",{"2":{"106":1}}],["новостных",{"2":{"106":1}}],["новой",{"2":{"64":1,"97":1,"116":1}}],["нового",{"2":{"11":1,"108":1,"137":1}}],["новое",{"0":{"123":1,"126":1,"129":1},"2":{"7":1,"72":1,"97":1}}],["новых",{"2":{"76":1,"97":1}}],["новым",{"2":{"11":1,"72":1}}],["новый",{"2":{"10":1,"11":1,"19":2,"50":1,"77":1,"102":1,"110":1}}],["новые",{"2":{"6":3,"76":1,"103":1,"108":1,"117":1}}],["но",{"2":{"2":3,"3":3,"5":1,"6":1,"7":6,"8":1,"9":1,"10":3,"11":9,"14":1,"15":1,"17":1,"18":1,"19":2,"20":1,"25":1,"28":1,"33":2,"34":1,"37":2,"39":2,"55":1,"56":3,"58":2,"61":1,"64":5,"66":3,"68":1,"69":2,"70":2,"71":3,"72":3,"73":1,"78":1,"95":1,"97":1,"99":1,"103":1,"105":2,"106":2,"107":1,"108":5,"109":2,"110":2,"117":4,"118":4}}],["неэффективным",{"2":{"118":1}}],["нельзя",{"2":{"108":1}}],["нелогично",{"2":{"106":1}}],["нечто",{"2":{"106":1}}],["неудобно",{"2":{"99":1}}],["неудачи",{"2":{"72":2}}],["неудачное",{"2":{"106":1}}],["неудачного",{"2":{"72":1}}],["неудачные",{"2":{"71":1}}],["неудачным",{"2":{"70":1}}],["неудача",{"2":{"70":1}}],["некий",{"2":{"64":1,"118":1}}],["некую",{"2":{"62":1}}],["некоего",{"2":{"106":1}}],["некотором",{"2":{"106":1}}],["некоторой",{"2":{"62":1,"63":1}}],["некоторое",{"2":{"11":2,"45":1}}],["некоторыми",{"2":{"40":1}}],["некоторых",{"2":{"19":1,"34":1,"45":1,"48":1,"58":1}}],["некоторые",{"2":{"6":1,"7":3,"11":2,"29":1,"36":1,"39":1,"60":1,"61":1,"69":1,"118":1}}],["некоторую",{"2":{"3":1}}],["некой",{"2":{"2":1}}],["независимы",{"2":{"106":1}}],["независимо",{"2":{"40":1,"109":1}}],["незаслужено",{"2":{"2":1}}],["неочевидные",{"2":{"139":1}}],["необычными",{"2":{"76":1}}],["необходимую",{"2":{"118":1}}],["необходимый",{"2":{"117":1}}],["необходимых",{"2":{"85":1}}],["необходимыми",{"2":{"62":1}}],["необходимые",{"0":{"35":1},"2":{"85":1,"92":1,"103":1}}],["необходим",{"2":{"61":1,"98":1}}],["необходимой",{"2":{"61":1,"62":1}}],["необходимость",{"2":{"40":1}}],["необходимости",{"2":{"7":2,"11":1,"57":1,"66":2,"97":1,"99":1}}],["необходимо",{"2":{"6":1,"7":3,"11":3,"19":1,"32":1,"33":1,"36":2,"47":2,"50":1,"61":1,"63":1,"64":6,"67":1,"69":1,"70":2,"72":1}}],["неоптимизированных",{"2":{"118":1}}],["неопределенных",{"2":{"72":1}}],["неопределенном",{"2":{"72":1}}],["неопределено",{"2":{"72":2}}],["неопределена",{"2":{"70":1}}],["неопытный",{"2":{"39":1}}],["неотъемлемой",{"2":{"69":1}}],["неоднократно",{"2":{"59":1,"69":1}}],["негативных",{"2":{"37":1}}],["него",{"2":{"4":1,"19":1,"39":1,"50":1,"101":1,"103":1,"106":2}}],["нерационального",{"2":{"36":1}}],["нереактивные",{"2":{"11":1}}],["ненужную",{"2":{"38":1}}],["ненужной",{"2":{"106":1}}],["ненужного",{"2":{"38":1}}],["ненужному",{"2":{"33":1}}],["ненужное",{"2":{"5":1}}],["ненужным",{"2":{"32":1}}],["недорого",{"2":{"98":1}}],["недостаток",{"2":{"71":1}}],["недостатки",{"2":{"11":1}}],["неделимого",{"2":{"31":1}}],["невозможно",{"2":{"31":1}}],["неизменным",{"2":{"56":1}}],["неизменяемое",{"2":{"11":1}}],["неиспользуемых",{"2":{"36":1}}],["неисчерпывающими",{"2":{"30":1}}],["нее",{"2":{"11":1,"106":1,"108":1}}],["непрямой",{"2":{"106":1}}],["непрерывная",{"2":{"95":1}}],["неправильном",{"2":{"15":1}}],["неплохой",{"2":{"109":1}}],["неплохо",{"2":{"68":1,"117":1}}],["неплохим",{"2":{"3":1}}],["неполный",{"0":{"30":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1},"2":{"28":1,"41":1}}],["непосредственно",{"2":{"9":1,"32":1,"36":2,"50":1,"64":1,"67":1,"105":1}}],["непустое",{"2":{"14":1}}],["небольшую",{"2":{"118":1}}],["небольшие",{"2":{"38":1}}],["небольших",{"2":{"11":1,"116":1}}],["небольшим",{"2":{"7":1}}],["небольшой",{"2":{"104":1,"118":1}}],["небольшое",{"2":{"8":1,"19":1}}],["небольшого",{"2":{"2":1,"3":1,"8":1}}],["несущественные",{"2":{"124":1}}],["несложных",{"2":{"118":1}}],["несложно",{"2":{"2":1}}],["нестандартные",{"2":{"117":1}}],["несмотря",{"2":{"40":1,"117":1}}],["нескольких",{"2":{"11":1,"28":1,"33":1,"40":1,"102":1,"106":1,"107":1,"108":1}}],["нескольким",{"2":{"4":1,"38":1}}],["несколько",{"2":{"7":1,"8":1,"9":3,"11":1,"18":2,"19":1,"30":1,"33":2,"37":1,"40":1,"60":1,"66":1,"69":1,"71":1,"97":1,"106":2,"109":1,"118":1}}],["несовместимости",{"2":{"6":2}}],["ней",{"2":{"3":2,"61":1,"85":1,"89":1,"90":1,"93":1,"105":1,"106":1,"110":1,"118":1}}],["немножко",{"2":{"118":1}}],["немного",{"2":{"8":1,"26":1,"67":1,"72":1,"108":1,"110":1,"116":1}}],["немодифицированный",{"2":{"64":1}}],["нем",{"2":{"2":2,"4":1,"6":1,"7":1,"66":1,"69":1,"97":2,"98":1,"117":1}}],["нему",{"2":{"2":1,"4":1,"103":1,"106":1}}],["нетривиальная",{"2":{"103":1}}],["нет",{"2":{"2":2,"11":2,"14":1,"27":1,"50":2,"61":1,"66":1,"78":1,"117":2}}],["неё",{"2":{"2":1}}],["не",{"0":{"5":1,"37":1,"81":1},"2":{"1":1,"2":4,"3":4,"4":3,"5":2,"6":2,"7":3,"8":1,"9":2,"10":2,"11":9,"13":1,"14":1,"15":1,"16":1,"18":2,"19":4,"20":1,"25":2,"28":4,"29":2,"31":1,"32":3,"33":1,"34":3,"36":5,"37":3,"38":2,"39":2,"40":1,"45":1,"46":1,"49":1,"50":2,"53":1,"55":5,"56":4,"57":2,"58":2,"61":5,"63":1,"64":4,"65":1,"66":2,"67":1,"69":3,"70":7,"71":4,"72":5,"95":1,"97":1,"99":1,"101":1,"103":7,"105":6,"106":9,"107":1,"108":6,"109":3,"110":5,"111":1,"113":2,"116":1,"117":5,"118":10,"139":1}}],["налету",{"2":{"118":1}}],["наличия",{"2":{"108":1}}],["наличие",{"2":{"55":1,"72":1,"107":1}}],["нагружает",{"2":{"118":1}}],["натянуть",{"2":{"109":1}}],["нативного",{"2":{"108":1,"118":1}}],["нативная",{"2":{"64":1}}],["нативным",{"2":{"118":1}}],["нативными",{"2":{"6":1}}],["нативных",{"2":{"69":2,"118":1}}],["нативные",{"2":{"64":1}}],["находятся",{"2":{"117":1}}],["находят",{"2":{"106":1}}],["находиться",{"2":{"63":1}}],["находить",{"2":{"36":1}}],["находится",{"2":{"19":1,"72":1,"106":1}}],["научиться",{"2":{"76":1}}],["научных",{"2":{"6":1}}],["наименьшими",{"2":{"109":1}}],["наивная",{"2":{"61":1}}],["наивной",{"2":{"60":1,"61":1,"62":1,"64":1}}],["наивную",{"2":{"56":1}}],["наиболее",{"2":{"6":1,"11":1,"12":1,"27":1,"38":1,"40":1,"76":1,"83":1,"91":1,"102":1,"109":1,"139":1}}],["наверное",{"2":{"56":1,"108":1,"118":1}}],["накладывает",{"2":{"39":1,"40":1}}],["наконец",{"2":{"6":2,"8":1,"61":1,"65":1}}],["найдена",{"2":{"57":1}}],["найдены",{"2":{"55":1}}],["найдем",{"2":{"36":1}}],["найти",{"2":{"18":1,"19":1,"31":1}}],["наряду",{"2":{"107":1}}],["нарушает",{"2":{"55":1,"60":1}}],["нарушит",{"2":{"33":1}}],["наращивать",{"2":{"6":1}}],["наблюдать",{"2":{"60":1}}],["наблюдателю",{"2":{"61":1}}],["наблюдателям",{"2":{"60":1,"61":1}}],["наблюдателя",{"2":{"60":1,"64":1}}],["наблюдателей",{"2":{"60":4}}],["наблюдатели",{"2":{"60":3}}],["наблюдатель",{"0":{"60":1},"1":{"61":1},"2":{"60":2,"61":2}}],["наблюдает",{"2":{"60":1}}],["набирают",{"2":{"25":1}}],["набираются",{"2":{"22":1}}],["набору",{"2":{"58":1}}],["наборы",{"2":{"7":1,"9":1}}],["набор",{"2":{"6":1,"20":1,"32":1,"72":1,"98":1}}],["нажмет",{"2":{"19":1}}],["наоборот",{"2":{"11":1}}],["надёжней",{"2":{"103":1}}],["надо",{"2":{"97":1,"98":1,"106":2,"108":3,"109":3,"117":2}}],["надежное",{"2":{"97":1}}],["надежных",{"2":{"77":1,"108":1}}],["надежные",{"2":{"76":1}}],["надежный",{"2":{"2":1}}],["надеюсь",{"2":{"64":1}}],["наделите",{"2":{"33":1}}],["над",{"0":{"32":1,"111":1},"2":{"11":2,"32":1,"62":1,"85":1,"108":1,"118":1,"138":1}}],["назначение",{"2":{"69":1}}],["назначения",{"2":{"60":1}}],["называть",{"2":{"106":2}}],["называются",{"2":{"60":1}}],["называют",{"2":{"40":1,"60":1}}],["называет",{"2":{"109":1}}],["называется",{"2":{"8":1,"17":1,"53":1,"105":1,"106":1}}],["называемая",{"2":{"64":1}}],["называемую",{"2":{"50":1}}],["называемые",{"2":{"12":1,"72":1,"106":1}}],["называемый",{"2":{"11":1,"60":1}}],["называемой",{"2":{"10":1}}],["названия",{"2":{"64":1}}],["названиемстор",{"2":{"106":1}}],["названием",{"2":{"50":1,"61":1}}],["название",{"2":{"11":1,"117":1}}],["названный",{"2":{"11":1}}],["нашли",{"2":{"76":1}}],["наша",{"2":{"71":1}}],["нашу",{"2":{"36":1}}],["наших",{"2":{"9":1,"50":1,"65":1,"69":1,"72":1}}],["наши",{"2":{"9":2,"10":1,"11":2,"32":1}}],["нашим",{"2":{"8":1,"65":1}}],["наш",{"2":{"9":1,"10":1,"11":2,"72":1,"97":1}}],["нашей",{"2":{"61":1,"65":1,"72":3}}],["нашему",{"2":{"58":1}}],["нашем",{"2":{"11":2,"18":1,"56":1,"61":1,"69":1,"72":1}}],["наше",{"2":{"8":3,"70":1}}],["нашего",{"2":{"8":1,"9":2,"10":5,"11":1,"56":1,"91":1}}],["намного",{"2":{"103":1,"106":1,"108":2,"111":1,"116":2,"117":1,"118":3}}],["намекнули",{"2":{"73":1}}],["нами",{"2":{"72":1}}],["нам",{"2":{"6":1,"7":1,"8":1,"9":2,"11":3,"18":1,"19":2,"32":1,"56":1,"57":2,"59":1,"64":2,"65":1,"66":1,"67":1,"72":3}}],["начнете",{"2":{"76":1}}],["начнется",{"2":{"9":1}}],["начнем",{"2":{"20":1,"72":1,"73":1}}],["начинаниях",{"2":{"80":1}}],["начинаем",{"2":{"66":1,"72":1}}],["начинается",{"2":{"23":1,"31":1,"76":1}}],["начинающему",{"2":{"117":1}}],["начинающих",{"2":{"103":1,"139":1}}],["начинающуюся",{"2":{"12":1}}],["начинаются",{"2":{"22":2}}],["начиная",{"2":{"10":1,"29":1,"31":1,"86":1}}],["начинаться",{"2":{"22":1}}],["начинать",{"2":{"5":1,"7":1}}],["начальный",{"2":{"129":1}}],["начального",{"2":{"117":1}}],["начальное",{"2":{"15":1}}],["началом",{"2":{"117":1}}],["начали",{"2":{"69":1}}],["начала",{"2":{"20":1,"118":1}}],["начале",{"2":{"8":1,"52":1}}],["начать",{"2":{"3":1,"7":1,"85":2}}],["напомним",{"2":{"70":1}}],["напишем",{"2":{"18":1}}],["написанным",{"2":{"107":1}}],["написанный",{"2":{"3":1,"7":1}}],["написание",{"2":{"107":1}}],["написании",{"2":{"25":1,"117":1,"118":1}}],["написания",{"2":{"3":1,"6":1,"10":3,"19":1}}],["написаны",{"2":{"9":1}}],["написано",{"2":{"7":1}}],["написать",{"2":{"3":2,"37":1,"117":1,"118":1}}],["напрямую",{"2":{"8":1,"11":1,"33":1,"50":1,"55":1,"64":1,"102":1,"105":1,"110":1,"111":1,"118":1}}],["направляется",{"2":{"2":1}}],["направляет",{"2":{"2":1,"62":1,"63":1}}],["например",{"2":{"2":5,"3":6,"4":1,"7":3,"11":4,"13":1,"14":1,"16":1,"18":1,"19":1,"21":1,"22":4,"23":1,"24":1,"25":1,"31":2,"36":1,"37":1,"40":1,"47":3,"51":1,"53":2,"59":1,"61":1,"62":1,"63":1,"64":3,"65":1,"66":1,"69":1,"70":1,"72":1,"95":2,"99":1,"103":2,"106":5,"108":4,"109":2,"110":1,"111":1,"114":1,"118":2}}],["наследуемая",{"2":{"32":1}}],["наследованием",{"0":{"32":1},"2":{"32":1,"109":2}}],["наследования",{"2":{"28":1,"32":3,"66":1,"105":1}}],["насколько",{"2":{"7":1,"34":1}}],["настройте",{"2":{"117":1}}],["настройку",{"2":{"103":1}}],["настройка",{"0":{"103":1},"2":{"102":2,"103":1}}],["настройки",{"2":{"102":1}}],["настроек",{"2":{"103":2}}],["настроен",{"2":{"97":1}}],["настроить",{"2":{"102":2,"103":1}}],["настраивать",{"2":{"77":1}}],["настраиваемой",{"2":{"10":1}}],["настраивается",{"2":{"4":1}}],["настал",{"2":{"69":1}}],["настоящему",{"2":{"69":1}}],["настоятельно",{"2":{"34":1}}],["настолько",{"2":{"7":1,"118":1}}],["настольными",{"2":{"6":1}}],["нас",{"2":{"2":1,"10":1,"11":2,"25":1,"32":1,"65":1,"70":1,"72":2,"97":1,"109":1}}],["на",{"0":{"94":1},"2":{"1":4,"2":14,"3":8,"4":5,"5":11,"6":3,"7":10,"8":8,"9":2,"10":3,"11":8,"12":1,"15":1,"16":4,"18":3,"19":6,"22":3,"25":1,"27":1,"28":3,"29":2,"31":6,"32":2,"33":5,"34":2,"36":2,"37":1,"38":1,"39":2,"40":6,"41":1,"44":1,"45":1,"47":1,"50":2,"51":1,"53":1,"55":2,"56":4,"59":2,"60":5,"61":1,"62":1,"63":3,"64":3,"65":3,"66":5,"68":1,"69":2,"70":1,"71":2,"72":2,"73":3,"78":1,"80":1,"84":1,"88":1,"92":1,"95":2,"97":12,"98":4,"99":2,"102":3,"103":5,"105":6,"106":9,"107":8,"108":11,"109":9,"110":1,"111":2,"113":3,"116":5,"117":19,"118":16,"123":1,"124":1,"138":1}}],["rip",{"2":{"106":1}}],["rspack",{"2":{"103":24}}],["rc",{"2":{"103":2}}],["rush",{"2":{"103":2}}],["rust",{"2":{"103":2}}],["rustfmt",{"2":{"103":4}}],["ruby",{"2":{"103":2}}],["ru",{"2":{"103":6,"117":1,"139":2}}],["rules",{"2":{"103":4}}],["run",{"2":{"97":18}}],["runs",{"2":{"97":4}}],["runcommand",{"2":{"63":2}}],["raw",{"2":{"99":4,"101":2,"102":2}}],["ram",{"2":{"78":1}}],["r",{"2":{"97":4,"139":2}}],["rf",{"2":{"97":8}}],["rm",{"2":{"97":6}}],["routes",{"2":{"109":1}}],["router",{"2":{"77":1,"78":1,"87":1}}],["rollup",{"2":{"102":2,"103":4}}],["role",{"2":{"2":1}}],["root",{"2":{"97":2,"101":2}}],["rbac",{"2":{"2":1}}],["rtl",{"2":{"105":1}}],["rt",{"2":{"2":4,"138":1}}],["rpc",{"2":{"1":1,"5":8,"117":1}}],["reddit",{"2":{"139":1}}],["redis",{"2":{"106":1}}],["rehydration",{"2":{"118":1}}],["register",{"2":{"106":1}}],["remix",{"2":{"103":4}}],["removed",{"2":{"97":2}}],["removed=`ls",{"2":{"97":2}}],["remove",{"2":{"97":4}}],["removeeventlistener",{"2":{"36":2}}],["remote",{"2":{"97":14,"103":9}}],["read",{"2":{"106":1}}],["readme",{"2":{"103":4}}],["reactivity",{"2":{"106":1,"108":2}}],["reactive",{"2":{"64":1,"105":7,"106":6,"108":2}}],["react",{"2":{"7":1,"108":7,"117":2}}],["renovate",{"2":{"103":4}}],["rendering",{"2":{"118":1}}],["renderwhitespace",{"2":{"103":2}}],["render",{"2":{"98":1}}],["release",{"2":{"103":8}}],["releaserc",{"2":{"103":4}}],["reload",{"2":{"97":2}}],["recentchange",{"2":{"103":2}}],["recursive",{"2":{"97":2}}],["repo",{"2":{"103":2}}],["representation",{"2":{"99":2}}],["repeat",{"0":{"37":1},"2":{"28":1,"63":2}}],["required",{"2":{"97":2}}],["request",{"2":{"1":2}}],["reject",{"2":{"72":9}}],["re",{"2":{"29":1}}],["ref",{"2":{"11":11,"19":4,"64":1,"105":8,"106":6,"108":2}}],["refresh",{"2":{"2":1,"138":1}}],["resx",{"2":{"103":4}}],["response",{"2":{"97":4}}],["responsibility",{"0":{"33":1},"2":{"28":1}}],["result=",{"2":{"72":6}}],["result",{"2":{"72":4}}],["resolver",{"2":{"102":1,"103":2}}],["resolve",{"2":{"72":12,"102":4}}],["resource",{"2":{"4":1,"99":4}}],["resize",{"2":{"36":5}}],["rest",{"0":{"5":2},"2":{"1":1,"5":2}}],["return",{"2":{"1":2,"8":2,"11":4,"50":4,"52":2,"53":2,"54":2,"57":4,"59":4,"61":2,"65":6,"71":1,"72":14,"100":4,"101":4}}],["люксовый",{"2":{"118":1}}],["любая",{"2":{"106":1,"116":1}}],["любым",{"2":{"97":1}}],["любых",{"2":{"56":1}}],["любую",{"2":{"31":1}}],["любого",{"2":{"4":1,"65":1,"137":1}}],["любой",{"2":{"4":1,"7":1,"9":1,"54":1,"99":1,"106":1,"116":1}}],["любое",{"2":{"2":1}}],["любом",{"2":{"2":1,"66":2,"72":1,"106":1,"113":1,"118":1}}],["любимую",{"2":{"1":1}}],["лэйаут",{"2":{"116":1}}],["лучшее",{"2":{"103":1}}],["лучшей",{"2":{"33":1,"36":1}}],["лучше",{"2":{"11":1,"19":1,"31":1,"33":1,"36":2,"38":1,"55":1,"56":1,"73":1,"101":1,"103":1,"108":1,"113":1,"117":2,"118":1}}],["лучшего",{"2":{"8":1}}],["лучшими",{"2":{"117":1}}],["лучших",{"2":{"33":1,"39":1,"56":1,"117":1,"138":1}}],["лучший",{"0":{"9":1}}],["лучшие",{"2":{"2":1,"6":1,"40":1,"117":1}}],["ландшафте",{"2":{"6":1}}],["лазить",{"2":{"2":1}}],["локали",{"2":{"105":1}}],["локализации",{"2":{"105":3}}],["локалей",{"2":{"105":1}}],["локальным",{"2":{"109":1}}],["локальный",{"2":{"106":1}}],["локальных",{"2":{"103":1,"106":1}}],["локальной",{"2":{"69":1}}],["локально",{"2":{"6":1,"118":1}}],["логично",{"2":{"106":1}}],["логичный",{"2":{"105":1}}],["логическому",{"2":{"118":1}}],["логической",{"2":{"36":1}}],["логически",{"2":{"112":1}}],["логические",{"2":{"109":1}}],["логический",{"2":{"39":1}}],["логирования",{"2":{"66":1}}],["логики",{"2":{"37":1,"106":3}}],["логике",{"2":{"37":1,"72":1}}],["логикой",{"2":{"19":1,"33":1,"36":1,"62":1,"63":1}}],["логика",{"2":{"3":1,"106":4,"108":1}}],["логику",{"2":{"3":2,"11":1,"37":2,"39":1,"63":1,"64":1,"65":1,"66":1,"71":1,"106":2,"108":3,"116":2}}],["логине",{"2":{"2":1}}],["логина",{"2":{"2":1,"107":1}}],["логинится",{"2":{"2":1}}],["логин",{"2":{"2":4}}],["лепту",{"0":{"137":1}}],["лень",{"2":{"118":1}}],["лечь",{"2":{"118":1}}],["легче",{"2":{"117":1}}],["легкий",{"2":{"117":1}}],["легкая",{"2":{"7":1}}],["легкой",{"2":{"11":1,"108":1}}],["легко",{"2":{"1":1,"7":1,"37":1,"38":1,"71":1,"72":1,"117":1}}],["лежащего",{"2":{"95":1}}],["лежит",{"2":{"3":1}}],["личного",{"2":{"109":1}}],["личный",{"2":{"2":1}}],["линтингом",{"2":{"107":1}}],["линтер",{"2":{"103":1}}],["линкер",{"2":{"25":1}}],["литерал",{"2":{"49":1,"57":1}}],["литературах",{"2":{"45":1}}],["либо",{"2":{"3":1,"62":1,"71":1,"99":3,"102":1,"110":1,"116":2,"117":1,"118":1}}],["лишь",{"2":{"2":1,"6":1,"9":1,"34":1}}],["лишние",{"2":{"2":1}}],["ли",{"2":{"2":3,"3":1,"50":1,"70":1,"74":3,"106":1,"107":1,"117":4,"118":1}}],["python",{"2":{"117":1,"118":1}}],["pyproject",{"2":{"103":4}}],["pyrightconfig",{"2":{"103":4}}],["psalm",{"2":{"103":2}}],["pm2",{"2":{"103":8}}],["pm",{"2":{"103":2}}],["playground",{"2":{"103":1}}],["playwright",{"2":{"103":20}}],["placeholder",{"2":{"3":1}}],["please",{"2":{"103":2}}],["plugin",{"2":{"102":2,"103":1,"118":2}}],["plugins",{"2":{"102":2}}],["px`",{"2":{"100":8}}],["pnp",{"2":{"103":4}}],["pnpm",{"2":{"97":22,"102":2,"103":12}}],["png`",{"2":{"99":2}}],["png",{"2":{"99":5,"101":4}}],["pdm",{"2":{"103":4}}],["pdf",{"2":{"99":1,"103":2}}],["pdgaraguso",{"2":{"80":1}}],["p",{"2":{"97":2}}],["pwd",{"2":{"97":2}}],["pwa",{"0":{"118":1},"2":{"6":1,"76":1,"88":1,"118":12,"138":1}}],["pipelines",{"2":{"103":4}}],["pinia",{"2":{"77":1,"78":1,"89":1,"106":12,"124":1}}],["picture",{"2":{"13":4}}],["persistentsessionreviveprocess",{"2":{"103":2}}],["person",{"2":{"21":1,"23":1}}],["pereditorgroup",{"2":{"103":2}}],["permissions",{"2":{"97":2}}],["permission",{"2":{"2":1}}],["pr",{"2":{"137":1}}],["price",{"2":{"118":1}}],["primevue",{"2":{"104":1}}],["private",{"2":{"97":10}}],["principle",{"0":{"33":1},"2":{"38":1}}],["printwidth",{"2":{"103":2}}],["printf",{"2":{"97":2}}],["print",{"2":{"18":4}}],["printpage",{"2":{"18":5}}],["practices",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"79":1,"117":1}}],["prerenderer",{"2":{"118":1}}],["preferredtagnamecase",{"2":{"103":2}}],["preview",{"2":{"103":2}}],["prettier",{"2":{"103":27}}],["pre",{"2":{"71":26,"72":14}}],["problem",{"2":{"118":1}}],["procfile",{"2":{"103":4}}],["processqueue",{"2":{"24":1}}],["proj",{"2":{"103":4}}],["project",{"2":{"97":10,"103":2}}],["projects=",{"2":{"52":2,"53":2}}],["projects",{"2":{"51":2,"52":4,"53":5,"54":6,"55":8,"56":18}}],["projectservice",{"2":{"25":1}}],["projectservice=new",{"2":{"25":1}}],["production",{"2":{"102":1}}],["products",{"2":{"1":6}}],["prod",{"2":{"97":7}}],["programs",{"2":{"78":1}}],["progressive",{"2":{"76":1,"118":1}}],["promised",{"2":{"74":1}}],["promise",{"0":{"72":1},"2":{"72":14}}],["promises",{"2":{"28":1,"45":1,"71":1}}],["provide",{"2":{"57":4,"58":7,"106":2}}],["profile",{"2":{"13":4}}],["props",{"2":{"11":1,"100":22}}],["proxy",{"0":{"64":1,"65":1},"1":{"65":1},"2":{"4":1,"28":1,"44":1,"64":1,"65":4,"66":2,"105":2,"108":1}}],["pullapprove",{"2":{"103":4}}],["puppeteer",{"2":{"103":20}}],["pugtools",{"2":{"103":2}}],["push",{"2":{"61":2,"95":1,"97":5,"108":2}}],["pubspec",{"2":{"103":6}}],["pubxml",{"2":{"103":4}}],["pub",{"2":{"60":1,"64":1}}],["public",{"2":{"3":1,"99":4}}],["purple",{"2":{"10":2,"68":2}}],["pure",{"2":{"10":2}}],["pascal",{"2":{"103":2}}],["pascalcase",{"2":{"23":1}}],["paths",{"2":{"102":2}}],["path",{"2":{"100":2,"102":6}}],["patterns",{"0":{"75":1,"93":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"79":1,"103":2,"117":1}}],["packt",{"2":{"80":1}}],["packtpublishing",{"2":{"79":1}}],["packages",{"2":{"103":2}}],["package",{"2":{"61":1,"102":2,"103":13}}],["pablo",{"2":{"75":1}}],["pagespeed",{"2":{"118":2}}],["pages",{"2":{"95":1,"97":13,"98":3,"117":1}}],["page",{"2":{"4":1,"118":1}}],["params",{"2":{"1":4}}],["postcss",{"2":{"103":20}}],["postcssrc",{"2":{"103":20}}],["postman",{"2":{"4":1,"103":1}}],["postgresql",{"2":{"3":1}}],["policy",{"2":{"2":1}}],["phpcs",{"2":{"103":4}}],["phpunit",{"2":{"103":2}}],["php",{"2":{"3":1,"103":4,"117":1,"118":2}}],["photo",{"2":{"2":1}}],["pba",{"2":{"2":1}}],["e2e",{"2":{"107":5}}],["eex",{"2":{"103":2}}],["emmet",{"2":{"103":4}}],["emit",{"2":{"61":5}}],["emits",{"2":{"11":1}}],["eol",{"2":{"103":2}}],["esbenp",{"2":{"103":8}}],["esbuild",{"2":{"102":1}}],["eslint",{"2":{"102":3,"103":29,"117":1}}],["esnext",{"2":{"102":2}}],["es6",{"2":{"49":1,"105":1,"108":1}}],["e88a22df",{"2":{"99":1}}],["echo",{"2":{"97":16}}],["ecosystem",{"2":{"78":1}}],["eager",{"2":{"101":4}}],["easingthemes",{"2":{"97":3}}],["eat",{"2":{"63":2}}],["exs",{"2":{"103":10}}],["extractor",{"2":{"103":22}}],["extension",{"2":{"103":2}}],["extensions",{"2":{"103":6}}],["ex",{"2":{"103":2}}],["experience",{"2":{"138":2}}],["express",{"2":{"118":1}}],["expand",{"2":{"103":2}}],["expandmode",{"2":{"103":2}}],["explorer",{"2":{"103":12}}],["exports",{"2":{"101":2}}],["export",{"2":{"1":4,"11":4,"49":2,"50":2,"52":2,"53":2,"54":2,"57":2,"101":2,"102":2,"106":2}}],["example",{"2":{"101":4}}],["exclude",{"2":{"97":2,"103":2}}],["exiting",{"2":{"97":2}}],["err=",{"2":{"72":2}}],["error",{"2":{"72":1,"97":2}}],["event",{"2":{"61":26,"103":2}}],["events",{"2":{"61":18}}],["everybody",{"2":{"106":1}}],["every",{"2":{"1":2}}],["end",{"2":{"107":2}}],["entity",{"2":{"106":2}}],["entire",{"2":{"101":2}}],["engine",{"2":{"105":1}}],["enablesmartcommit",{"2":{"103":2}}],["enable",{"2":{"103":6}}],["enabled",{"2":{"103":18}}],["encrypt",{"2":{"92":1}}],["encence",{"2":{"92":1}}],["encapsulation",{"0":{"34":1},"2":{"28":1}}],["en",{"2":{"38":1,"103":6}}],["envrc",{"2":{"103":24}}],["envs",{"2":{"97":4}}],["environments",{"2":{"98":1}}],["environment",{"2":{"97":2}}],["env",{"2":{"1":2,"97":48,"103":76}}],["elements",{"2":{"19":1}}],["else",{"0":{"15":2},"2":{"50":2,"56":2,"71":4,"72":4,"100":2}}],["editorconfig",{"2":{"103":4}}],["editortab",{"2":{"103":2}}],["editorgroup",{"2":{"103":2}}],["editor",{"2":{"103":58}}],["edit",{"2":{"19":3,"137":1}}],["edititem",{"2":{"19":7}}],["edge",{"2":{"3":2,"78":1}}],["two",{"2":{"118":1}}],["turbo",{"2":{"103":4}}],["txt",{"2":{"103":2}}],["tip",{"2":{"108":1}}],["tidy",{"2":{"103":2}}],["titlebarstyle",{"2":{"103":2}}],["title=",{"2":{"68":2}}],["tmp",{"2":{"103":2}}],["tazerc",{"2":{"103":4}}],["tabs",{"2":{"103":2}}],["tabsize",{"2":{"103":2}}],["tailwind",{"2":{"103":20,"116":2}}],["tail",{"2":{"97":2}}],["target",{"2":{"65":12,"97":30,"102":2}}],["tasks",{"2":{"103":4}}],["task",{"2":{"23":1}}],["that",{"2":{"106":4}}],["throw",{"2":{"56":2,"97":2}}],["there",{"2":{"106":1}}],["thenable",{"2":{"72":1}}],["then",{"2":{"72":22,"97":8}}],["the",{"0":{"39":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"28":1,"64":1,"97":4,"99":4,"101":2,"103":2,"118":1}}],["this",{"2":{"10":2,"11":6,"50":2,"54":2,"56":2,"57":6,"61":14,"103":6}}],["t",{"0":{"37":1},"2":{"28":1,"102":5,"106":2}}],["travis",{"2":{"103":4}}],["translate",{"2":{"117":1}}],["transform",{"2":{"108":1}}],["transformer",{"2":{"103":2}}],["transfer",{"2":{"97":2}}],["transitiongroup",{"2":{"19":1}}],["transition",{"2":{"19":1}}],["triggerexpansionontab",{"2":{"103":2}}],["tree",{"2":{"101":2,"103":6,"106":2,"110":1}}],["trevis",{"2":{"95":1}}],["try",{"2":{"56":2,"72":3}}],["true",{"2":{"1":2,"14":2,"97":2,"101":4,"103":122}}],["terserrc",{"2":{"103":20}}],["terminal",{"2":{"103":10}}],["tex",{"2":{"103":2}}],["textlint",{"2":{"103":4}}],["text",{"2":{"17":2}}],["textarea",{"2":{"17":1}}],["test",{"2":{"103":2,"107":1}}],["testing",{"2":{"78":1}}],["temperature",{"2":{"65":7}}],["template",{"2":{"10":5,"19":4,"67":4,"68":4,"100":4,"116":4}}],["teleport",{"2":{"19":1}}],["tsup",{"2":{"103":4}}],["tslint",{"2":{"103":4}}],["tsdoc",{"2":{"103":22}}],["tsdk",{"2":{"103":2}}],["tsx",{"2":{"103":6}}],["tsconfig",{"2":{"102":3,"103":22}}],["tsc",{"2":{"102":1}}],["ts",{"2":{"10":1,"103":66}}],["typedoc",{"2":{"103":4}}],["types",{"2":{"102":2,"135":1}}],["typescript",{"0":{"135":1},"2":{"5":1,"10":1,"102":3,"103":10,"106":1,"135":4}}],["type",{"2":{"59":4,"97":2,"100":14}}],["type=",{"2":{"17":2}}],["typicode",{"2":{"3":1}}],["tool",{"2":{"103":6}}],["toolchain",{"2":{"103":2}}],["tools",{"2":{"78":1}}],["toml",{"2":{"103":20}}],["toc",{"2":{"103":2}}],["total",{"2":{"21":1,"22":1}}],["token",{"2":{"1":2,"2":5,"138":2}}],["to",{"0":{"5":1},"2":{"1":2,"97":4,"99":2,"103":4,"106":3,"107":1}}],["v1",{"0":{"120":1,"122":1,"125":1,"128":1},"1":{"121":1,"123":1,"124":1,"126":1,"127":1,"129":1}}],["v16",{"2":{"78":1}}],["vetur",{"2":{"103":4}}],["vercel",{"2":{"98":1,"103":4}}],["versionrc",{"2":{"103":4}}],["versions",{"2":{"103":6}}],["version",{"2":{"78":1,"97":10,"103":6}}],["vbproj",{"2":{"103":2}}],["vb",{"2":{"103":12}}],["volar",{"2":{"103":7}}],["vs",{"2":{"103":7,"108":1}}],["vscode",{"2":{"97":2,"103":17}}],["v4значительно",{"2":{"97":1}}],["v4",{"2":{"97":6}}],["v2",{"2":{"97":5}}],["v3",{"2":{"97":7}}],["views",{"2":{"109":1}}],["view",{"2":{"106":2,"108":1}}],["viewitem",{"2":{"19":6}}],["visible",{"2":{"103":2}}],["visuals",{"2":{"103":2}}],["visualizer",{"2":{"102":7}}],["visual",{"2":{"78":1}}],["vitepnpm",{"2":{"102":1}}],["vitepress",{"2":{"97":2,"115":1,"117":1}}],["vitest",{"2":{"78":1,"103":20,"107":1}}],["vite",{"2":{"1":2,"4":1,"9":1,"10":1,"11":1,"77":1,"78":1,"99":1,"100":1,"102":17,"103":5,"118":3,"139":1}}],["v",{"0":{"13":1,"14":1,"15":3,"16":1,"17":1,"18":1},"2":{"12":1,"13":1,"14":3,"15":4,"16":2,"17":2,"18":3,"19":3,"100":6}}],["validate",{"2":{"103":2}}],["value",{"2":{"1":4,"11":3,"65":8,"71":16,"72":10,"103":2,"105":2,"108":4}}],["var",{"2":{"97":8}}],["variable",{"2":{"11":1}}],["variablename",{"2":{"11":1}}],["vuetify",{"2":{"116":1}}],["vuex",{"2":{"106":6,"124":1}}],["vuejs",{"2":{"18":1,"19":2,"139":4}}],["vue",{"0":{"6":1,"8":1,"12":1,"67":1,"68":1,"75":1,"83":1,"94":2,"106":1,"117":1,"131":1},"1":{"7":1,"8":1,"9":2,"10":1,"11":1,"12":1,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"6":4,"7":9,"8":12,"9":7,"10":8,"11":18,"12":3,"14":1,"16":1,"17":1,"18":3,"19":9,"20":1,"26":1,"27":2,"28":1,"32":1,"33":1,"34":1,"36":5,"40":2,"41":1,"58":2,"63":1,"64":3,"65":1,"66":1,"67":1,"68":4,"69":1,"73":1,"76":2,"77":3,"78":4,"79":1,"83":1,"84":1,"87":1,"89":2,"91":2,"92":1,"94":1,"97":1,"99":1,"100":3,"102":5,"103":21,"105":6,"106":12,"107":1,"108":17,"109":2,"116":4,"117":19,"118":1,"121":1,"131":1,"137":1,"139":1}}],["i18next",{"2":{"105":1}}],["i18n",{"2":{"103":6,"105":3}}],["ignoredlocales",{"2":{"103":2}}],["ignore",{"2":{"103":4}}],["ignoretrimwhitespace",{"2":{"103":2}}],["ignorerecommendations",{"2":{"103":2}}],["ie6",{"2":{"116":1}}],["iex",{"2":{"103":2}}],["ie11",{"2":{"101":1}}],["ie",{"2":{"101":1}}],["iconify",{"2":{"103":4}}],["icon",{"2":{"100":2}}],["icons",{"0":{"101":1},"2":{"100":3,"101":2}}],["i=1",{"2":{"71":4}}],["i=this",{"2":{"61":2}}],["i=0",{"2":{"61":2}}],["i++",{"2":{"61":2,"71":4,"72":2}}],["it",{"0":{"36":1,"38":1},"2":{"28":2,"36":1,"61":1,"106":2}}],["i",{"2":{"16":7,"61":8,"71":4,"72":4,"103":2}}],["if=",{"2":{"100":2}}],["if",{"0":{"15":2},"2":{"15":1,"19":1,"50":2,"56":2,"61":6,"71":4,"72":4,"97":6}}],["imageresources",{"2":{"101":6}}],["imageraw",{"2":{"99":2}}],["imagenameinvariable",{"2":{"99":2}}],["image",{"2":{"99":8}}],["imageurl",{"2":{"99":2}}],["images",{"2":{"97":2,"99":5,"101":4}}],["imgurl",{"2":{"99":4}}],["img",{"2":{"13":2,"99":12,"100":2}}],["important",{"2":{"68":2}}],["import",{"2":{"1":17,"11":4,"19":6,"36":2,"50":3,"52":1,"55":3,"56":7,"58":8,"61":2,"68":2,"99":6,"100":5,"101":12,"102":5,"103":4}}],["isn",{"2":{"106":2}}],["isauthenticated",{"2":{"106":1}}],["ist",{"2":{"103":2}}],["issuenumberlabel",{"2":{"103":2}}],["is=",{"2":{"19":2}}],["is",{"2":{"10":2,"19":1,"78":1,"103":2,"105":4,"106":2}}],["idx",{"2":{"103":2}}],["ide",{"0":{"103":1},"2":{"36":1,"103":1,"138":1}}],["id",{"2":{"8":1,"16":1,"21":1,"97":4}}],["id=",{"2":{"8":4}}],["ipc",{"2":{"72":1}}],["ip",{"2":{"2":1}}],["ind",{"2":{"103":2}}],["indent",{"2":{"103":2}}],["indexof",{"2":{"61":2}}],["indexeddb",{"2":{"51":2,"69":2}}],["index",{"2":{"9":1,"97":2,"118":2}}],["inplace",{"2":{"103":2}}],["inputs",{"2":{"97":10}}],["input",{"2":{"17":3,"22":1,"103":2,"108":1}}],["insertfinalnewline",{"2":{"103":2}}],["install",{"2":{"97":20}}],["instance=this",{"2":{"50":2}}],["instance",{"2":{"50":6}}],["invisiblecharacters",{"2":{"103":2}}],["invoker",{"2":{"62":1,"63":2}}],["inlinesuggest",{"2":{"103":2}}],["inject",{"2":{"57":3,"58":3,"106":2}}],["injection",{"0":{"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"28":1,"42":1,"58":4}}],["inheritance",{"0":{"32":1},"2":{"28":1}}],["in",{"2":{"16":2,"18":1,"19":2,"101":4,"103":2,"106":1}}],["info",{"2":{"4":4}}],["intl",{"2":{"104":1}}],["integrated",{"2":{"103":10}}],["integration",{"2":{"95":1}}],["interface",{"2":{"138":1}}],["interfaces",{"2":{"135":1}}],["intersection",{"2":{"105":1}}],["interval",{"2":{"103":2}}],["interceptors",{"2":{"1":2}}],["intel",{"2":{"78":1}}],["into",{"2":{"1":2}}],["init",{"2":{"1":2,"97":3}}],["unit",{"2":{"107":6}}],["unique",{"2":{"106":1}}],["unicodehighlight",{"2":{"103":2}}],["unlighthouse",{"2":{"103":4}}],["unocss",{"2":{"103":20}}],["uno",{"2":{"103":20}}],["untrackedchanges",{"2":{"103":2}}],["unpkg",{"2":{"8":2}}],["up",{"2":{"97":2,"103":2}}],["update",{"2":{"97":2,"103":2}}],["updating",{"2":{"97":2}}],["ubuntu",{"2":{"97":6}}],["ux",{"0":{"93":1},"2":{"118":2,"138":1}}],["us",{"2":{"103":2}}],["usability",{"2":{"29":1}}],["usenewswidget",{"2":{"108":1}}],["usei18n",{"2":{"108":1,"109":1}}],["useshoppingcart",{"2":{"108":1}}],["usescreensize",{"2":{"108":1}}],["uses",{"2":{"97":20}}],["use",{"2":{"22":1,"103":2,"115":1}}],["useauthservice",{"2":{"106":1}}],["useauthstore",{"2":{"106":1}}],["useauth",{"2":{"1":8,"106":1}}],["userloggedin",{"2":{"106":2}}],["username",{"2":{"97":4,"106":1}}],["user",{"2":{"1":4,"97":12,"103":6,"138":2}}],["userid",{"2":{"1":2}}],["users",{"2":{"1":13}}],["userdata",{"2":{"1":2}}],["ui",{"0":{"111":1,"116":1},"2":{"29":1,"34":1,"102":2,"104":2,"107":1,"108":3,"109":2,"111":1,"113":1,"116":10,"138":1}}],["url",{"2":{"1":2,"99":3,"101":2}}],["utils",{"2":{"1":6,"100":3,"109":1}}],["fcp",{"2":{"118":1}}],["fetish",{"2":{"107":1}}],["fetch",{"2":{"1":1,"97":2}}],["fu",{"2":{"103":1}}],["function",{"2":{"36":2,"59":1,"65":4,"71":2,"72":3,"101":6}}],["functions",{"2":{"3":2,"106":1}}],["flow",{"2":{"135":1}}],["flowconfig",{"2":{"103":4}}],["flexbox",{"2":{"114":1,"134":2}}],["flake",{"2":{"103":4}}],["flash",{"2":{"6":1}}],["fls",{"2":{"103":2}}],["fdb",{"2":{"103":2}}],["fontweight",{"2":{"103":2}}],["fontligatures",{"2":{"103":2}}],["fontfamily",{"2":{"103":2}}],["fontaliasing",{"2":{"103":2}}],["folder",{"2":{"97":2}}],["fork",{"2":{"137":1}}],["foreign",{"2":{"106":1}}],["formulate",{"2":{"103":20}}],["formkit",{"2":{"103":20}}],["formatter",{"2":{"103":2}}],["formatting",{"2":{"103":2}}],["formatonsave",{"2":{"103":2}}],["format",{"2":{"97":6,"103":4}}],["for=",{"2":{"16":2}}],["for",{"0":{"16":1,"39":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"16":1,"19":1,"28":1,"61":2,"71":4,"72":2,"78":1,"97":2,"101":4,"103":2,"118":1}}],["ftcms",{"2":{"80":1}}],["f",{"2":{"70":6}}],["frequently",{"2":{"139":1}}],["freezed",{"2":{"103":2}}],["framework",{"2":{"64":1,"78":1}}],["from",{"2":{"1":18,"11":4,"19":6,"36":2,"50":4,"52":2,"55":4,"56":8,"58":10,"61":4,"68":2,"99":6,"100":4,"101":4,"102":4}}],["fnc",{"2":{"104":1}}],["fn",{"2":{"61":8}}],["fallback",{"2":{"101":1}}],["false",{"2":{"1":2,"97":4,"103":54,"106":2}}],["faq",{"0":{"137":1},"2":{"97":1,"139":1}}],["fahrenheit",{"2":{"65":13}}],["factory",{"0":{"59":1},"2":{"42":1}}],["facebook",{"2":{"7":1}}],["façade",{"0":{"69":1},"2":{"28":1,"44":1,"69":1,"72":1}}],["fix",{"2":{"103":2}}],["fixall",{"2":{"103":4}}],["field",{"2":{"101":4}}],["fill",{"2":{"100":2}}],["filenesting",{"2":{"103":6}}],["filename",{"2":{"101":20}}],["filelistlayout",{"2":{"103":2}}],["files",{"2":{"97":2,"103":6}}],["file=",{"2":{"97":2}}],["file",{"2":{"97":4,"103":4}}],["fi",{"2":{"97":4}}],["find",{"2":{"103":2}}],["finally",{"2":{"72":2}}],["fingerprint",{"2":{"2":1}}],["fibonaccipromise",{"2":{"72":4}}],["fibonacciasync",{"2":{"71":4}}],["fibonaccisync",{"2":{"71":6}}],["fira",{"2":{"103":2}}],["firestore",{"2":{"117":1}}],["firefox",{"2":{"78":1}}],["firebase",{"2":{"3":2,"98":2,"103":8}}],["first",{"2":{"22":1,"103":2}}],["article",{"2":{"114":1}}],["artisan",{"2":{"103":2}}],["azure",{"2":{"103":4}}],["air",{"2":{"103":2}}],["ava",{"2":{"103":20}}],["available",{"2":{"78":1}}],["aux",{"2":{"103":2}}],["autocompleterefs",{"2":{"103":2}}],["autodetection",{"2":{"103":2}}],["autodetectcolorscheme",{"2":{"103":2}}],["autofetch",{"2":{"103":2}}],["autoupdate",{"2":{"103":2}}],["auto",{"2":{"100":2,"103":2}}],["authors",{"2":{"103":6}}],["authorization",{"2":{"2":2}}],["authinterceptor",{"2":{"1":4}}],["auth",{"2":{"1":6}}],["amp",{"2":{"97":8,"103":2}}],["amd",{"2":{"78":1}}],["amazon",{"2":{"3":2,"98":2}}],["angular",{"2":{"108":2}}],["analysis",{"2":{"103":2,"135":1}}],["annotations",{"2":{"103":2}}],["antony",{"2":{"103":1}}],["antfu",{"2":{"103":5}}],["antialiased",{"2":{"103":2}}],["an",{"2":{"78":1,"106":2}}],["any",{"2":{"78":1}}],["and",{"0":{"38":1,"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1},"2":{"78":1,"79":1,"97":8,"106":4,"117":1}}],["a=result",{"2":{"72":2}}],["a+b+c",{"2":{"72":3}}],["afterconsole",{"2":{"71":1}}],["after",{"2":{"71":8,"72":4,"97":2}}],["always",{"2":{"106":1}}],["alg",{"2":{"103":2}}],["alias",{"2":{"102":2}}],["ally",{"2":{"103":6}}],["all",{"2":{"72":1,"103":2}}],["allowcompoundwords",{"2":{"103":2}}],["allows",{"2":{"103":2}}],["allow",{"2":{"4":7}}],["alert",{"2":{"71":2}}],["ajax",{"2":{"69":1}}],["addextraspaceontop",{"2":{"103":2}}],["addeventlistener",{"2":{"36":2}}],["addcommand",{"2":{"63":2}}],["addresponseinterceptor",{"2":{"1":4}}],["acr",{"2":{"103":2}}],["acn",{"2":{"103":2}}],["active",{"2":{"103":2}}],["activitybar",{"2":{"103":2}}],["actions",{"0":{"97":1},"2":{"95":1,"97":15,"103":1,"117":1,"123":1}}],["action",{"2":{"19":7,"63":3,"97":14,"103":1}}],["accessibility",{"2":{"116":1}}],["accessibilitysupport",{"2":{"103":2}}],["access",{"2":{"2":5,"4":5,"138":1}}],["account",{"2":{"1":2,"99":2,"101":1}}],["apollo",{"2":{"103":4}}],["apache",{"2":{"78":1,"98":1}}],["appveyor",{"2":{"103":4}}],["appsettings",{"2":{"103":4}}],["appleboy",{"2":{"97":5}}],["application",{"2":{"76":1,"118":2}}],["app",{"2":{"8":9,"9":1,"10":2,"100":3,"109":1,"118":1}}],["api",{"0":{"1":1,"11":1},"2":{"1":18,"3":5,"5":2,"11":16,"18":1,"19":2,"34":2,"37":2,"47":1,"51":2,"53":1,"64":8,"65":1,"66":5,"67":2,"69":7,"72":1,"98":2,"103":24,"105":4,"106":1,"108":1,"109":2,"117":3,"118":1,"124":1}}],["aws",{"2":{"3":1}}],["await",{"2":{"1":4,"72":12}}],["a",{"2":{"3":1,"7":2,"61":4,"72":13,"101":2,"103":1,"105":4,"106":3,"109":1,"117":1,"118":1}}],["asked",{"2":{"139":1}}],["aside",{"2":{"114":1}}],["astro",{"2":{"103":2}}],["aspx",{"2":{"103":2}}],["ashx",{"2":{"103":2}}],["ascx",{"2":{"103":2}}],["asax",{"2":{"103":2}}],["assets",{"2":{"99":5,"101":4,"109":1}}],["as",{"2":{"3":1,"101":6}}],["async",{"2":{"1":2,"72":3}}],["at",{"2":{"2":6,"78":2,"103":2,"138":1}}],["axios",{"2":{"1":1,"69":1}}],["=+",{"2":{"103":2}}],["==",{"2":{"97":6}}],["=2",{"2":{"70":1}}],["=2f",{"2":{"70":1}}],["=",{"2":{"1":10,"7":2,"8":2,"11":6,"19":4,"36":4,"49":2,"54":2,"55":2,"56":6,"57":4,"58":2,"59":4,"61":8,"65":14,"67":2,"68":2,"70":6,"71":22,"72":46,"97":6,"100":10,"101":12,"105":8,"106":2,"108":2}}],["бд",{"2":{"106":1}}],["брать",{"2":{"108":1}}],["брали",{"2":{"97":1}}],["браузеру",{"2":{"102":1}}],["браузером",{"2":{"97":1,"118":1}}],["браузеры",{"2":{"49":1,"98":1,"118":1}}],["браузере",{"2":{"8":1,"9":1,"69":1,"99":1,"118":3}}],["браузерами",{"2":{"6":1}}],["браузера",{"2":{"4":2,"6":1,"9":1,"51":1,"69":1,"70":2,"118":1}}],["браузер",{"2":{"2":1,"4":3,"9":4,"10":1,"71":1,"78":1,"107":1}}],["буквы",{"2":{"23":1}}],["буквами",{"2":{"22":1,"25":1}}],["булево",{"2":{"14":2}}],["будто",{"2":{"39":2,"116":1}}],["будущих",{"2":{"85":2}}],["будущим",{"2":{"76":1}}],["будущее",{"2":{"19":1}}],["будущем",{"2":{"7":1}}],["будучи",{"2":{"64":1,"70":1,"71":1}}],["будут",{"2":{"8":1,"11":1,"15":1,"19":1,"22":1,"25":1,"29":1,"37":1,"63":1,"66":1,"77":1,"97":1}}],["будем",{"2":{"6":1,"7":1,"8":1,"9":2,"10":2,"11":3,"18":1,"20":1,"25":1,"26":1,"31":1,"40":1,"41":1,"50":1,"61":1,"66":1,"69":3,"70":1,"72":2,"73":3,"97":2}}],["будете",{"2":{"6":1,"69":1,"102":1,"117":1}}],["будет",{"2":{"1":1,"3":2,"4":1,"5":1,"7":2,"8":3,"9":2,"11":2,"13":2,"14":3,"15":1,"16":1,"17":1,"18":1,"19":1,"33":1,"49":1,"50":1,"54":1,"59":2,"60":1,"62":1,"65":2,"66":2,"70":2,"71":8,"72":4,"73":1,"85":1,"97":1,"99":1,"103":1,"106":2,"107":3,"116":1,"117":2}}],["блестящих",{"2":{"80":1}}],["благополучия",{"2":{"80":1}}],["благодарю",{"2":{"80":1}}],["благодаря",{"2":{"69":1,"118":1}}],["близко",{"2":{"118":1}}],["близка",{"2":{"69":1}}],["ближе",{"2":{"11":1}}],["блока",{"2":{"103":1}}],["блок",{"2":{"72":1}}],["блокируют",{"2":{"70":1}}],["блоки",{"2":{"9":1}}],["блог",{"2":{"2":1}}],["билдом",{"2":{"107":1}}],["билде",{"2":{"99":1}}],["билда",{"2":{"95":1,"97":2,"98":1,"102":1}}],["библиотекой",{"2":{"27":1,"106":1,"110":1}}],["библиотекам",{"2":{"46":1}}],["библиотека",{"2":{"7":4,"45":1,"105":1,"106":4,"110":1}}],["библиотек",{"0":{"111":1},"2":{"6":1,"7":2,"26":1,"34":1,"69":1,"76":1,"104":1,"113":1,"116":7}}],["библиотеки",{"0":{"116":1},"2":{"6":1,"7":3,"9":1,"10":1,"69":2,"102":1,"108":1,"111":1,"116":4}}],["библиотеку",{"0":{"104":1},"2":{"1":1,"7":2,"106":1,"109":1,"111":1,"116":1}}],["бизнес",{"2":{"3":1,"37":1,"106":5,"108":1}}],["баги",{"2":{"109":1}}],["база",{"2":{"103":1,"106":1}}],["базам",{"2":{"103":1}}],["базой",{"2":{"51":1}}],["базовые",{"2":{"77":1}}],["базовых",{"2":{"9":1,"76":1}}],["базовую",{"2":{"60":1,"109":1}}],["базовой",{"2":{"85":1}}],["базовом",{"2":{"7":1,"117":1}}],["базовое",{"2":{"6":1}}],["базе",{"2":{"3":3,"56":1,"69":1,"106":1}}],["базу",{"2":{"3":1}}],["базы",{"2":{"3":1}}],["бандле",{"2":{"102":1}}],["бандлер",{"2":{"49":1,"77":1}}],["бандлеры",{"2":{"49":1}}],["бандла",{"2":{"99":1,"110":1}}],["бандл",{"2":{"3":1,"99":1,"105":1,"116":1}}],["бешено",{"2":{"103":1}}],["бесполезно",{"2":{"117":1}}],["беспокоиться",{"2":{"67":1}}],["бесплатными",{"2":{"98":1}}],["бесплатные",{"2":{"3":3,"98":1,"117":1}}],["бесплатно",{"2":{"70":1,"117":1}}],["бесплатной",{"2":{"8":1}}],["бегло",{"2":{"9":1}}],["безвозвратно",{"2":{"104":1}}],["безусловно",{"2":{"72":1}}],["безопасны",{"2":{"69":1}}],["безопасностью",{"2":{"37":1}}],["безопасность",{"2":{"2":3}}],["безопасности",{"2":{"2":2,"36":1,"109":1}}],["без",{"2":{"3":2,"7":1,"31":1,"51":1,"59":1,"66":1,"69":1,"71":1,"95":1,"101":1,"103":1,"107":1,"108":2,"116":1,"117":1,"118":1}}],["бывают",{"2":{"33":1,"36":1,"107":1}}],["бывает",{"2":{"5":1,"33":1,"40":1,"106":1}}],["быстрей",{"2":{"102":1,"103":1,"108":1,"113":1}}],["быстрее",{"2":{"102":1}}],["быстрый",{"2":{"10":1,"103":1}}],["быстрого",{"2":{"107":1}}],["быстро",{"2":{"7":1,"27":1,"33":2,"36":1,"109":1,"116":1}}],["была",{"2":{"65":1,"71":1,"105":1,"116":1,"118":1}}],["было",{"2":{"19":1,"31":1,"57":1,"64":1,"65":1,"66":1,"70":4,"73":1,"105":1,"108":3}}],["был",{"2":{"7":1,"25":1,"38":1,"49":1,"53":1,"98":2,"106":2,"118":1}}],["были",{"2":{"6":3}}],["быть",{"2":{"2":1,"7":3,"9":1,"10":1,"11":3,"14":1,"15":1,"18":1,"19":3,"31":3,"34":2,"37":1,"38":1,"50":1,"58":1,"62":1,"63":2,"64":2,"66":2,"70":1,"72":1,"73":1,"76":1,"97":4,"99":1,"105":1,"107":1,"109":1,"112":1,"117":1,"118":3,"139":1}}],["бы",{"2":{"2":1,"31":1,"37":3,"53":2,"56":3,"64":1,"65":3,"69":1,"70":4,"117":2}}],["бота",{"2":{"118":2}}],["ботов",{"2":{"118":1}}],["боялся",{"2":{"117":1}}],["боковым",{"2":{"109":1}}],["бо́льшая",{"2":{"108":1}}],["бойлерплейта",{"2":{"108":1}}],["бойскаута",{"2":{"39":1}}],["бонусная",{"0":{"93":1},"2":{"93":1}}],["бонусами",{"2":{"2":1}}],["большую",{"2":{"38":1,"69":1,"71":1,"108":1}}],["большом",{"2":{"71":1}}],["большое",{"2":{"32":1,"38":1,"61":1}}],["большой",{"2":{"11":1,"31":1,"40":1}}],["большого",{"2":{"7":1}}],["больше",{"2":{"8":1,"15":1,"19":1,"20":1,"31":1,"36":1,"40":1,"45":1,"61":1,"71":2,"103":2,"108":2,"117":1,"118":2}}],["большей",{"2":{"7":1,"11":1,"28":1}}],["большая",{"2":{"7":1,"117":1}}],["больших",{"2":{"11":1,"15":2,"97":1,"107":1,"108":3}}],["большим",{"2":{"10":1,"105":1,"107":2}}],["большими",{"2":{"3":1,"47":1,"108":1}}],["большинства",{"2":{"56":1,"69":1}}],["большинстве",{"2":{"7":1,"71":2,"105":1,"118":1}}],["большинство",{"2":{"3":2,"6":1,"37":1,"117":1}}],["большие",{"2":{"2":1}}],["более",{"2":{"2":1,"4":2,"5":1,"7":1,"8":1,"10":1,"11":3,"16":1,"17":1,"25":1,"28":1,"31":1,"37":1,"48":1,"50":1,"58":1,"63":1,"64":1,"65":1,"66":2,"69":2,"72":5,"76":2,"97":1,"99":1,"102":1,"105":1,"106":1,"108":3,"109":1,"117":2}}],["бороться",{"2":{"2":1}}],["бэке",{"2":{"5":1,"108":2}}],["бэкенде",{"2":{"5":1,"117":2}}],["бэкенда",{"2":{"3":1,"4":2,"118":1}}],["бэкенд",{"0":{"3":1},"2":{"2":5,"3":5,"4":2,"98":1,"107":1,"108":1}}],["бэкенду",{"2":{"1":1}}],["бэкендом",{"0":{"0":1},"1":{"1":1},"2":{"1":2,"4":1,"121":1}}],["бэком",{"2":{"5":1}}],["бэкапов",{"2":{"97":1}}],["бэкапить",{"2":{"97":1}}],["бэка",{"2":{"2":1,"3":1,"108":1}}],["бэк",{"2":{"1":1,"2":2,"3":1,"103":1}}],["дня",{"2":{"117":1}}],["дней",{"2":{"113":1,"117":1}}],["дни",{"2":{"32":1}}],["дриллинг",{"2":{"106":1}}],["друга",{"2":{"66":1}}],["другая",{"2":{"64":1,"66":1}}],["другую",{"2":{"66":1,"111":1}}],["друг",{"2":{"36":1,"66":1,"70":1,"109":1}}],["других",{"2":{"7":2,"19":2,"32":1,"33":1,"39":1,"48":1,"50":2,"51":1,"76":1,"98":1,"108":2}}],["другими",{"2":{"31":1,"36":1,"43":1,"47":1,"59":1,"69":1,"72":1,"95":1,"106":1,"109":1,"118":1}}],["другим",{"2":{"7":1,"11":1}}],["другие",{"2":{"3":1,"5":1,"6":3,"7":1,"9":1,"10":3,"11":2,"18":1,"34":1,"49":1,"56":1,"60":1,"64":1,"65":1,"72":1,"77":1,"83":1,"93":1,"98":1,"99":1,"103":1,"108":1,"115":1,"118":1}}],["другого",{"2":{"11":1,"37":1,"39":2,"56":1,"64":1,"65":1,"69":1,"106":2}}],["другое",{"2":{"7":1,"11":2,"19":1,"72":1,"106":1}}],["другой",{"2":{"4":1,"7":1,"9":1,"28":1,"56":1,"60":1,"63":1,"71":1,"97":1,"106":4,"109":1,"117":1}}],["другому",{"2":{"39":1,"62":1}}],["другом",{"2":{"3":1,"11":1,"36":1,"70":1,"101":1,"109":1}}],["дюймов",{"2":{"103":1}}],["думать",{"2":{"76":1}}],["думаю",{"2":{"33":1}}],["дубликаты",{"2":{"61":1}}],["дублирование",{"2":{"37":1,"45":1}}],["дэвиду",{"2":{"37":1}}],["длинных",{"2":{"72":1}}],["длиной",{"2":{"33":1}}],["длительных",{"2":{"72":1}}],["для",{"0":{"3":1,"27":1,"39":1,"74":1,"77":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"1":1,"2":4,"3":3,"4":3,"5":5,"6":4,"7":8,"8":5,"9":5,"10":9,"11":11,"15":2,"16":2,"18":3,"19":6,"20":1,"22":1,"25":4,"26":1,"27":2,"28":4,"31":2,"32":3,"33":1,"34":1,"36":4,"37":1,"38":1,"39":3,"40":7,"46":1,"48":1,"50":3,"51":2,"53":1,"55":3,"56":6,"57":5,"58":2,"60":1,"61":5,"62":5,"63":2,"64":6,"65":7,"66":4,"67":1,"68":1,"69":10,"70":7,"72":16,"73":2,"76":3,"77":2,"78":1,"79":1,"80":1,"84":1,"85":1,"87":1,"88":2,"89":2,"90":1,"91":1,"92":1,"94":1,"95":1,"97":12,"98":3,"99":2,"100":1,"101":2,"102":8,"103":9,"104":2,"105":7,"106":5,"107":3,"108":8,"109":4,"111":1,"112":2,"113":1,"115":1,"116":2,"117":6,"118":18,"139":1}}],["дыхательной",{"2":{"31":1}}],["директорий",{"2":{"100":1}}],["директорию",{"2":{"97":1}}],["директория",{"2":{"97":2}}],["директива",{"2":{"12":1,"13":1,"14":1,"17":1,"18":1}}],["директивами",{"2":{"12":1}}],["директив",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"18":1,"19":2,"26":1}}],["директивы",{"2":{"10":1,"12":2,"15":1,"18":2,"27":1}}],["дизайнером",{"2":{"93":1}}],["дизайна",{"2":{"86":1,"108":1}}],["дизайн",{"2":{"44":1,"138":1}}],["динамической",{"2":{"118":1}}],["динамическое",{"2":{"12":1}}],["динамически",{"2":{"118":1}}],["динамично",{"2":{"99":1,"108":1}}],["динамичным",{"2":{"33":1}}],["диаграммы",{"2":{"115":1}}],["диаграмме",{"2":{"31":1}}],["диаграмму",{"2":{"9":1}}],["диспетчере",{"2":{"61":1}}],["диспетчером",{"2":{"60":1}}],["диспетчера",{"2":{"60":2,"61":1}}],["дисциплине",{"2":{"80":1}}],["дисциплинах",{"2":{"33":1}}],["дисциплиной",{"2":{"28":1}}],["дисковое",{"2":{"102":1}}],["диск",{"2":{"2":1,"103":1}}],["д",{"2":{"3":1,"7":1,"8":1,"10":1,"11":2,"17":1,"19":1,"31":1,"57":1,"60":1,"64":1,"67":1,"72":1,"114":1,"118":1}}],["дойти",{"2":{"118":1}}],["домашний",{"2":{"118":1}}],["доменов",{"2":{"4":1,"31":1}}],["доменом",{"2":{"4":1}}],["домен",{"2":{"4":1,"98":3,"117":1}}],["домена",{"2":{"4":4,"98":1}}],["доброжелательные",{"2":{"117":1}}],["добавьте",{"2":{"97":1}}],["добавили",{"2":{"11":1}}],["добавить",{"2":{"66":1,"103":1,"109":2,"116":1}}],["добавит",{"2":{"4":1}}],["добавление",{"2":{"105":1,"108":1,"137":1}}],["добавления",{"2":{"7":1,"32":1,"63":1,"64":1,"66":3}}],["добавляются",{"2":{"118":1}}],["добавлять",{"2":{"69":1}}],["добавляя",{"2":{"60":1,"68":1}}],["добавлялись",{"2":{"6":1}}],["добавляется",{"2":{"99":1}}],["добавляет",{"2":{"4":1,"66":1,"109":1,"116":1}}],["документ",{"2":{"116":1}}],["документирования",{"2":{"115":1}}],["документируйте",{"0":{"115":1}}],["документаций",{"2":{"118":1}}],["документация",{"2":{"106":1,"117":3,"139":1}}],["документации",{"2":{"18":1,"19":1,"72":1,"97":1,"99":1,"117":1,"138":1}}],["документацию",{"2":{"7":1,"19":1,"39":1}}],["документа",{"2":{"14":1}}],["допустим",{"2":{"109":1}}],["дополнили",{"2":{"69":1}}],["дополнительный",{"2":{"72":1}}],["дополнительных",{"2":{"11":1,"95":1}}],["дополнительным",{"2":{"9":1}}],["дополнительные",{"2":{"6":1,"7":1,"62":1,"66":1,"90":1,"118":1}}],["дополнительной",{"2":{"7":2,"66":1}}],["дополняем",{"2":{"68":1}}],["дополнять",{"2":{"67":1}}],["дополняющего",{"2":{"66":1}}],["дополнение",{"2":{"58":1}}],["доскролил",{"2":{"105":1}}],["достойны",{"2":{"117":1}}],["достоинствами",{"2":{"32":1}}],["доставка",{"2":{"95":1}}],["доставки",{"2":{"8":1}}],["достаточно",{"2":{"37":1,"49":1,"58":1,"66":1,"71":1,"103":1,"104":1,"108":1,"109":1,"118":1}}],["достигнем",{"2":{"31":1}}],["достижения",{"2":{"31":1}}],["достижений",{"2":{"10":1}}],["доступе",{"2":{"117":1}}],["доступен",{"2":{"98":1}}],["доступной",{"2":{"106":1}}],["доступна",{"2":{"106":1}}],["доступных",{"2":{"76":1}}],["доступны",{"2":{"11":1,"99":1}}],["доступа",{"2":{"2":5,"3":1,"4":1,"11":1,"46":1,"47":1,"50":1,"97":1,"103":1}}],["доступ",{"2":{"1":1,"2":3,"3":3,"4":8,"11":4,"47":1,"64":1,"98":1,"99":1,"106":2}}],["дочерний",{"2":{"33":2}}],["дочерние",{"2":{"19":1}}],["дочернего",{"2":{"11":1}}],["дорогим",{"2":{"64":1}}],["дороги",{"2":{"15":1}}],["догадались",{"2":{"10":1,"56":1}}],["до",{"2":{"6":2,"7":2,"9":1,"11":1,"18":1,"19":1,"26":2,"31":1,"39":1,"53":1,"64":1,"66":1,"67":1,"69":1,"72":1,"86":1,"99":1,"105":1,"118":3}}],["доводить",{"2":{"26":1}}],["довольно",{"2":{"3":2,"5":1,"40":1,"50":1,"59":1,"64":2,"65":1,"72":1,"103":1,"117":1,"118":1}}],["доверенных",{"2":{"4":2}}],["должна",{"2":{"7":1,"10":1,"11":1,"19":1,"31":3,"70":1,"97":1,"117":1}}],["должны",{"2":{"7":1,"9":2,"28":1,"29":2,"33":1,"34":3,"37":1,"38":1,"39":1,"40":1,"61":1,"72":1,"99":1,"105":1,"112":1}}],["должном",{"2":{"116":1}}],["должно",{"2":{"2":1,"3":1,"18":1,"107":1}}],["должен",{"2":{"2":1,"7":2,"16":1,"32":1,"33":1,"36":1,"37":1,"46":1,"54":1,"56":2,"60":1,"63":1,"64":1,"67":3,"78":1,"97":2,"106":1,"118":1}}],["дольше",{"2":{"2":1}}],["движению",{"2":{"69":1}}],["движущихся",{"2":{"69":1}}],["двоеточия",{"2":{"18":1}}],["двоеточие",{"2":{"13":1}}],["двойные",{"2":{"8":1}}],["двусмысленное",{"2":{"106":1}}],["двусторонним",{"2":{"17":1}}],["двумя",{"2":{"65":1}}],["двум",{"2":{"36":1}}],["двухдневный",{"2":{"117":1}}],["двух",{"2":{"7":1}}],["двунаправленную",{"2":{"5":1}}],["дважды",{"2":{"37":1}}],["два",{"2":{"2":1,"11":1,"16":1,"19":1,"39":1,"59":1,"60":1,"65":1,"70":1,"72":1,"109":1,"117":2,"118":2}}],["двери",{"2":{"37":1}}],["две",{"2":{"2":1,"5":1,"11":1,"72":2}}],["даст",{"2":{"108":1}}],["даёт",{"2":{"103":1,"108":1,"117":1}}],["дат",{"2":{"105":1}}],["датами",{"2":{"104":1}}],["дату",{"2":{"97":1}}],["датой",{"2":{"97":1}}],["дать",{"2":{"2":1}}],["давид",{"2":{"80":1}}],["давайте",{"2":{"7":2,"8":1,"10":1,"11":2,"20":1,"40":1,"45":1,"52":1,"58":1,"60":1,"61":1,"64":1,"65":1,"70":1}}],["давать",{"2":{"2":1}}],["да",{"2":{"11":2,"50":1,"66":1,"72":1}}],["даже",{"2":{"2":1,"4":1,"6":2,"7":2,"19":1,"26":1,"30":1,"37":1,"40":1,"55":1,"63":1,"64":1,"69":1,"105":1,"106":2,"108":1,"116":1,"117":2}}],["дает",{"2":{"2":1,"5":2,"11":1,"14":1,"28":1,"40":1,"65":1,"105":1}}],["дал",{"2":{"106":1}}],["дальнейших",{"2":{"80":1}}],["дальнейшей",{"2":{"19":1,"27":1}}],["дальнейшем",{"2":{"9":1,"18":1,"40":1,"116":1}}],["дальше",{"2":{"2":1,"7":1,"113":1}}],["далеко",{"2":{"3":1,"37":1,"107":1,"110":1}}],["далее",{"2":{"2":1,"7":1,"8":1,"11":1,"25":1,"31":2,"48":1,"71":1}}],["данная",{"2":{"61":1,"108":1,"118":1}}],["данную",{"2":{"30":1}}],["данного",{"0":{"137":1},"2":{"64":1,"97":1,"105":1,"106":1,"109":1}}],["данном",{"2":{"7":1,"8":1,"10":1,"11":1,"56":2,"97":1,"106":1,"108":1}}],["данной",{"2":{"2":1,"12":1,"28":1,"33":1,"36":1,"40":1}}],["данный",{"2":{"11":1,"30":1,"33":1,"53":1,"60":1,"63":1,"116":1,"139":1}}],["данным",{"2":{"4":1,"46":1,"117":1}}],["данными",{"2":{"3":3,"66":1}}],["данных",{"0":{"89":1},"2":{"3":7,"4":1,"5":1,"7":2,"11":3,"16":1,"17":1,"36":1,"42":1,"45":1,"51":3,"58":1,"59":1,"62":1,"69":1,"89":2,"103":2,"106":4,"108":2,"109":1,"117":1,"118":1}}],["данные",{"2":{"2":2,"3":3,"4":1,"22":1,"34":2,"61":3,"62":2,"64":1,"66":1,"68":1,"105":1,"106":3,"108":4,"117":1,"118":3}}],["детей",{"2":{"117":1}}],["детали",{"2":{"115":1}}],["детализирована",{"2":{"31":1}}],["детальную",{"2":{"109":1}}],["деталей",{"2":{"38":1}}],["деталях",{"2":{"17":1}}],["декомпозиции",{"2":{"108":1}}],["декораторов",{"2":{"66":2}}],["декораторы",{"2":{"66":3,"68":1}}],["декораторами",{"2":{"69":1}}],["декораторам",{"2":{"66":1}}],["декоратора",{"2":{"40":1,"66":2,"68":1,"69":1}}],["декоратор",{"0":{"66":1},"1":{"67":1,"68":1},"2":{"28":1,"65":1,"66":3,"67":2}}],["декларируемое",{"2":{"106":1}}],["деньги",{"2":{"103":1}}],["десктоп",{"2":{"118":1}}],["десятки",{"2":{"102":1,"103":1}}],["десятилетнем",{"2":{"101":1}}],["дестабилизируют",{"2":{"40":1}}],["деплое",{"2":{"97":1}}],["деплоится",{"2":{"97":1}}],["деплоить",{"2":{"97":1}}],["деплой",{"2":{"97":1,"123":1,"124":1}}],["деплоя",{"2":{"97":4,"117":1}}],["депозитами",{"2":{"2":1}}],["девопс",{"2":{"95":1}}],["демонстрации",{"2":{"76":1}}],["демонстрирует",{"2":{"52":1}}],["демонстрирующий",{"2":{"31":1}}],["действующего",{"2":{"69":1}}],["действует",{"2":{"40":1,"64":1}}],["действовать",{"2":{"67":1}}],["действий",{"2":{"95":1}}],["действительно",{"2":{"58":1,"66":1,"101":1,"107":1}}],["действительная",{"2":{"2":1}}],["действии",{"0":{"80":1},"2":{"9":1,"34":2,"69":1,"80":1}}],["действия",{"2":{"2":1,"60":1,"107":1}}],["действие",{"2":{"2":2,"9":1,"63":1,"66":1}}],["держать",{"2":{"117":1}}],["держи",{"0":{"38":1},"2":{"28":2}}],["дереву",{"2":{"53":1,"106":1}}],["дерева",{"2":{"19":1}}],["дерево",{"2":{"9":1,"32":1}}],["делиться",{"2":{"69":1,"106":1}}],["дело",{"2":{"33":1,"64":1}}],["делегируется",{"2":{"62":1}}],["делегировать",{"2":{"37":1,"56":1}}],["деле",{"2":{"25":1,"40":1}}],["делайте",{"2":{"110":1,"112":1}}],["дела",{"2":{"109":1}}],["делающее",{"2":{"106":1}}],["делают",{"2":{"74":1}}],["делали",{"2":{"99":1}}],["делая",{"2":{"66":1}}],["делаем",{"2":{"11":1,"36":2,"72":1}}],["делается",{"2":{"2":1,"11":1,"34":1,"65":1,"76":1}}],["делает",{"2":{"2":1,"5":1,"8":1,"10":1,"53":1,"56":1,"72":1,"102":1,"103":1,"106":1,"108":1}}],["делать",{"2":{"3":1,"4":1,"31":1,"33":1,"40":1,"103":1,"105":1,"106":1,"118":2}}],["тэгов",{"2":{"116":1}}],["тяжеловеса",{"2":{"105":1}}],["тяжеловесности",{"2":{"104":1}}],["тише",{"2":{"103":1}}],["тип",{"2":{"116":1}}],["типов",{"2":{"51":1,"107":1}}],["типизированным",{"2":{"33":1}}],["типыref",{"2":{"106":1}}],["типы",{"2":{"17":1,"106":1}}],["типа",{"2":{"4":1,"10":1,"41":1,"70":1,"98":1,"99":1,"102":1,"109":1,"116":3,"117":1,"118":1}}],["тканей",{"2":{"31":1}}],["тайлвинде",{"2":{"113":1}}],["таймстемпа",{"2":{"97":1}}],["тарифы",{"2":{"98":1}}],["таблицы",{"2":{"6":1,"51":1}}],["там",{"2":{"3":1,"97":2,"103":1,"106":1,"107":1}}],["такая",{"2":{"37":1}}],["такую",{"2":{"9":1}}],["таки",{"2":{"117":1,"118":1}}],["таких",{"2":{"33":1,"72":2}}],["такие",{"2":{"7":1,"17":2,"29":1,"69":1}}],["такими",{"2":{"31":1,"36":1,"78":2}}],["таким",{"2":{"2":2,"3":1,"8":1,"9":1,"16":1,"50":2,"56":1,"64":1,"67":1,"72":1,"116":1}}],["также",{"2":{"2":2,"3":1,"6":2,"7":3,"10":3,"11":1,"12":2,"18":2,"19":2,"25":1,"29":1,"32":1,"33":2,"36":1,"39":1,"40":1,"45":1,"49":1,"50":1,"55":2,"58":1,"60":2,"62":3,"64":1,"65":2,"66":1,"67":1,"68":2,"69":1,"71":1,"72":2,"76":1,"78":1,"88":1,"90":1,"91":2,"98":1,"102":1,"103":1,"106":1,"107":1,"108":2,"111":1,"116":2,"117":5,"118":1,"137":1}}],["такого",{"2":{"11":1,"31":1,"45":1,"56":1}}],["такой",{"2":{"11":1,"32":1,"33":1,"55":1,"59":1,"72":1,"118":1}}],["таковыми",{"2":{"116":1}}],["таковы",{"2":{"7":1}}],["такового",{"2":{"2":1}}],["такое",{"0":{"40":1},"2":{"2":2,"3":1,"4":1,"5":1,"6":1,"7":2,"9":1,"19":1,"27":1,"71":1,"74":1,"95":1,"97":1,"106":1,"107":1,"108":1,"109":1,"116":1,"118":1}}],["так",{"2":{"1":1,"2":1,"5":1,"6":1,"7":1,"8":1,"11":3,"15":2,"25":1,"31":1,"33":1,"37":2,"39":1,"40":1,"58":1,"59":1,"61":1,"66":3,"70":1,"72":1,"73":1,"74":2,"97":3,"102":1,"103":1,"106":2,"107":1,"117":1,"118":3,"139":2}}],["т",{"2":{"3":1,"7":1,"8":1,"10":1,"11":2,"17":1,"19":1,"31":1,"57":1,"60":1,"64":1,"67":1,"72":1,"107":1,"109":1,"114":1,"118":1,"138":1}}],["тупиковой",{"2":{"118":1}}],["ту",{"2":{"61":1}}],["туда",{"2":{"3":1,"10":1,"112":1}}],["тут",{"2":{"3":1}}],["творчества",{"2":{"40":1}}],["твой",{"2":{"2":1,"3":1,"103":1}}],["твоего",{"2":{"2":1}}],["твоему",{"2":{"2":1,"3":1}}],["твоем",{"2":{"2":1,"103":1}}],["тысячи",{"2":{"69":1}}],["тысяч",{"2":{"33":1}}],["ты",{"2":{"2":1,"109":1}}],["телеграм",{"2":{"139":1}}],["телодвижения",{"2":{"2":1}}],["тенденции",{"2":{"116":1}}],["тенденцию",{"2":{"33":1}}],["тень",{"2":{"109":1}}],["тебе",{"2":{"109":1}}],["теcты",{"2":{"107":1}}],["теории",{"2":{"70":2}}],["теоретические",{"2":{"109":1}}],["теоретически",{"2":{"7":1}}],["тест",{"2":{"117":1}}],["тестов",{"2":{"107":3}}],["тестовые",{"2":{"91":1}}],["тесты",{"2":{"107":7,"118":1}}],["тестам",{"2":{"106":1}}],["тестированием",{"2":{"107":2}}],["тестирование",{"0":{"91":1,"107":1},"2":{"107":2}}],["тестирования",{"2":{"3":1,"76":1,"91":1,"95":1,"97":1,"107":2}}],["тесную",{"2":{"58":1}}],["те",{"2":{"12":1,"29":1,"61":1,"66":1,"73":1}}],["течение",{"2":{"11":1}}],["текущей",{"2":{"97":1,"105":1}}],["текущему",{"2":{"11":1}}],["текстовое",{"2":{"118":1}}],["текстов",{"0":{"91":1}}],["текстовый",{"2":{"10":1,"118":1}}],["текстами",{"2":{"91":1}}],["текста",{"2":{"72":1}}],["текст",{"2":{"17":1,"118":2}}],["тегов",{"2":{"67":1}}],["теге",{"2":{"12":1}}],["тег",{"2":{"8":1,"10":3,"11":1,"66":1}}],["тега",{"2":{"8":2}}],["технического",{"2":{"115":1,"117":1}}],["техники",{"2":{"28":1}}],["технологиями",{"2":{"78":2}}],["технология",{"2":{"69":1,"95":1}}],["технологии",{"2":{"6":1,"28":1,"77":1,"102":1,"117":1}}],["технологий",{"2":{"6":1,"69":2}}],["тех",{"2":{"7":1,"19":1,"32":1,"39":1,"53":1,"70":1,"72":1,"118":1}}],["теперь",{"2":{"7":1,"11":3,"19":1,"52":1,"53":1,"64":1,"66":2,"69":3,"71":2,"72":3}}],["терминологией",{"2":{"7":1}}],["терминов",{"2":{"7":1}}],["терминами",{"2":{"7":1}}],["темам",{"2":{"139":1}}],["темы",{"2":{"6":1,"109":1}}],["теми",{"2":{"6":1,"58":1}}],["тему",{"2":{"5":1,"107":1}}],["тем",{"2":{"5":2,"7":2,"9":1,"10":1,"11":2,"17":1,"38":1,"60":1,"65":1,"69":1,"70":1,"71":1,"72":1,"106":1}}],["теме",{"2":{"2":1,"4":1,"40":1}}],["трудозатратней",{"2":{"118":1}}],["трудозатратам",{"2":{"118":1}}],["труднее",{"2":{"38":1}}],["трудночитаемый",{"2":{"39":1}}],["трудно",{"2":{"11":1,"33":1}}],["трудностями",{"2":{"7":1}}],["трудностей",{"2":{"5":1}}],["тремя",{"2":{"72":1}}],["требованиям",{"2":{"78":1}}],["требования",{"2":{"78":1,"116":1,"118":1}}],["требований",{"2":{"2":1,"78":1}}],["требовать",{"2":{"55":1}}],["требуются",{"2":{"105":1}}],["требуют",{"2":{"19":1,"98":1}}],["требуеться",{"2":{"102":1}}],["требует",{"2":{"5":1,"28":1,"102":1}}],["требуется",{"2":{"3":1}}],["тривиального",{"2":{"11":1}}],["три",{"2":{"10":1,"33":1,"64":1,"65":1,"68":1,"72":1,"97":2}}],["трагедия",{"2":{"116":1}}],["традиционным",{"2":{"72":1}}],["традиционно",{"2":{"10":1,"50":1,"72":1}}],["традиционном",{"2":{"7":2}}],["тратить",{"2":{"39":1}}],["транспиляции",{"2":{"102":1}}],["транспортные",{"2":{"5":1,"117":1}}],["транспортным",{"2":{"1":1}}],["трансформацию",{"2":{"6":1}}],["товаров",{"2":{"109":1}}],["товара",{"2":{"2":1,"109":1,"118":1}}],["торопитесь",{"2":{"110":1}}],["тормозит",{"2":{"109":1}}],["торговые",{"2":{"7":1}}],["тоже",{"2":{"108":1,"118":1}}],["тонкую",{"2":{"103":1}}],["тонкий",{"2":{"11":2}}],["толку",{"2":{"71":1}}],["только",{"2":{"2":2,"3":1,"4":2,"7":1,"8":1,"9":1,"10":1,"11":2,"13":2,"15":1,"20":1,"28":1,"33":1,"34":2,"37":2,"39":1,"46":1,"47":1,"63":1,"72":2,"95":1,"101":1,"103":3,"105":2,"106":4,"108":1,"113":1,"116":2}}],["той",{"2":{"15":1,"31":1,"38":1,"39":1,"66":1,"97":1,"106":1}}],["точней",{"2":{"118":1}}],["точно",{"2":{"4":1,"25":1,"66":1}}],["точка",{"2":{"118":1}}],["точке",{"2":{"38":1}}],["точки",{"2":{"10":1,"70":1,"106":3,"138":1}}],["точку",{"2":{"8":1,"50":1,"62":1}}],["тот",{"2":{"7":2,"11":1,"37":1,"49":1,"59":1,"64":3,"65":1,"66":2,"67":1,"68":1,"69":1,"71":1,"72":1,"108":1,"117":1}}],["томасу",{"2":{"37":1}}],["тому",{"2":{"36":1,"39":1}}],["том",{"2":{"6":1,"7":4,"8":1,"9":1,"11":1,"15":1,"34":1,"37":1,"39":2,"40":1,"53":1,"58":1,"63":1,"65":2,"69":1,"72":1,"118":1}}],["тобой",{"2":{"3":1}}],["то",{"2":{"2":4,"3":3,"7":7,"9":1,"10":2,"11":3,"13":2,"14":1,"19":1,"27":2,"31":1,"33":1,"36":5,"37":3,"39":4,"40":1,"49":1,"50":1,"51":1,"53":3,"55":1,"56":2,"63":1,"64":5,"65":3,"66":3,"70":1,"72":1,"78":1,"97":1,"98":1,"102":1,"103":1,"105":2,"106":5,"107":4,"108":1,"109":3,"111":2,"117":4,"118":6}}],["того",{"2":{"2":1,"7":2,"8":2,"11":7,"18":1,"27":1,"28":2,"31":1,"32":1,"34":1,"36":1,"38":1,"50":1,"54":1,"55":1,"57":1,"61":3,"62":1,"63":1,"65":1,"66":1,"71":1,"72":1,"76":1,"92":1,"97":3,"102":2,"106":1,"108":1,"109":1,"110":1,"118":3}}],["тогда",{"2":{"1":1,"18":1,"59":1,"66":1,"72":1}}],["токена",{"2":{"2":2}}],["токенах",{"2":{"2":2}}],["токеном",{"2":{"2":1}}],["токену",{"2":{"2":1}}],["токен",{"2":{"2":7,"138":2}}],["вклад",{"2":{"39":1}}],["включить",{"2":{"33":1}}],["включенные",{"2":{"30":1}}],["включается",{"2":{"70":1,"103":1}}],["включает",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"36":1,"37":1,"60":1}}],["включать",{"2":{"6":1,"103":1}}],["включая",{"2":{"6":1,"32":1,"102":1,"103":1,"116":1}}],["вряд",{"2":{"117":1}}],["вроде",{"2":{"106":1,"118":1}}],["вращающихся",{"2":{"103":1}}],["вручную",{"2":{"36":2}}],["время",{"2":{"7":2,"8":2,"9":1,"11":1,"19":1,"39":1,"53":1,"64":1,"66":1,"67":1,"71":1,"72":2,"76":1,"103":1,"105":1,"106":1,"107":5,"109":1,"110":1,"112":1,"117":1}}],["времена",{"2":{"116":1}}],["временами",{"2":{"6":1}}],["времени",{"2":{"11":1,"65":1,"69":1,"70":1,"71":1,"107":1,"112":1,"116":1,"117":1}}],["временем",{"2":{"11":1,"60":1,"97":1}}],["временное",{"2":{"4":1}}],["вторых",{"2":{"117":1}}],["вторично",{"2":{"103":1}}],["второй",{"2":{"50":1,"103":3}}],["втором",{"2":{"2":2,"64":1}}],["вторая",{"2":{"36":1}}],["влияющий",{"2":{"71":1}}],["влияют",{"2":{"36":1,"44":1}}],["влиять",{"2":{"29":1}}],["влияет",{"2":{"12":1,"110":1}}],["введите",{"2":{"137":1}}],["введи",{"2":{"109":1}}],["введенный",{"2":{"105":1}}],["введен",{"2":{"38":1}}],["введение",{"2":{"34":1}}],["введем",{"2":{"8":1}}],["вверх",{"2":{"53":1}}],["вводились",{"2":{"108":1}}],["вводить",{"2":{"110":1}}],["вводит",{"2":{"17":1}}],["вводе",{"2":{"108":1}}],["вводных",{"2":{"85":1}}],["ввода",{"2":{"17":1}}],["входе",{"2":{"118":1}}],["входы",{"2":{"67":1}}],["входной",{"2":{"67":1}}],["входные",{"2":{"64":1}}],["входных",{"2":{"51":1,"59":1}}],["вход",{"2":{"66":1}}],["входящие",{"2":{"34":1}}],["входа",{"2":{"10":1,"33":4,"62":1,"108":1,"118":1}}],["входить",{"2":{"66":1}}],["входит",{"2":{"4":1,"138":1}}],["впечатление",{"2":{"138":1}}],["вперед",{"2":{"18":1,"73":1}}],["вплоть",{"2":{"7":1,"31":1}}],["вполне",{"2":{"2":1,"106":1,"108":1,"117":1}}],["взлетевших",{"2":{"108":1}}],["взлететь",{"2":{"103":1}}],["взяли",{"2":{"109":1}}],["взяв",{"2":{"108":1}}],["взять",{"2":{"7":1}}],["взгляд",{"2":{"11":1,"40":1,"66":1,"72":1}}],["взглянуть",{"2":{"5":1}}],["взвесить",{"2":{"7":1}}],["взаимосвязаны",{"2":{"74":1}}],["взаимосвязь",{"2":{"64":1}}],["взаимоотношения",{"2":{"44":1}}],["взаимодействию",{"2":{"69":1}}],["взаимодействие",{"2":{"47":1,"69":3}}],["взаимодействия",{"2":{"37":1,"40":1,"43":1,"109":1}}],["взаимодействий",{"2":{"6":1,"69":1}}],["взаимозаменяемые",{"2":{"7":1,"71":1}}],["вновь",{"2":{"116":1}}],["вносит",{"2":{"116":1}}],["вносите",{"2":{"39":1}}],["вносят",{"2":{"6":1}}],["вниз",{"2":{"70":1,"139":1}}],["внимания",{"2":{"56":1}}],["внимание",{"2":{"6":1,"7":1,"8":3,"10":1,"11":1,"50":1,"60":1,"65":2,"70":1,"72":1,"78":1}}],["внутрь",{"2":{"103":1}}],["внутренняя",{"2":{"66":1}}],["внутренние",{"2":{"108":1}}],["внутренний",{"2":{"36":1}}],["внутренним",{"2":{"34":1,"66":1}}],["внутренних",{"2":{"19":1}}],["внутренне",{"2":{"66":1}}],["внутреннего",{"2":{"56":1,"61":1}}],["внутренней",{"2":{"19":1,"64":1}}],["внутреннему",{"2":{"53":1,"56":1}}],["внутреннем",{"2":{"11":1}}],["внутри",{"2":{"7":3,"8":2,"16":1,"31":1,"58":1,"67":1,"71":1,"72":2,"89":1,"99":1,"105":3,"106":1}}],["вне",{"2":{"70":1}}],["внесения",{"2":{"137":1}}],["внесенных",{"2":{"7":1}}],["внесите",{"0":{"137":1}}],["внести",{"2":{"38":1}}],["внешней",{"2":{"106":1}}],["внешнего",{"2":{"6":1,"66":1}}],["внешние",{"2":{"33":1}}],["внешний",{"2":{"6":1}}],["вместе",{"2":{"5":1,"19":1,"28":1,"38":1,"110":1}}],["вместо",{"2":{"4":1,"9":1,"10":1,"11":1,"28":1,"32":1,"61":1,"62":1,"66":1,"71":1,"102":1,"118":1}}],["ветвью",{"2":{"118":1}}],["ветках",{"2":{"106":1}}],["ветки",{"2":{"97":2}}],["ветку",{"2":{"97":2}}],["вентиляторов",{"2":{"103":1}}],["вести",{"2":{"118":1}}],["веса",{"2":{"116":1}}],["веских",{"2":{"64":1}}],["весь",{"2":{"9":1,"11":1,"37":1,"69":1}}],["весьма",{"2":{"7":1}}],["велосипед",{"2":{"28":1,"61":1,"69":1}}],["великолепным",{"2":{"10":1}}],["ведет",{"2":{"18":1,"64":1,"76":1}}],["ведут",{"2":{"15":1,"16":1}}],["ведущие",{"2":{"9":1}}],["верен",{"2":{"118":1}}],["верстку",{"2":{"116":1}}],["верстать",{"2":{"113":1,"116":1}}],["версию",{"2":{"97":1,"117":1,"118":1}}],["версий",{"2":{"91":2}}],["версии",{"2":{"64":1,"97":2}}],["версия",{"2":{"6":1}}],["верхнего",{"2":{"23":1}}],["вернулся",{"2":{"116":1}}],["вернуть",{"2":{"11":1,"71":1,"72":1}}],["вернемся",{"2":{"66":1}}],["вернетесь",{"2":{"39":1}}],["вернет",{"2":{"4":1}}],["верное",{"2":{"7":1}}],["вероятность",{"2":{"7":1,"107":1,"109":1}}],["веба",{"2":{"116":1}}],["вебсервер",{"2":{"98":1,"103":1,"118":1}}],["вебсервере",{"2":{"98":1}}],["вебсервера",{"2":{"4":1,"103":1}}],["вебсайта",{"2":{"97":1,"138":1}}],["вебсайт",{"2":{"97":1}}],["веб",{"0":{"8":1,"88":1,"90":1},"1":{"9":1},"2":{"4":2,"6":4,"7":2,"8":2,"9":2,"10":1,"13":1,"16":1,"31":2,"33":1,"36":1,"37":2,"38":2,"45":1,"63":1,"69":4,"77":1,"78":3,"86":2,"87":1,"90":1,"103":1,"107":1,"109":2,"118":3}}],["вещи",{"2":{"3":1,"105":1}}],["визуализации",{"2":{"116":1}}],["визуализацию",{"2":{"106":1,"108":1}}],["визуальных",{"2":{"108":1}}],["визуальный",{"2":{"67":1}}],["визуальной",{"2":{"138":1}}],["визуального",{"2":{"86":1}}],["визуальное",{"2":{"67":1}}],["визитной",{"2":{"84":1}}],["википедии",{"2":{"38":1}}],["виртуальный",{"2":{"3":1,"98":1,"117":1}}],["виджетов",{"2":{"106":1}}],["видимой",{"2":{"101":1}}],["видим",{"2":{"40":1,"65":1}}],["видите",{"2":{"37":1,"53":1,"58":1,"64":1,"69":1,"71":1,"72":1}}],["видит",{"2":{"2":1}}],["виду",{"2":{"14":1,"40":1}}],["вида",{"2":{"6":1,"66":1}}],["вид",{"2":{"6":1,"31":1,"67":1}}],["видео",{"2":{"99":1,"117":3,"118":1}}],["видеоролики",{"2":{"80":1}}],["видеть",{"2":{"55":1}}],["видели",{"2":{"18":1,"69":2}}],["виде",{"2":{"3":2,"6":1,"7":2,"10":1,"34":1,"40":1,"51":1,"65":1}}],["видно",{"2":{"2":1,"58":1,"60":1,"68":1,"71":1}}],["вспомним",{"2":{"70":1}}],["вспомогательные",{"2":{"65":2}}],["вспоминать",{"2":{"50":1}}],["всю",{"2":{"40":1}}],["встречал",{"2":{"117":1}}],["встречающихся",{"2":{"77":1}}],["встречающиеся",{"2":{"40":1}}],["встречаются",{"2":{"28":1,"40":1,"41":1}}],["встречается",{"2":{"33":1,"69":1}}],["встретить",{"2":{"20":1,"25":1,"33":1}}],["встроенный",{"2":{"64":1}}],["встроенные",{"0":{"19":1}}],["встроенных",{"0":{"12":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"18":1,"19":1}}],["встроенного",{"2":{"6":1}}],["вставке",{"2":{"19":1}}],["вступает",{"2":{"9":1}}],["вскоре",{"2":{"6":1}}],["всём",{"2":{"106":1}}],["всё",{"2":{"4":1,"103":1,"108":2,"109":1,"117":1,"118":1,"138":1}}],["всевозможных",{"2":{"117":1}}],["всей",{"2":{"9":1,"56":1}}],["всегда",{"2":{"7":2,"10":1,"21":1,"25":1,"49":1,"99":1,"106":1,"110":1}}],["всего",{"2":{"2":1,"3":1,"13":1,"28":1,"36":2,"37":2,"39":2,"41":1,"105":2,"106":1,"117":1}}],["всех",{"2":{"4":1,"25":1,"56":1,"69":1,"71":1,"78":1,"108":2,"118":1}}],["всеми",{"2":{"118":2}}],["всемирная",{"2":{"6":1}}],["всему",{"2":{"10":1,"29":1,"36":1,"106":2,"109":1}}],["всем",{"2":{"4":2,"37":1,"46":1,"57":1,"78":1,"105":1,"109":1}}],["все",{"0":{"35":1},"2":{"2":1,"6":3,"7":1,"8":1,"9":1,"10":2,"11":5,"14":1,"18":1,"19":1,"20":1,"25":2,"26":1,"33":1,"36":1,"38":1,"46":1,"56":1,"58":2,"66":1,"72":1,"76":1,"105":1,"108":1,"116":1,"117":1,"118":1}}],["всячески",{"2":{"137":1}}],["всяких",{"2":{"118":1}}],["вся",{"2":{"1":1,"116":1}}],["воркер",{"2":{"138":1}}],["вообще",{"2":{"99":1,"101":1,"103":2,"118":1}}],["военно",{"2":{"38":1}}],["вовсе",{"2":{"31":1}}],["восклицательных",{"2":{"68":1}}],["восприятия",{"2":{"72":1,"73":1}}],["воспринимайте",{"2":{"7":1}}],["воспользоваться",{"2":{"27":1,"32":1,"103":1,"118":1}}],["восстановлено",{"2":{"19":1}}],["волшебству",{"2":{"69":1}}],["волшебства",{"2":{"7":1}}],["волнуйтесь",{"2":{"9":1}}],["вопросах",{"2":{"139":1}}],["вопроса",{"2":{"137":1}}],["вопросами",{"2":{"27":1}}],["вопросе",{"2":{"117":1}}],["вопросов",{"2":{"117":1,"139":1}}],["вопросом",{"2":{"107":1}}],["вопросу",{"2":{"45":1}}],["вопросы",{"0":{"27":1,"74":1},"2":{"27":1,"139":1}}],["вопрос",{"2":{"7":2,"117":1,"137":1}}],["вот",{"2":{"4":1,"5":1,"10":1,"11":2,"16":1,"17":1,"41":1,"47":1,"50":1,"54":1,"57":1,"60":1,"62":1,"65":1,"66":1,"69":1,"72":2,"103":1,"104":1,"109":1,"117":1}}],["во",{"0":{"106":1},"2":{"2":2,"8":3,"9":1,"11":1,"19":1,"25":1,"28":1,"33":1,"37":1,"46":1,"56":1,"57":1,"64":1,"66":1,"67":1,"71":1,"72":1,"103":2,"105":4,"106":7,"107":1,"108":3,"116":1,"117":2,"118":1}}],["возможным",{"2":{"106":1}}],["возможной",{"2":{"74":1}}],["возможностях",{"2":{"118":1}}],["возможностей",{"2":{"6":1,"51":1,"72":1,"103":1,"104":1,"105":1,"118":1}}],["возможности",{"0":{"114":1},"2":{"6":3,"33":1,"97":1,"102":1,"105":1,"108":1}}],["возможностью",{"2":{"3":1,"98":1}}],["возможность",{"2":{"2":2,"3":3,"7":1,"11":1,"29":1,"37":1,"107":1,"108":1,"110":1}}],["возможно",{"2":{"3":1,"11":1,"27":1,"46":1,"69":1,"97":1,"108":3,"109":1}}],["воздействия",{"2":{"69":1}}],["возврата",{"2":{"62":1,"70":1,"72":2}}],["возвращайтесь",{"2":{"117":1}}],["возвращаться",{"2":{"73":1}}],["возвращающая",{"2":{"105":1}}],["возвращающие",{"2":{"72":1}}],["возвращающей",{"2":{"11":1}}],["возвращаем",{"2":{"50":1,"57":2,"65":1,"72":1}}],["возвращаемое",{"2":{"17":1,"65":1}}],["возвращается",{"2":{"99":1}}],["возвращает",{"2":{"2":2,"3":1,"8":2,"11":1,"59":1,"62":1,"72":2}}],["возьмет",{"2":{"8":1}}],["возьмем",{"2":{"7":1,"36":1,"51":1}}],["возрасти",{"2":{"7":1}}],["возникает",{"2":{"7":1}}],["возникнуть",{"2":{"4":1}}],["вокруг",{"2":{"1":1,"106":1}}],["валидация",{"2":{"64":1,"106":1}}],["валиден",{"2":{"2":1}}],["вариаций",{"2":{"60":1}}],["вариациями",{"2":{"40":1}}],["варианта",{"2":{"117":1}}],["вариантам",{"2":{"94":1}}],["вариант",{"2":{"5":1,"7":2,"50":1,"105":1,"117":1}}],["варианты",{"0":{"3":1,"11":1},"2":{"2":1,"6":1,"64":1,"98":1}}],["вариантов",{"2":{"2":1,"7":1,"8":1,"102":1}}],["важен",{"2":{"34":1,"38":1,"39":1,"58":1,"74":1}}],["важных",{"2":{"46":1,"70":1}}],["важный",{"2":{"31":1,"46":1,"72":1}}],["важны",{"2":{"27":1,"107":1}}],["важные",{"2":{"7":1,"73":1,"83":1,"115":1}}],["важно",{"2":{"9":1,"10":1,"11":1,"14":1,"25":2,"36":1,"39":1,"60":1,"63":1,"70":1,"74":1}}],["ванильному",{"2":{"11":1}}],["вам",{"2":{"7":4,"8":1,"10":1,"11":2,"20":1,"27":2,"28":3,"36":2,"39":2,"64":4,"73":2,"76":3,"80":2,"98":1,"99":1,"102":1,"110":1,"116":1,"117":1,"118":1}}],["вас",{"2":{"10":1,"27":1,"36":1,"39":1,"72":1,"105":1,"106":1}}],["васи",{"2":{"2":1}}],["вася",{"2":{"2":1}}],["ваши",{"2":{"106":1}}],["ваша",{"2":{"25":1}}],["ваше",{"2":{"7":1,"39":1,"76":1,"99":1,"110":1,"137":1}}],["вашей",{"2":{"7":1,"50":1,"56":1}}],["вашего",{"2":{"4":1,"7":1,"19":1,"40":1,"44":1,"73":1,"97":2,"98":1,"110":2,"112":1,"118":1}}],["вашему",{"2":{"1":1,"98":2,"106":1}}],["вашем",{"2":{"1":1,"40":1,"78":1,"99":1,"118":1}}],["ваш",{"2":{"3":1,"7":1,"8":1,"25":1,"97":2,"99":1,"105":1,"115":1,"117":1,"118":2}}],["вашу",{"2":{"1":1,"7":1}}],["в",{"0":{"8":1,"12":1,"20":1,"35":1,"80":1,"82":1,"137":1},"1":{"9":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"21":1,"22":1,"23":1,"24":1,"25":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"1":5,"2":18,"3":9,"4":8,"5":1,"6":13,"7":36,"8":13,"9":12,"10":13,"11":37,"12":4,"13":1,"14":1,"15":6,"16":4,"17":5,"18":6,"19":12,"20":3,"21":1,"22":1,"23":1,"24":1,"25":5,"26":2,"27":3,"28":4,"29":2,"30":4,"31":8,"32":3,"33":9,"34":7,"36":13,"37":17,"38":5,"39":6,"40":12,"41":4,"45":5,"46":2,"47":1,"48":4,"49":3,"50":7,"51":3,"52":2,"53":3,"54":1,"55":4,"56":10,"57":5,"58":9,"59":2,"60":4,"61":13,"62":5,"63":14,"64":6,"65":15,"66":21,"67":5,"68":5,"69":13,"70":7,"71":7,"72":21,"73":5,"74":1,"76":1,"78":4,"80":2,"83":1,"84":1,"85":4,"87":1,"88":1,"89":2,"90":3,"91":2,"92":1,"93":1,"94":1,"95":2,"97":15,"98":3,"99":15,"101":1,"102":14,"103":13,"104":2,"105":11,"106":35,"107":5,"108":16,"109":7,"110":2,"116":11,"117":9,"118":22,"124":1,"139":3}}],["выявлении",{"2":{"118":1}}],["выявить",{"2":{"31":1}}],["выше",{"2":{"118":1}}],["вышедшая",{"2":{"117":1}}],["выгоде",{"2":{"118":1}}],["выглядят",{"2":{"104":1,"106":1}}],["выглядел",{"2":{"53":1}}],["выглядеть",{"2":{"1":1,"54":1,"56":1,"57":1,"66":1}}],["выглядит",{"2":{"11":1,"16":1,"71":1,"106":1,"118":2}}],["выучить",{"2":{"117":1}}],["вытекает",{"2":{"64":1}}],["вытеснены",{"2":{"6":1}}],["выносить",{"2":{"60":1}}],["вынести",{"2":{"33":1}}],["выбрать",{"2":{"103":1}}],["выбрасывает",{"2":{"72":1}}],["выбрасываем",{"2":{"56":1}}],["выборе",{"2":{"117":1}}],["выбору",{"2":{"97":1}}],["выбор",{"2":{"58":1}}],["выбирает",{"2":{"8":1}}],["выбирая",{"2":{"7":2}}],["выделяет",{"2":{"108":1}}],["выделяют",{"2":{"66":1}}],["выделить",{"2":{"1":1}}],["выдает",{"2":{"60":2}}],["выдавать",{"2":{"55":1}}],["выстраиваем",{"2":{"72":1}}],["выстраивать",{"2":{"71":1}}],["выстроить",{"2":{"57":1,"72":1}}],["выступать",{"2":{"46":1}}],["высокого",{"2":{"29":1}}],["высокой",{"2":{"6":1}}],["выигрывает",{"2":{"31":1}}],["выигрыш",{"2":{"7":1}}],["вывод",{"2":{"103":1,"118":1}}],["выводит",{"2":{"71":1,"72":1}}],["выводится",{"2":{"65":2}}],["выводим",{"2":{"65":1}}],["вывода",{"2":{"19":1,"71":1}}],["выведет",{"2":{"71":1}}],["выведена",{"2":{"71":1}}],["выведено",{"2":{"71":6,"72":2}}],["выведенных",{"2":{"4":1}}],["вывести",{"2":{"19":1}}],["вычисления",{"2":{"70":1,"71":1,"108":1,"109":1}}],["вычислять",{"2":{"70":1}}],["вычисляем",{"2":{"65":1}}],["вычисляемые",{"2":{"11":1}}],["вычислительной",{"2":{"70":1}}],["вычислительном",{"2":{"15":1}}],["выражаю",{"2":{"80":1}}],["выражение",{"2":{"18":1}}],["выражением",{"2":{"15":1}}],["выработайте",{"2":{"11":1}}],["выработки",{"2":{"7":1}}],["выходные",{"2":{"64":1}}],["выходят",{"2":{"36":1,"39":1}}],["выходящие",{"2":{"6":1}}],["выходит",{"2":{"33":1,"37":1}}],["выходить",{"2":{"33":1}}],["выходы",{"2":{"11":1,"67":1}}],["вы",{"2":{"6":1,"7":7,"8":1,"9":2,"10":4,"11":3,"20":1,"25":3,"27":3,"28":1,"31":1,"33":2,"34":1,"36":5,"37":2,"39":5,"40":1,"49":1,"55":1,"56":3,"64":3,"66":1,"69":3,"71":1,"74":2,"76":1,"77":1,"78":1,"85":1,"98":2,"99":1,"101":1,"102":1,"106":3,"111":1,"113":1,"117":1,"137":1}}],["выполним",{"2":{"71":1}}],["выполнив",{"2":{"68":1}}],["выполнить",{"2":{"56":1,"65":1,"70":1,"72":1,"109":1}}],["выполнит",{"2":{"9":2}}],["выполнена",{"2":{"18":1,"36":1,"70":1}}],["выполнении",{"2":{"72":1}}],["выполнение",{"2":{"62":1,"63":1,"70":1,"71":2,"72":2}}],["выполнением",{"2":{"9":1}}],["выполнения",{"2":{"8":1,"9":3,"18":1,"19":1,"40":1,"62":2,"63":1,"66":2,"67":1,"71":1,"72":1,"97":1,"105":1}}],["выполняем",{"2":{"61":1,"65":1}}],["выполняет",{"2":{"60":1,"63":1,"66":2,"118":1}}],["выполняется",{"2":{"3":1,"11":2,"16":1,"72":1}}],["выполняют",{"2":{"106":1,"108":1,"117":1}}],["выполняются",{"2":{"8":1,"70":2}}],["выполняющий",{"2":{"33":2,"37":1}}],["выполнять",{"2":{"15":1,"33":1,"62":2,"71":2}}],["выписан",{"2":{"2":2}}],["вызван",{"2":{"66":1}}],["вызвало",{"2":{"11":1}}],["вызвать",{"2":{"3":1,"65":1}}],["вызывать",{"2":{"50":1}}],["вызываться",{"2":{"3":1}}],["вызываются",{"2":{"36":1}}],["вызывает",{"2":{"18":1}}],["вызываем",{"2":{"8":2,"63":6}}],["вызову",{"2":{"72":2}}],["вызове",{"2":{"71":1}}],["вызовет",{"2":{"5":1}}],["вызовами",{"2":{"72":1}}],["вызова",{"2":{"66":2,"70":5,"71":2,"72":4}}],["вызовах",{"2":{"50":1}}],["вызовом",{"2":{"54":1,"72":1}}],["вызовов",{"2":{"1":1,"57":1,"71":1,"72":1}}],["вызовы",{"2":{"28":1,"46":1,"66":1,"67":1,"72":1}}],["вызов",{"0":{"70":1},"1":{"71":1},"2":{"8":1,"64":1,"66":1,"70":3,"72":4}}],["охватывает",{"2":{"139":1}}],["оффлайн",{"2":{"118":2}}],["официально",{"2":{"106":1}}],["официальной",{"2":{"18":1,"19":1}}],["официальная",{"2":{"106":1,"139":1}}],["официальные",{"2":{"103":1}}],["официальный",{"2":{"89":2}}],["официальными",{"2":{"91":1}}],["официальным",{"2":{"9":1}}],["ощущениям",{"2":{"118":1}}],["ом",{"2":{"108":1,"118":1}}],["оценки",{"2":{"88":2}}],["ожидания",{"2":{"72":1}}],["ожидая",{"2":{"70":1}}],["ожидалось",{"2":{"67":1,"71":1}}],["ожидаемый",{"2":{"56":1}}],["ожидаемые",{"2":{"11":1}}],["ожидаемому",{"2":{"53":1}}],["ожидает",{"2":{"14":1,"18":1,"71":1}}],["окном",{"2":{"109":1}}],["окна",{"2":{"36":2}}],["окошко",{"2":{"71":2}}],["окружению",{"2":{"97":1}}],["окружения",{"2":{"97":1,"98":1}}],["окружений",{"2":{"97":1}}],["окружение",{"2":{"19":1}}],["окружает",{"2":{"10":2}}],["ооп",{"2":{"32":4,"33":1,"106":1,"108":1,"109":3}}],["очистить",{"2":{"61":1}}],["очистке",{"2":{"60":1}}],["очищаются",{"2":{"19":1}}],["очереди",{"2":{"63":2}}],["очередь",{"2":{"8":1,"31":2,"62":2,"63":1,"72":2,"106":2}}],["очевидно",{"2":{"9":1}}],["очевидным",{"2":{"8":1,"10":1}}],["очень",{"2":{"2":3,"3":2,"7":1,"8":1,"9":2,"11":1,"16":1,"33":3,"36":1,"38":1,"46":1,"51":1,"53":1,"56":1,"58":2,"60":1,"62":1,"66":2,"68":2,"69":1,"70":2,"71":1,"98":1,"102":1,"103":4,"105":3,"106":1,"107":1,"108":1,"115":1,"116":1,"117":3,"118":3}}],["оговорками",{"2":{"11":1}}],["ограничено",{"2":{"72":1}}],["ограниченный",{"2":{"65":1}}],["ограничений",{"2":{"11":1,"106":1,"118":1}}],["ограничения",{"2":{"7":1,"69":1,"116":1}}],["ограничивает",{"2":{"10":1}}],["огромного",{"2":{"37":1}}],["огромные",{"2":{"7":1}}],["огромная",{"2":{"7":1}}],["ошибок",{"2":{"56":3,"61":1,"64":1,"124":1}}],["ошибке",{"2":{"70":1}}],["ошибку",{"2":{"55":1,"56":1,"72":1}}],["ошибка",{"2":{"11":1,"72":2,"109":1}}],["ошибки",{"2":{"4":1,"71":1,"103":1}}],["ошибетесь",{"2":{"10":1}}],["ознакомьтесь",{"2":{"117":1}}],["ознакомились",{"2":{"9":1}}],["ознакомиться",{"2":{"2":1}}],["означает",{"2":{"7":2,"11":1,"28":1,"38":2,"60":1,"64":1,"66":1}}],["оригинальный",{"2":{"64":1}}],["ориентированных",{"2":{"109":1}}],["ориентированными",{"2":{"10":1}}],["ориентированное",{"2":{"108":1}}],["ориентированного",{"2":{"32":1,"108":1}}],["ориентация",{"2":{"7":1}}],["органами",{"2":{"31":1}}],["организм",{"2":{"31":1}}],["организовывать",{"2":{"11":1}}],["организовать",{"2":{"5":1,"9":1,"11":1}}],["организация",{"2":{"11":1}}],["организации",{"2":{"8":1,"36":1,"98":1,"108":1}}],["о",{"0":{"108":1},"2":{"6":1,"7":1,"8":2,"9":1,"10":1,"11":1,"34":1,"39":2,"65":1,"66":1,"67":1,"77":1,"84":1,"101":1,"105":2,"108":2,"118":2,"124":1}}],["одну",{"2":{"33":1,"61":1,"66":1,"108":1}}],["одни",{"2":{"29":1}}],["одним",{"2":{"10":1,"11":1,"69":1}}],["однако",{"2":{"7":2,"10":1,"11":5,"25":1,"26":1,"33":1,"36":1,"38":1,"48":1,"65":1,"66":2,"71":2,"72":1,"104":1,"105":1,"106":2,"116":1,"117":2,"118":2}}],["однозначно",{"2":{"103":1,"108":1}}],["одностраничных",{"2":{"87":1}}],["одностраничные",{"0":{"87":1}}],["однопоточными",{"2":{"70":1}}],["однопоточных",{"2":{"45":1}}],["одновременно",{"2":{"64":1}}],["одного",{"2":{"46":1,"70":1,"106":2}}],["одному",{"2":{"56":1}}],["одном",{"2":{"10":1,"37":1,"40":1,"58":1,"70":1,"108":1}}],["однофайловый",{"2":{"10":1}}],["однофайловых",{"0":{"10":1},"2":{"8":1,"34":1}}],["однофайловые",{"2":{"6":1,"27":1}}],["одной",{"2":{"7":3,"33":1,"55":1,"60":1,"69":1,"70":1,"99":1,"106":1}}],["одно",{"2":{"7":1,"11":1,"32":1,"37":1,"38":1,"61":1,"64":1,"66":1,"72":2,"97":1,"108":1}}],["одинаковыми",{"2":{"102":1}}],["одинаковым",{"2":{"65":1}}],["один",{"2":{"2":2,"9":1,"10":1,"13":1,"19":1,"33":1,"37":1,"38":1,"46":2,"47":1,"49":1,"59":1,"60":2,"66":1,"67":1,"68":1,"102":1,"106":4,"107":1,"118":1}}],["оповестить",{"2":{"108":1}}],["оповещения",{"2":{"60":1}}],["оповещает",{"2":{"60":1}}],["опираясь",{"2":{"66":1}}],["описываются",{"2":{"139":1}}],["описывающие",{"2":{"11":1}}],["описывайте",{"2":{"115":1}}],["описан",{"2":{"97":1}}],["описанных",{"2":{"34":1}}],["описания",{"2":{"11":1}}],["описание",{"2":{"10":1,"19":1,"45":1,"118":1}}],["описаны",{"2":{"6":1}}],["описать",{"2":{"10":1}}],["оперативной",{"2":{"103":1}}],["операционной",{"2":{"78":1}}],["операция",{"2":{"65":2,"71":1}}],["операциями",{"2":{"36":1,"72":1}}],["операции",{"2":{"51":2,"66":2,"70":3,"71":1,"72":1}}],["операцию",{"2":{"33":1,"70":1,"72":2}}],["операций",{"2":{"15":1,"64":2,"70":2,"71":1,"72":2}}],["оперировать",{"2":{"65":1}}],["опубликовать",{"2":{"61":1,"92":1}}],["опубликовывать",{"2":{"60":1}}],["опять",{"2":{"61":1}}],["опционально",{"2":{"137":1}}],["опция",{"2":{"33":1}}],["опции",{"2":{"10":1,"11":1,"105":1}}],["оптимизация",{"2":{"118":1}}],["оптимизаций",{"2":{"9":1}}],["оптимизировать",{"2":{"9":1}}],["опытный",{"2":{"117":1}}],["опытных",{"2":{"5":1,"94":1,"139":2}}],["опытному",{"2":{"117":1}}],["опыту",{"2":{"33":1,"41":1}}],["опыт",{"2":{"10":1,"71":1,"117":1,"118":1,"138":2}}],["опыта",{"2":{"5":1,"8":1,"93":1}}],["определённых",{"2":{"109":1}}],["определить",{"2":{"28":1,"76":1}}],["определиться",{"2":{"7":1}}],["определили",{"2":{"25":1}}],["определять",{"2":{"11":1}}],["определяю",{"2":{"11":1}}],["определяют",{"2":{"8":2,"11":2}}],["определяющие",{"2":{"7":1,"10":2}}],["определяемого",{"2":{"15":1}}],["определяем",{"2":{"8":2}}],["определяете",{"2":{"10":1,"106":1}}],["определяется",{"2":{"2":1,"11":1}}],["определяет",{"2":{"2":1,"6":1,"7":1,"8":1,"10":1,"46":1,"49":1,"60":2}}],["определено",{"2":{"19":1}}],["определен",{"2":{"11":1}}],["определение",{"2":{"64":1,"106":1}}],["определению",{"2":{"7":1}}],["определения",{"2":{"7":1,"109":1}}],["определенного",{"2":{"66":1,"105":1}}],["определенному",{"2":{"3":1,"7":1}}],["определенных",{"2":{"106":1}}],["определенный",{"2":{"34":1,"56":1}}],["определенные",{"2":{"7":1,"8":1,"11":1,"33":1,"40":1}}],["определенными",{"2":{"10":1,"11":2}}],["определенным",{"2":{"2":1,"3":1,"66":1}}],["оно",{"2":{"7":1,"11":1,"13":1,"61":1,"72":2,"74":1,"118":1}}],["она",{"2":{"7":2,"10":1,"13":1,"14":2,"17":1,"18":1,"19":2,"28":1,"31":1,"36":2,"56":1,"57":1,"61":1,"66":1,"97":1,"105":2,"106":2,"108":1,"110":1}}],["они",{"2":{"6":1,"7":2,"15":3,"16":1,"19":3,"20":1,"21":1,"23":1,"24":1,"25":1,"28":1,"29":1,"31":1,"33":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"55":1,"58":1,"65":1,"69":1,"70":1,"71":1,"72":2,"97":1,"99":3,"102":1,"106":1,"108":2,"112":1,"117":2,"118":1}}],["он",{"2":{"2":3,"5":1,"6":1,"7":2,"10":2,"11":1,"19":2,"32":1,"33":2,"34":1,"37":2,"38":1,"39":1,"40":1,"49":1,"50":1,"53":1,"55":1,"56":1,"58":1,"59":1,"60":4,"62":1,"64":2,"66":1,"67":3,"69":1,"70":2,"78":1,"97":2,"102":1,"103":2,"105":1,"106":1,"107":1,"108":1,"109":1,"118":3}}],["онлайн",{"2":{"2":1,"102":1,"103":1,"109":1,"118":1}}],["обман",{"2":{"118":1}}],["обмену",{"2":{"11":1}}],["обязательно",{"2":{"117":2}}],["обязательные",{"2":{"29":1}}],["обязательными",{"2":{"25":1}}],["обязательным",{"2":{"11":1}}],["обучающие",{"2":{"117":1}}],["обучение",{"2":{"116":1}}],["обзор",{"2":{"104":1}}],["оболочку",{"2":{"118":1}}],["оболочки",{"2":{"109":1}}],["оборачивайте",{"2":{"116":1}}],["оборачивать",{"2":{"72":1}}],["обоснования",{"2":{"109":1}}],["обоих",{"2":{"50":2}}],["обозначает",{"2":{"31":1}}],["обозначаются",{"2":{"22":1}}],["обхода",{"2":{"40":1,"118":1}}],["обслуживанием",{"2":{"66":1}}],["обслуживания",{"2":{"64":1}}],["обслуживании",{"2":{"58":1,"90":1}}],["обслуживать",{"2":{"38":1}}],["обсервер",{"2":{"28":1}}],["обиход",{"2":{"38":1}}],["облегчит",{"2":{"111":1}}],["облегчили",{"2":{"108":1}}],["облегчает",{"2":{"33":1}}],["области",{"2":{"11":2,"30":1,"40":1,"76":1,"106":1}}],["обладает",{"2":{"7":1}}],["облачные",{"2":{"98":1}}],["облачных",{"2":{"3":1}}],["облачном",{"2":{"95":1,"98":1}}],["облачное",{"2":{"3":1}}],["обычным",{"2":{"118":1}}],["обычными",{"2":{"99":1}}],["обычные",{"2":{"66":1,"108":1}}],["обычных",{"2":{"25":1,"118":1}}],["обычный",{"2":{"10":2,"49":1,"102":1}}],["обычное",{"2":{"118":1}}],["обычной",{"2":{"108":1}}],["обычном",{"2":{"11":1,"55":1,"60":1,"72":2,"73":1}}],["обычного",{"2":{"7":1,"10":1,"70":1,"71":2,"72":1}}],["обычно",{"2":{"2":1,"5":1,"7":1,"9":1,"19":1,"62":1,"65":1,"105":1,"106":2,"107":1,"108":1,"117":1,"118":1}}],["общая",{"2":{"32":1}}],["общие",{"2":{"93":2}}],["общий",{"2":{"25":1,"59":1,"93":1}}],["общих",{"2":{"7":2,"76":1}}],["общую",{"2":{"11":1}}],["общепризнанная",{"2":{"139":1}}],["общее",{"2":{"138":1}}],["общего",{"2":{"31":1,"66":1}}],["общей",{"2":{"7":1,"31":1,"105":1}}],["общем",{"2":{"7":1,"31":1}}],["общение",{"2":{"5":1,"121":1}}],["об",{"2":{"7":1,"9":1,"11":2,"17":1,"39":1,"50":1,"51":1,"54":1,"60":1,"69":1,"108":2,"117":1}}],["обещанных",{"2":{"72":1}}],["обещанной",{"2":{"72":2}}],["обещаний",{"2":{"72":1}}],["обещание",{"2":{"72":2}}],["обещаниe",{"0":{"72":1}}],["обещаниями",{"2":{"72":1}}],["обещания",{"2":{"71":1,"72":4}}],["оберток",{"2":{"118":1}}],["обертки",{"0":{"111":1},"2":{"111":1,"118":1}}],["обертка",{"2":{"1":1,"19":1,"108":1}}],["обертывания",{"2":{"72":1}}],["обернуть",{"2":{"50":1,"71":1,"72":1,"109":1}}],["обернуты",{"2":{"34":1}}],["обернутый",{"2":{"19":1}}],["обеспечат",{"2":{"98":1}}],["обеспечению",{"2":{"78":1}}],["обеспечение",{"2":{"76":1,"78":1}}],["обеспечении",{"2":{"31":1}}],["обеспечения",{"0":{"28":1,"29":1,"40":1,"84":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"5":1,"6":1,"7":1,"19":1,"28":1,"29":2,"38":1,"39":1,"40":1,"70":1,"73":1,"84":2,"107":1}}],["обеспечить",{"2":{"7":1,"50":1,"61":1,"93":1}}],["обеспечивает",{"2":{"6":1,"11":1,"62":1,"71":1}}],["объяснению",{"2":{"118":1}}],["объяснить",{"2":{"117":1}}],["объясняющие",{"2":{"39":1}}],["объявить",{"2":{"10":1}}],["объявлять",{"2":{"11":1}}],["объявляют",{"2":{"11":2}}],["объявляем",{"2":{"8":1,"11":1,"56":1,"57":1,"61":1,"65":3,"67":1}}],["объявляется",{"2":{"4":1,"11":1,"12":1}}],["объявлены",{"2":{"106":1}}],["объявления",{"2":{"72":1}}],["объявление",{"2":{"4":1,"72":1}}],["объявлено",{"2":{"18":1}}],["объявленным",{"2":{"11":1}}],["объявленного",{"2":{"4":1}}],["объем",{"2":{"40":1}}],["объединены",{"2":{"31":1}}],["объективная",{"2":{"139":1}}],["объектным",{"2":{"109":1}}],["объектный",{"2":{"49":1,"57":1}}],["объектного",{"2":{"64":1}}],["объектно",{"2":{"10":1,"32":1,"108":1,"109":1}}],["объектов",{"2":{"25":1,"32":1,"42":1,"59":1,"64":1,"105":1}}],["объектом",{"2":{"11":1,"49":1,"60":1,"61":1,"64":1,"65":1,"69":1}}],["объекту",{"2":{"11":1,"55":2,"56":1,"58":1,"62":1,"64":1,"66":1}}],["объектах",{"2":{"56":1,"105":1}}],["объекта",{"2":{"11":2,"14":1,"16":1,"36":1,"46":1,"53":1,"54":1,"55":1,"56":1,"58":1,"62":1,"64":2,"65":4,"66":4,"67":1,"69":2,"105":2,"106":1,"108":1,"109":1}}],["объектами",{"2":{"43":1,"60":1,"64":1,"105":1}}],["объектам",{"2":{"4":2}}],["объекты",{"2":{"11":2,"17":1,"22":1,"106":1,"108":1}}],["объекте",{"2":{"8":1,"55":1,"105":1,"117":1}}],["объект",{"2":{"8":3,"10":1,"11":9,"32":1,"46":1,"47":1,"49":2,"51":2,"57":3,"58":1,"59":1,"60":2,"61":1,"63":1,"64":5,"65":6,"66":2,"69":2,"72":3,"105":2}}],["оба",{"2":{"3":1,"59":1,"71":1,"102":1}}],["обновится",{"2":{"108":1}}],["обновилось",{"2":{"65":1}}],["обновляться",{"2":{"107":1}}],["обновляет",{"2":{"2":1,"66":1}}],["обновление",{"2":{"65":1,"97":1,"108":1}}],["обновления",{"2":{"36":1}}],["обновлении",{"2":{"13":1,"64":1,"108":1}}],["обнаружить",{"2":{"110":1}}],["обнаружились",{"2":{"118":1}}],["обнаружили",{"2":{"39":1}}],["обнаружения",{"2":{"36":1}}],["обнуляет",{"2":{"2":1}}],["обрабатываются",{"2":{"117":1}}],["обрабатывать",{"2":{"64":1,"71":1,"99":1,"118":2}}],["обрабатываться",{"2":{"63":1}}],["обрабатывает",{"2":{"51":2}}],["обработчиком",{"2":{"65":1}}],["обработчике",{"2":{"65":1}}],["обработчики",{"2":{"64":1}}],["обработчик",{"2":{"56":2}}],["обработка",{"2":{"109":1}}],["обработке",{"2":{"109":1}}],["обработкой",{"2":{"36":1}}],["обработки",{"2":{"7":1,"56":1,"61":1,"62":2,"63":1,"69":1,"71":1}}],["обработана",{"2":{"19":1}}],["образец",{"2":{"97":1}}],["образу",{"2":{"7":1}}],["образом",{"2":{"2":2,"3":1,"9":2,"16":2,"36":1,"50":1,"53":1,"56":2,"58":1,"63":1,"64":2,"66":1,"67":1,"69":1,"71":1,"72":2,"116":1}}],["обратных",{"2":{"72":1}}],["обратными",{"2":{"72":1}}],["обратный",{"0":{"70":1},"1":{"71":1},"2":{"70":1}}],["обратные",{"2":{"28":1}}],["обратную",{"2":{"64":1}}],["обратного",{"2":{"70":3,"71":1,"72":3}}],["обратное",{"2":{"65":1}}],["обратной",{"2":{"11":1}}],["обратно",{"2":{"2":1,"64":1}}],["обратите",{"2":{"8":3,"10":1,"11":1,"50":1,"65":2,"70":1,"72":1}}],["обратиться",{"2":{"19":1}}],["обратить",{"2":{"6":1,"7":1,"60":1}}],["обращений",{"2":{"50":1}}],["обращения",{"2":{"11":1,"118":1}}],["обращении",{"2":{"3":1,"118":2}}],["обращается",{"2":{"4":1}}],["обращаешься",{"2":{"3":1}}],["обращаться",{"2":{"3":1,"6":1,"117":1}}],["ос",{"2":{"103":1}}],["осущестляется",{"2":{"99":1}}],["осуществляться",{"2":{"59":1}}],["осуществляется",{"2":{"47":1}}],["осуществляются",{"2":{"46":1}}],["осуществления",{"2":{"1":1}}],["особых",{"2":{"78":1}}],["особого",{"2":{"56":1}}],["особенность",{"2":{"108":1}}],["особенностью",{"2":{"65":1}}],["особенностей",{"2":{"66":1,"70":1}}],["особенно",{"2":{"5":1,"33":1,"39":1,"59":1,"62":1,"70":1,"72":1,"107":1}}],["освобождаем",{"2":{"36":1}}],["освобождать",{"2":{"36":1}}],["освобождения",{"2":{"36":1}}],["освободить",{"2":{"36":1}}],["остаться",{"2":{"106":1}}],["остановимся",{"2":{"51":1}}],["оставаться",{"2":{"38":1,"56":1}}],["остальных",{"2":{"28":1,"73":2}}],["остальное",{"2":{"10":1,"103":1}}],["остается",{"2":{"1":1}}],["основополагающих",{"2":{"69":1}}],["основы",{"2":{"61":1,"73":1,"85":1}}],["основываясь",{"2":{"59":1}}],["основу",{"2":{"28":1}}],["основательным",{"2":{"106":1}}],["основании",{"2":{"63":1}}],["основанного",{"2":{"53":1}}],["основана",{"2":{"38":1}}],["основаны",{"2":{"7":1}}],["основа",{"2":{"27":1}}],["основ",{"2":{"26":1,"60":1,"76":1}}],["основе",{"2":{"6":1,"7":1,"19":1,"88":1,"106":1}}],["основная",{"2":{"19":1,"37":1,"46":1,"62":1}}],["основной",{"2":{"70":2,"103":1,"106":1,"115":1}}],["основное",{"2":{"53":1,"69":1,"106":1}}],["основном",{"2":{"19":1,"56":1,"57":1,"66":1}}],["основного",{"2":{"1":1,"60":1}}],["основных",{"2":{"107":1}}],["основным",{"2":{"8":1}}],["основные",{"2":{"2":1,"95":1,"107":1,"109":1,"139":1}}],["отзывами",{"2":{"118":1}}],["отзывчивых",{"2":{"76":1}}],["отдавать",{"2":{"118":1}}],["отделяет",{"2":{"62":1}}],["отделить",{"2":{"108":1,"117":1}}],["отделит",{"2":{"10":1}}],["отдельного",{"2":{"91":1,"108":1,"109":1}}],["отдельности",{"2":{"40":1}}],["отдельном",{"2":{"37":1,"106":1}}],["отдельную",{"2":{"31":1,"106":1}}],["отдельная",{"2":{"4":1}}],["отдельными",{"2":{"4":1}}],["отдельный",{"2":{"1":2,"10":1,"37":1,"116":1}}],["отнимают",{"2":{"107":1}}],["относительно",{"2":{"118":1}}],["относится",{"2":{"11":4,"33":1,"36":2,"72":1}}],["отношения",{"2":{"60":1}}],["отношении",{"2":{"15":1}}],["отношению",{"2":{"11":1}}],["откуда",{"2":{"108":1}}],["отката",{"2":{"97":1}}],["отклоняем",{"2":{"72":1}}],["отклонено",{"2":{"72":1}}],["открытом",{"2":{"117":1}}],["открытыми",{"2":{"117":1}}],["открытый",{"2":{"39":1}}],["открытые",{"2":{"3":1}}],["открыла",{"2":{"37":1}}],["открывающем",{"2":{"12":1}}],["открывает",{"2":{"8":1,"51":1,"53":1}}],["отменены",{"2":{"62":1}}],["отметить",{"2":{"45":1,"63":1,"69":1,"116":1,"117":1}}],["отовсюду",{"2":{"106":1}}],["отодвигает",{"2":{"53":1}}],["отобразить",{"2":{"14":1,"19":1}}],["отображено",{"2":{"16":1}}],["отображение",{"2":{"106":1}}],["отображении",{"2":{"15":1,"19":2}}],["отображения",{"2":{"7":1,"8":1,"15":2,"16":1,"118":1}}],["отображать",{"2":{"99":1}}],["отображающий",{"2":{"66":1,"106":1}}],["отображаются",{"2":{"11":1}}],["отображаемые",{"2":{"11":1}}],["отображается",{"2":{"7":1,"19":1,"33":1}}],["отбрасывании",{"2":{"36":1}}],["отстает",{"2":{"117":1}}],["отступов",{"2":{"36":1}}],["отслеживает",{"2":{"105":3}}],["отслеживанию",{"2":{"60":1,"65":1}}],["отслеживания",{"2":{"16":1,"62":1,"105":2}}],["отсылаю",{"2":{"72":1}}],["отрисовкой",{"2":{"118":1}}],["отрицательных",{"2":{"72":3}}],["отрицательного",{"2":{"72":1}}],["отреагировать",{"2":{"18":1}}],["отражаться",{"2":{"13":1}}],["отражаются",{"2":{"6":1}}],["отличный",{"2":{"117":1}}],["отлично",{"2":{"72":1,"108":1}}],["отличное",{"2":{"58":1,"102":1}}],["отличия",{"2":{"108":1}}],["отличительных",{"2":{"66":1}}],["отличительной",{"2":{"65":1}}],["отличие",{"2":{"15":1,"53":1,"105":1,"106":2,"108":1}}],["отличаются",{"2":{"105":1}}],["отличаться",{"2":{"45":1}}],["отличается",{"2":{"4":1,"107":1}}],["отвечающие",{"2":{"106":1,"108":1}}],["отвечать",{"2":{"78":1}}],["отвечает",{"2":{"2":1}}],["ответов",{"2":{"139":2}}],["ответственная",{"2":{"106":1}}],["ответственностью",{"2":{"33":2}}],["ответственность",{"2":{"28":1,"31":1,"56":1,"60":1}}],["ответственности",{"0":{"31":1,"33":1},"2":{"28":1,"31":4}}],["ответах",{"2":{"139":1}}],["ответа",{"2":{"70":1,"137":1}}],["ответить",{"2":{"7":1,"27":1}}],["ответ",{"2":{"4":2,"117":1,"137":1}}],["ответе",{"2":{"4":2}}],["отпечаток",{"2":{"2":1,"39":1}}],["отправлять",{"2":{"118":1}}],["отправляемые",{"2":{"11":1}}],["отправляет",{"2":{"2":1}}],["отправке",{"2":{"60":1}}],["отправка",{"2":{"1":1}}],["от",{"0":{"78":1},"2":{"1":1,"2":1,"4":4,"6":2,"7":3,"8":1,"10":1,"11":3,"15":2,"26":1,"28":2,"30":1,"31":1,"37":1,"40":1,"41":2,"45":1,"55":1,"60":1,"62":1,"63":1,"64":3,"66":1,"67":1,"69":1,"70":3,"73":1,"78":1,"98":1,"99":1,"105":1,"106":1,"107":2,"108":3,"112":1,"116":1,"117":3,"138":1}}],["иерарxичную",{"2":{"116":1}}],["иерархичного",{"2":{"108":1}}],["иерархии",{"2":{"10":1,"56":1,"58":1,"106":2}}],["играет",{"2":{"108":1}}],["игнорировать",{"2":{"49":1}}],["ивент",{"2":{"106":1}}],["ивенты",{"2":{"106":1}}],["ивентов",{"2":{"106":1}}],["иконка",{"2":{"118":1}}],["иконками",{"2":{"99":1}}],["иконку",{"2":{"99":2}}],["иконки",{"2":{"99":2,"102":1}}],["идею",{"2":{"118":1}}],["идеально",{"2":{"108":1}}],["идеале",{"2":{"106":1}}],["идет",{"2":{"103":1,"139":1}}],["идее",{"2":{"31":1}}],["идея",{"2":{"19":1,"37":1,"38":1,"66":1,"106":1}}],["идентификатор",{"2":{"11":1}}],["идентификатором",{"2":{"8":2}}],["итерация",{"2":{"76":1}}],["итераторе",{"2":{"16":1}}],["итоге",{"2":{"25":1,"33":1,"37":1,"103":1,"106":1}}],["итоговый",{"2":{"116":1}}],["итогов",{"0":{"26":1,"73":1}}],["итого",{"2":{"2":1}}],["итак",{"2":{"7":1,"55":1,"64":1,"69":1}}],["исследуем",{"2":{"72":1}}],["исправление",{"2":{"124":1}}],["испортит",{"2":{"107":1}}],["исполнение",{"2":{"62":1}}],["исполнения",{"2":{"8":1}}],["использовались",{"2":{"105":1}}],["использовали",{"2":{"37":1,"56":1}}],["использовано",{"2":{"72":1}}],["использована",{"2":{"11":1,"19":1}}],["использован",{"2":{"7":1,"11":1}}],["использования",{"2":{"7":1,"8":1,"11":2,"29":1,"36":1,"40":1,"50":1,"51":1,"53":1,"56":1,"57":1,"61":1,"64":1,"69":1,"74":1,"105":1,"106":1,"117":1,"118":1}}],["использовании",{"2":{"5":1,"9":2,"11":1,"15":1,"77":1}}],["использованием",{"2":{"33":1,"48":1,"53":1,"56":1,"72":1,"99":1,"118":1}}],["использование",{"0":{"8":1},"1":{"9":1},"2":{"4":1,"7":1,"11":2,"19":1,"36":1,"59":1,"69":1,"72":1,"76":1,"88":1,"106":1,"108":1,"116":1,"118":1,"138":1}}],["использоваться",{"2":{"13":1,"29":1,"85":1}}],["использовать",{"0":{"47":1},"2":{"3":1,"5":1,"7":7,"8":2,"9":2,"10":7,"11":4,"14":1,"17":1,"18":3,"19":2,"20":1,"25":2,"28":1,"32":1,"37":2,"40":1,"41":1,"49":1,"50":1,"52":1,"55":1,"57":1,"61":3,"66":1,"67":1,"69":3,"71":2,"72":5,"73":1,"77":1,"99":3,"102":1,"108":2,"109":3,"113":1}}],["используйте",{"0":{"111":1,"113":1,"114":1},"2":{"10":2,"15":2,"25":1,"105":2,"111":1,"116":1}}],["использую",{"2":{"8":1}}],["используют",{"2":{"6":1,"20":1}}],["используются",{"2":{"2":1,"7":1,"19":1,"27":1,"45":1,"58":1,"64":1,"72":2,"97":1,"102":1,"108":1}}],["использующего",{"2":{"4":1}}],["используя",{"2":{"3":1,"7":1,"9":1,"11":1,"32":1,"39":1,"65":1,"69":1,"70":1,"78":1,"85":2,"97":1,"102":2,"137":1}}],["использует",{"2":{"64":1,"97":1,"100":1,"102":1,"105":2,"106":1}}],["используете",{"2":{"39":1,"111":1}}],["используется",{"2":{"2":1,"4":1,"6":1,"11":1,"16":1,"18":1,"36":1,"47":1,"61":1,"64":1,"69":1,"97":1,"102":1,"105":1,"108":2,"117":1,"139":1}}],["используемые",{"2":{"9":1,"11":1,"12":1,"109":1}}],["используемый",{"2":{"2":1,"19":1}}],["используем",{"2":{"8":2,"10":2,"11":2,"13":1,"17":1,"50":2,"52":1,"57":1,"63":1,"65":1,"71":1}}],["используемая",{"2":{"7":1}}],["используемого",{"2":{"4":1,"7":1}}],["испускает",{"2":{"61":1}}],["исторически",{"2":{"106":1}}],["история",{"0":{"119":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1},"2":{"66":1}}],["источники",{"2":{"117":1,"139":1}}],["источнику",{"2":{"4":1,"117":1}}],["источник",{"2":{"4":1}}],["источников",{"2":{"4":3}}],["истины",{"2":{"37":1}}],["исходными",{"2":{"91":1}}],["исходных",{"0":{"91":1}}],["исходный",{"2":{"57":1,"65":1}}],["исходного",{"2":{"66":1,"103":1}}],["исходному",{"2":{"36":1}}],["исходящие",{"2":{"34":1}}],["искренне",{"2":{"80":1}}],["исключительным",{"2":{"38":1}}],["исключительных",{"2":{"34":1,"118":1}}],["исключением",{"2":{"34":1,"106":1}}],["исключения",{"2":{"7":1}}],["искушению",{"2":{"32":1}}],["исчерпывающий",{"2":{"28":1}}],["исчерпывающим",{"2":{"11":1}}],["их",{"2":{"3":1,"7":3,"9":2,"10":2,"11":1,"19":4,"25":1,"26":1,"28":1,"31":2,"34":1,"36":1,"39":1,"40":1,"45":1,"48":1,"52":1,"57":1,"58":1,"60":1,"62":2,"66":1,"69":1,"70":2,"72":2,"73":2,"88":2,"97":1,"99":4,"104":1,"105":1,"106":5,"107":1,"108":3,"111":1,"112":1}}],["иных",{"2":{"118":1}}],["иные",{"2":{"73":1}}],["иная",{"2":{"108":1}}],["иначе",{"2":{"10":1,"18":1,"106":1}}],["ингридиент",{"2":{"107":1}}],["инициализируем",{"2":{"65":1}}],["инициализировано",{"2":{"61":1}}],["инициирующей",{"2":{"4":1}}],["инъекцией",{"2":{"53":1}}],["инъекцию",{"2":{"52":1}}],["инъекции",{"2":{"51":1,"53":1,"56":1}}],["инъекция",{"0":{"51":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"28":1}}],["инвокер",{"2":{"50":1,"54":1,"56":1,"62":2,"63":2}}],["инвокеру",{"2":{"50":1,"62":1}}],["инвертирует",{"2":{"7":1}}],["иного",{"2":{"116":1}}],["иногда",{"2":{"60":1,"71":1,"106":1,"109":1,"116":1}}],["ином",{"2":{"40":1,"105":1}}],["иной",{"2":{"7":2,"97":1}}],["инструкции",{"2":{"97":1}}],["инструкцию",{"2":{"71":1}}],["инструментами",{"2":{"91":1}}],["инструментария",{"2":{"40":1}}],["инструменты",{"2":{"85":2,"88":1,"95":1,"118":1}}],["инструментов",{"2":{"32":1,"58":1,"76":1,"78":1,"88":1}}],["инструмент",{"2":{"8":1,"115":1}}],["инстанцированный",{"2":{"59":1}}],["инстанцировании",{"2":{"50":2}}],["инстанцирования",{"2":{"32":1,"47":1,"50":2,"55":1}}],["интеграционные",{"2":{"107":1}}],["интеграция",{"2":{"95":1,"106":1}}],["интеграции",{"2":{"72":1}}],["интегрированные",{"2":{"36":1}}],["интегрирующие",{"2":{"31":1}}],["интерактивности",{"2":{"108":1}}],["интернационализационным",{"2":{"105":1}}],["интернационализации",{"2":{"105":1}}],["интернационализация",{"2":{"105":1}}],["интернет",{"2":{"4":4,"6":1,"69":1,"117":1}}],["интернете",{"2":{"3":1,"5":1,"116":1,"117":1}}],["интернета",{"2":{"3":1}}],["интересными",{"2":{"139":1}}],["интересный",{"2":{"97":1}}],["интересующих",{"2":{"65":1}}],["интерполируем",{"2":{"67":1}}],["интерполированное",{"2":{"16":1}}],["интерполяцией",{"2":{"8":1,"16":1}}],["интерпретатору",{"2":{"72":1}}],["интерпретации",{"2":{"11":1}}],["интерпретировано",{"2":{"14":1}}],["интерпретировать",{"2":{"9":1,"10":1}}],["интерпретируются",{"2":{"8":1}}],["интерфейсом",{"2":{"29":1,"69":1}}],["интерфейсов",{"2":{"7":2,"69":1,"76":1,"86":1}}],["интерфейс",{"2":{"10":1,"34":1,"59":1,"66":1,"68":1,"69":1,"71":1}}],["интерфейса",{"0":{"86":1},"2":{"3":1,"10":2,"17":1,"32":1,"33":2,"36":1,"58":2,"66":2,"67":1,"70":1,"93":1,"107":1}}],["инкапсулировали",{"2":{"108":1}}],["инкапсулировать",{"2":{"47":1}}],["инкапсулирует",{"2":{"10":1,"108":1}}],["инкапсуляция",{"0":{"34":1},"2":{"28":1,"34":1}}],["инкапсуляции",{"2":{"25":1,"55":1,"69":1}}],["инженеру",{"2":{"95":1}}],["инженерии",{"2":{"6":1,"7":1,"31":1,"40":1,"76":1}}],["инжектируемых",{"2":{"22":1}}],["инжектируемые",{"2":{"22":1}}],["индексируется",{"2":{"118":1}}],["индексации",{"2":{"118":1}}],["индексы",{"2":{"16":1}}],["индекс",{"2":{"16":1}}],["индивидуально",{"2":{"2":1}}],["инета",{"2":{"3":1}}],["информационной",{"2":{"97":1}}],["информацию",{"2":{"19":1,"117":1}}],["информацией",{"2":{"10":1,"62":1,"97":1}}],["информация",{"2":{"2":1,"139":1}}],["информации",{"2":{"2":1,"89":2,"117":1,"139":2}}],["изначально",{"2":{"109":1,"118":1}}],["издателя",{"2":{"60":1}}],["избыточности",{"2":{"37":1}}],["избежать",{"2":{"36":1,"49":1,"50":1,"108":1}}],["избегаемы",{"2":{"105":1}}],["избегания",{"2":{"37":1}}],["избегайте",{"0":{"110":1},"2":{"33":1}}],["избегать",{"2":{"33":1}}],["известен",{"2":{"37":1}}],["извлекаем",{"2":{"8":1}}],["излишняя",{"2":{"33":1}}],["изощренных",{"2":{"103":1}}],["изоляции",{"2":{"50":1}}],["изолированные",{"2":{"9":1}}],["изобретено",{"2":{"108":1}}],["изобретайте",{"2":{"69":1}}],["изобретать",{"2":{"28":1,"61":1}}],["изображения",{"2":{"99":2}}],["изобразить",{"2":{"9":1}}],["изучайте",{"2":{"117":1}}],["изучать",{"2":{"7":1,"121":1}}],["изучения",{"2":{"26":1,"28":1,"40":1,"72":1,"85":1,"117":2}}],["изучение",{"0":{"12":1,"117":1},"1":{"13":1,"14":1,"15":1,"16":1,"17":1,"18":1},"2":{"76":1,"113":1}}],["изучить",{"2":{"7":1,"97":1}}],["изучим",{"2":{"6":1}}],["изменим",{"2":{"52":1}}],["изменится",{"2":{"19":1,"103":1}}],["изменить",{"2":{"11":1,"15":1,"64":2,"71":1,"108":1,"109":1,"116":1}}],["изменилась",{"2":{"72":1}}],["изменилось",{"2":{"11":1}}],["изменился",{"2":{"2":1}}],["изменено",{"0":{"121":1,"124":1,"127":1},"2":{"7":1}}],["изменение",{"2":{"72":1}}],["изменении",{"2":{"7":1,"108":2}}],["изменений",{"0":{"119":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1},"2":{"7":1,"16":1,"95":1,"105":1,"137":1}}],["изменениям",{"2":{"76":1,"94":1}}],["изменениями",{"2":{"60":1,"103":1,"108":2}}],["изменениях",{"2":{"60":1,"106":1}}],["изменения",{"2":{"6":3,"36":2,"40":1,"66":1,"69":1,"105":2,"124":1}}],["изменяем",{"2":{"68":2}}],["изменяет",{"2":{"67":1}}],["изменяете",{"2":{"66":1}}],["изменяется",{"2":{"7":2,"60":1,"72":1}}],["изменяться",{"2":{"108":1}}],["изменять",{"2":{"6":1,"11":1,"108":1}}],["изменяющие",{"2":{"6":1}}],["из",{"2":{"2":1,"3":1,"5":1,"6":3,"7":5,"8":2,"9":2,"10":2,"11":7,"12":1,"14":1,"15":2,"16":1,"19":1,"29":1,"31":3,"32":1,"33":2,"36":1,"38":1,"39":2,"45":1,"46":1,"48":1,"50":2,"54":1,"56":1,"60":3,"61":1,"64":1,"66":4,"69":3,"70":2,"71":4,"72":3,"76":1,"97":4,"99":5,"100":1,"102":2,"105":1,"106":5,"107":1,"108":1,"109":1,"113":1,"117":1,"118":1}}],["имитирует",{"2":{"107":1}}],["имя",{"2":{"11":2,"25":1,"57":2,"61":2,"97":1,"137":1}}],["импорт",{"2":{"106":1}}],["импортируя",{"2":{"19":1}}],["импортируется",{"2":{"11":1}}],["импортирует",{"2":{"9":1}}],["импортируем",{"2":{"8":1,"11":2,"52":1}}],["импортировали",{"2":{"68":1}}],["импортировать",{"2":{"7":1,"8":1,"9":1,"11":2,"49":1,"57":1,"58":1,"99":2,"101":1}}],["импортированы",{"2":{"99":1}}],["импортирован",{"2":{"7":1,"49":1}}],["импорта",{"2":{"7":1,"49":1,"61":1,"100":1}}],["им",{"2":{"2":1,"116":1,"118":1}}],["имеем",{"2":{"11":1}}],["имеет",{"2":{"2":4,"3":1,"5":1,"8":1,"11":1,"14":1,"16":1,"31":1,"36":1,"50":1,"58":1,"61":1,"64":1,"65":1,"108":2}}],["имеют",{"2":{"10":1,"11":2,"12":1,"33":2,"37":1,"66":1,"72":1,"106":1,"116":1}}],["имели",{"2":{"9":1}}],["иметь",{"2":{"6":1,"11":1,"14":1,"25":1,"33":1,"40":1,"49":1,"56":1,"60":1,"78":1,"103":1,"106":1}}],["имен",{"2":{"58":1,"65":1}}],["имени",{"2":{"56":1,"57":2,"58":1,"61":1,"64":1,"67":1,"69":1,"99":1}}],["именовании",{"2":{"39":1}}],["именами",{"2":{"72":2,"99":1}}],["именам",{"2":{"57":1}}],["имена",{"0":{"23":1,"24":1},"2":{"4":1,"8":1,"57":1,"72":1}}],["именем",{"2":{"4":1,"66":1,"67":1,"101":1}}],["именно",{"2":{"2":1,"6":2,"9":1,"10":1,"11":1,"60":1,"65":1,"70":1,"106":1,"108":1,"117":2}}],["или",{"0":{"5":1},"2":{"1":2,"2":2,"3":1,"4":4,"5":2,"7":9,"8":1,"9":1,"10":1,"11":6,"12":1,"14":4,"15":3,"16":1,"17":1,"18":1,"19":3,"31":2,"32":3,"33":3,"34":1,"36":1,"37":4,"38":2,"39":3,"40":3,"41":1,"47":2,"49":1,"51":3,"56":3,"57":1,"58":1,"59":1,"60":2,"62":2,"63":2,"64":6,"65":2,"66":4,"67":2,"69":5,"70":3,"71":2,"72":5,"73":1,"78":1,"98":1,"99":1,"101":1,"102":2,"105":2,"106":11,"108":2,"109":1,"110":1,"111":2,"116":3,"117":5,"118":3,"137":3}}],["и",{"0":{"2":1,"11":1,"15":1,"16":1,"18":1,"21":1,"23":1,"24":1,"28":1,"38":1,"84":1,"91":1,"102":1,"111":1,"114":1,"116":1,"118":1,"138":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"1":3,"2":23,"3":16,"4":3,"5":4,"6":24,"7":29,"8":14,"9":9,"10":15,"11":33,"12":1,"15":3,"16":1,"17":4,"18":4,"19":9,"20":2,"21":1,"22":4,"23":1,"24":1,"25":5,"26":4,"27":1,"28":13,"29":5,"30":1,"31":6,"32":2,"33":13,"34":7,"36":14,"37":9,"38":5,"39":6,"40":9,"41":2,"42":1,"43":1,"44":1,"45":6,"46":4,"49":3,"50":4,"52":1,"53":1,"54":1,"55":1,"56":3,"57":3,"58":4,"59":2,"60":8,"61":10,"62":6,"63":1,"64":11,"65":13,"66":13,"67":2,"68":2,"69":10,"70":5,"71":6,"72":23,"73":5,"74":2,"76":12,"77":5,"78":6,"80":3,"83":1,"84":2,"86":1,"88":1,"89":4,"90":1,"92":1,"93":3,"94":1,"95":3,"97":18,"98":5,"99":7,"102":8,"103":20,"104":3,"105":14,"106":30,"107":6,"108":24,"109":14,"110":1,"112":5,"113":4,"114":2,"115":2,"116":22,"117":25,"118":30,"124":2,"137":1,"138":3,"139":7}}],["ухудшает",{"2":{"116":1}}],["укоряет",{"2":{"116":1}}],["указать",{"2":{"108":1}}],["указателей",{"2":{"11":1}}],["указателями",{"2":{"11":1}}],["указана",{"2":{"4":1}}],["указанную",{"2":{"4":1}}],["указывает",{"2":{"8":1,"11":2}}],["уязвимость",{"2":{"110":1}}],["уязвимости",{"2":{"106":1}}],["утилитами",{"2":{"111":1}}],["утилит",{"0":{"111":1}}],["утилиты",{"2":{"106":1,"109":1}}],["утверждение",{"2":{"51":1}}],["утверждает",{"2":{"51":1}}],["утечек",{"2":{"36":1}}],["утечку",{"2":{"10":1}}],["учебник",{"2":{"117":2}}],["учитывают",{"2":{"118":1}}],["учитывать",{"2":{"102":1}}],["учит",{"2":{"117":2}}],["учителем",{"2":{"117":1}}],["учите",{"2":{"39":2}}],["учиться",{"2":{"109":1}}],["учить",{"2":{"39":1}}],["участки",{"2":{"36":1}}],["умирает",{"2":{"106":1}}],["умолчанию",{"2":{"56":1}}],["умны",{"2":{"49":1}}],["умные",{"2":{"39":1}}],["умел",{"2":{"117":1}}],["умело",{"2":{"6":1}}],["умение",{"2":{"117":1}}],["умении",{"2":{"116":1}}],["умения",{"2":{"28":1}}],["уместно",{"2":{"73":1}}],["умеют",{"2":{"69":1}}],["уме",{"2":{"27":1}}],["убить",{"2":{"117":1}}],["убирать",{"2":{"36":1}}],["убедитесь",{"2":{"69":1}}],["убедиться",{"2":{"27":1,"47":1,"72":1}}],["углубляться",{"2":{"31":1}}],["уж",{"2":{"25":1,"37":1}}],["уже",{"2":{"3":1,"5":1,"10":1,"11":2,"25":1,"56":1,"57":1,"61":1,"66":2,"69":2,"76":1,"97":1,"105":1,"107":1,"108":1,"109":1,"117":1,"118":2}}],["улучшайте",{"2":{"117":1}}],["улучшая",{"2":{"112":1}}],["улучшение",{"2":{"105":1}}],["улучшения",{"2":{"7":1}}],["улучшить",{"2":{"118":1}}],["улучшит",{"2":{"15":1}}],["узнаем",{"2":{"51":1}}],["узнаете",{"2":{"11":1,"77":1,"85":1}}],["узнать",{"2":{"8":1}}],["уникален",{"2":{"106":1}}],["уникальный",{"2":{"16":1}}],["универсальный",{"2":{"99":2}}],["унификации",{"2":{"5":1}}],["унаследован",{"2":{"11":1}}],["упоминали",{"2":{"66":1,"69":1}}],["упомянутых",{"2":{"78":1}}],["упомянутый",{"2":{"10":1}}],["упомянутого",{"2":{"55":1}}],["упомянуть",{"2":{"39":1}}],["упорядотичиваете",{"2":{"36":1}}],["упакует",{"2":{"9":1}}],["упакованные",{"2":{"61":1}}],["упакован",{"2":{"9":1}}],["упражнение",{"2":{"56":1}}],["управляемое",{"2":{"118":1}}],["управляемые",{"2":{"31":2}}],["управляет",{"2":{"33":1}}],["управлять",{"2":{"8":1,"10":1,"74":1,"108":2}}],["управления",{"2":{"53":1,"61":1,"89":3,"91":1,"106":3}}],["управлению",{"2":{"7":1,"38":1}}],["управление",{"0":{"89":1},"2":{"7":1,"11":1,"33":1,"51":1,"58":1,"77":1}}],["упростит",{"2":{"111":1}}],["упростить",{"2":{"47":1,"69":1}}],["упрощать",{"2":{"69":1}}],["упрощающий",{"2":{"69":1}}],["упрощает",{"2":{"5":1,"97":1}}],["упрощенную",{"2":{"118":1}}],["упрощенно",{"2":{"108":1}}],["упрощенное",{"2":{"9":1,"69":1}}],["упрощенный",{"2":{"69":1,"72":1}}],["упрощения",{"2":{"38":1,"40":1,"69":2}}],["уверенным",{"2":{"117":1}}],["уверены",{"2":{"72":1}}],["увеличивает",{"2":{"99":1,"110":1}}],["увеличивается",{"2":{"99":1}}],["увеличения",{"2":{"6":1}}],["уведомляется",{"2":{"60":1}}],["увидели",{"2":{"118":1}}],["увидеть",{"2":{"40":1,"65":1}}],["увидим",{"2":{"9":1,"11":1,"18":2,"32":1,"59":1,"63":1}}],["увидите",{"2":{"7":1,"31":1,"34":1}}],["успевает",{"2":{"103":1}}],["успешности",{"2":{"109":1}}],["успешном",{"2":{"72":1}}],["успешного",{"2":{"72":1}}],["успешным",{"2":{"70":1}}],["успехов",{"2":{"80":1}}],["успеха",{"2":{"72":3}}],["успех",{"2":{"70":1}}],["усваивать",{"2":{"39":1}}],["устареть",{"2":{"116":1}}],["устареет",{"2":{"110":1}}],["устаревает",{"2":{"106":1}}],["устаревшие",{"2":{"103":1}}],["устаревший",{"2":{"102":1}}],["устарели",{"2":{"117":1}}],["устарел",{"2":{"104":1,"106":1}}],["устанавливается",{"2":{"102":1}}],["устанавливаемым",{"2":{"76":1}}],["устанавливать",{"2":{"61":1}}],["устанавливаться",{"2":{"6":1}}],["установлена",{"2":{"118":1}}],["установленную",{"2":{"97":1}}],["установите",{"2":{"117":1}}],["установить",{"2":{"3":1,"8":1,"98":1}}],["установке",{"2":{"118":2}}],["установкой",{"2":{"11":1}}],["установка",{"2":{"9":1,"10":1,"11":1,"61":1}}],["установки",{"2":{"4":1,"78":1,"97":1,"103":1,"105":1}}],["устраняя",{"2":{"40":1}}],["устройством",{"2":{"34":1}}],["услуг",{"2":{"109":1}}],["услугам",{"2":{"31":1}}],["усложняться",{"2":{"118":1}}],["усложнению",{"2":{"33":1}}],["условий",{"2":{"72":1,"99":1}}],["условие",{"2":{"72":1}}],["условии",{"2":{"50":1,"66":1}}],["условия",{"2":{"68":1}}],["условиям",{"2":{"40":1}}],["условиях",{"2":{"7":1}}],["условные",{"2":{"15":1}}],["ускоряет",{"2":{"116":1}}],["ускорить",{"2":{"28":1,"109":1,"116":1}}],["ускорению",{"2":{"11":1}}],["усилия",{"2":{"7":1}}],["уровень",{"2":{"2":2,"109":1,"115":1,"139":1}}],["уровни",{"2":{"69":1}}],["уровне",{"2":{"64":1,"105":1,"107":1,"117":2}}],["уровнем",{"2":{"1":1}}],["уровнях",{"2":{"28":1,"64":1}}],["уровня",{"2":{"2":1,"29":1,"108":1,"117":1}}],["у",{"2":{"2":2,"3":4,"5":1,"10":2,"11":1,"25":1,"27":1,"32":1,"36":1,"60":1,"68":1,"70":1,"71":1,"72":2,"97":1,"105":1,"106":4,"109":1,"116":1,"117":1,"118":2}}],["уделяя",{"2":{"78":1}}],["удачные",{"2":{"72":1}}],["удаленном",{"2":{"97":1}}],["удаленный",{"2":{"97":4}}],["удаленным",{"2":{"37":1}}],["удаление",{"2":{"105":1}}],["удалением",{"2":{"36":1}}],["удалении",{"2":{"19":1}}],["удаления",{"2":{"2":1,"36":1}}],["удаляют",{"2":{"15":1}}],["удаляя",{"2":{"14":1}}],["удивительных",{"2":{"69":1}}],["удобство",{"2":{"138":2}}],["удобства",{"2":{"2":1,"19":1,"57":1,"138":1}}],["удобен",{"2":{"5":1,"68":1,"72":1}}],["удобней",{"2":{"106":1,"116":1}}],["удобнее",{"2":{"5":1}}],["удобную",{"0":{"104":1},"2":{"103":1,"116":1}}],["удобная",{"2":{"109":1}}],["удобна",{"2":{"103":1}}],["удобны",{"2":{"98":1}}],["удобный",{"2":{"97":1,"103":1,"105":1,"115":1,"117":1}}],["удобным",{"2":{"25":1,"53":1}}],["удобных",{"2":{"18":1,"69":1}}],["удобной",{"2":{"90":1}}],["удобно",{"2":{"1":2,"11":1,"16":1,"55":2,"58":1,"70":1,"103":1,"106":2,"116":1}}],["удостовериться",{"2":{"2":1}}],["удостоверяется",{"2":{"2":2}}],["курсов",{"2":{"117":1}}],["курс",{"2":{"109":1,"117":1}}],["кучу",{"2":{"108":1}}],["куча",{"2":{"106":1}}],["кучи",{"2":{"105":1}}],["кулер",{"2":{"103":1}}],["кулисами",{"2":{"65":1}}],["куда",{"2":{"103":1,"108":1}}],["купить",{"2":{"98":1}}],["куку",{"2":{"2":1}}],["кэширование",{"2":{"118":1}}],["кэширования",{"2":{"97":1}}],["кэширующий",{"2":{"106":1}}],["кэш",{"2":{"64":1}}],["кэше",{"2":{"19":1}}],["кстати",{"2":{"54":1}}],["кто",{"2":{"32":1,"64":1,"107":1,"108":1,"118":1}}],["квадрат",{"2":{"31":1,"59":2}}],["книжка",{"2":{"117":1}}],["книга",{"0":{"77":1,"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"76":2,"77":1,"78":1,"117":2}}],["книги",{"0":{"78":1},"2":{"9":1,"12":1,"28":2,"36":1,"40":2,"73":2,"78":1,"79":1,"80":2,"117":1}}],["книге",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"6":3,"7":1,"11":2,"18":1,"20":2,"26":1,"34":1,"37":1,"41":1,"59":1,"61":1,"66":2,"78":3}}],["кнопку",{"2":{"19":1,"109":1}}],["кнопкам",{"2":{"109":1}}],["кнопка",{"2":{"18":1}}],["кнопке",{"2":{"18":1}}],["кнопкой",{"2":{"10":1}}],["кем",{"2":{"7":1}}],["ключу",{"2":{"105":1}}],["ключом",{"2":{"65":1}}],["ключ",{"2":{"65":1,"97":1}}],["ключевая",{"2":{"87":1}}],["ключевые",{"2":{"83":1}}],["ключевыми",{"2":{"89":1}}],["ключевым",{"2":{"64":1,"72":1}}],["ключевое",{"2":{"11":2,"72":1}}],["ключевой",{"2":{"7":1}}],["клише",{"2":{"37":1}}],["клиентского",{"2":{"66":1}}],["клиентском",{"2":{"63":1}}],["клиентом",{"2":{"65":1,"69":1,"118":1}}],["клиентов",{"2":{"62":2}}],["клиенту",{"2":{"62":1}}],["клиенты",{"2":{"62":1}}],["клиент",{"2":{"5":2,"64":2,"66":1,"103":2}}],["клиентам",{"2":{"4":1}}],["клиента",{"2":{"4":3,"64":3,"69":1,"118":1}}],["клетки",{"2":{"31":1}}],["клавиатуры",{"2":{"103":1}}],["клавиатуру",{"2":{"103":1}}],["класть",{"2":{"99":1,"106":1}}],["классы",{"2":{"66":1}}],["классе",{"2":{"55":1}}],["классами",{"2":{"109":1}}],["класса",{"2":{"50":3,"51":1,"59":1,"62":1}}],["классах",{"2":{"37":1}}],["классификаций",{"2":{"45":1}}],["классифицируются",{"2":{"41":1}}],["классический",{"2":{"11":1,"117":1}}],["класс",{"2":{"33":1,"37":1,"50":2,"51":2,"53":1,"56":3,"99":1}}],["классу",{"2":{"11":1,"56":1}}],["классов",{"0":{"23":1},"2":{"7":2,"19":1,"32":1,"34":1,"42":1,"109":1,"116":1}}],["кладем",{"2":{"61":1}}],["кладет",{"2":{"2":1}}],["кругозор",{"2":{"117":1}}],["крутятся",{"2":{"103":1}}],["крупномасштабного",{"2":{"90":1}}],["крупного",{"2":{"8":1}}],["крупных",{"2":{"3":1}}],["кроулером",{"2":{"118":1}}],["кровеносной",{"2":{"31":1}}],["кроме",{"2":{"8":1,"11":3,"18":1,"38":1,"39":1,"55":1,"66":1,"97":3,"102":1,"106":2,"108":1,"109":1,"110":1,"117":1,"118":2}}],["красиво",{"2":{"118":1}}],["красивую",{"2":{"116":1}}],["крайних",{"2":{"61":2}}],["крайней",{"2":{"53":1,"65":1,"70":1,"78":1}}],["краткий",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"66":1}}],["краткое",{"2":{"47":1}}],["краткосрочной",{"2":{"40":1}}],["кратко",{"2":{"8":1,"27":1}}],["кражей",{"2":{"2":1}}],["критичных",{"2":{"2":1}}],["криптография",{"2":{"2":1}}],["казаться",{"2":{"118":1}}],["кабинета",{"2":{"109":1}}],["каталога",{"2":{"109":1}}],["категорией",{"2":{"106":1}}],["категориями",{"2":{"109":1}}],["категориям",{"2":{"36":1}}],["кандидатов",{"2":{"108":1}}],["канала",{"0":{"0":1},"1":{"1":1}}],["капотом",{"2":{"108":1}}],["качество",{"2":{"116":1,"138":2}}],["качества",{"2":{"101":1}}],["качественные",{"2":{"117":1}}],["качественный",{"2":{"103":1}}],["качестве",{"2":{"8":1,"11":1,"31":1,"33":1,"36":2,"46":1,"51":1,"53":1,"57":3,"58":1,"61":2,"65":2,"70":1,"71":1,"85":1,"118":1,"139":1}}],["карточкой",{"2":{"84":1}}],["картинок",{"2":{"101":1}}],["картинками",{"2":{"118":1}}],["картинка",{"2":{"101":1}}],["картинки",{"2":{"99":6,"118":2}}],["картинке",{"2":{"13":1,"118":1}}],["картины",{"2":{"31":1}}],["карьере",{"2":{"80":1}}],["кардинальность",{"2":{"60":1}}],["кажется",{"2":{"11":1}}],["каждым",{"2":{"118":1}}],["каждый",{"2":{"2":2,"7":1,"11":2,"19":1,"31":1,"33":1,"37":1,"50":1,"61":2,"64":1,"66":2,"102":1,"106":3,"108":1,"109":1}}],["каждая",{"2":{"16":1,"66":1,"72":2,"106":1}}],["каждую",{"2":{"10":1,"56":1,"57":1,"61":1}}],["каждой",{"2":{"66":1,"72":1}}],["каждое",{"2":{"11":1,"23":1,"60":1,"64":1}}],["каждого",{"2":{"7":1,"10":1,"19":1,"50":1,"76":1,"97":2,"102":1}}],["каждому",{"2":{"2":1,"97":1}}],["каждом",{"2":{"2":1,"7":1,"13":1,"28":2,"29":1,"37":1,"108":1,"109":1}}],["камне",{"2":{"7":1}}],["касается",{"2":{"106":1}}],["касаются",{"2":{"42":1,"43":1}}],["кастомные",{"2":{"116":1}}],["кастомных",{"2":{"109":1}}],["кастомными",{"2":{"102":1}}],["кастомный",{"2":{"98":1}}],["кастомную",{"2":{"3":1}}],["каскадные",{"2":{"6":1}}],["какая",{"2":{"103":1}}],["какую",{"2":{"8":1}}],["каким",{"2":{"63":2}}],["каких",{"2":{"7":1,"71":1,"118":1}}],["какие",{"2":{"6":1,"9":1,"27":1,"60":1,"62":1,"74":1,"105":1,"108":1,"117":2}}],["каковы",{"0":{"29":1}}],["какой",{"2":{"7":1,"8":1,"31":1,"55":1,"56":1,"65":1,"101":1,"103":1,"110":1,"111":1}}],["какое",{"2":{"6":1}}],["каком",{"2":{"3":1}}],["как",{"2":{"2":5,"3":3,"4":1,"5":4,"6":1,"7":8,"8":2,"9":6,"10":4,"11":13,"14":1,"15":2,"17":2,"19":1,"25":1,"28":2,"29":1,"31":3,"32":2,"33":3,"34":2,"36":4,"37":3,"39":2,"40":2,"50":1,"53":1,"54":1,"55":1,"56":2,"57":2,"58":2,"60":1,"61":3,"62":1,"64":5,"65":6,"66":3,"67":1,"69":1,"70":2,"71":6,"72":6,"73":2,"74":1,"76":2,"77":1,"78":3,"85":2,"89":2,"91":1,"92":2,"97":2,"99":3,"101":1,"102":3,"103":3,"105":5,"106":7,"107":1,"108":1,"115":2,"116":4,"117":3,"118":9,"121":1,"139":2}}],["к",{"2":{"1":1,"2":4,"3":7,"4":6,"6":3,"7":1,"11":19,"13":1,"17":1,"19":3,"27":1,"28":1,"32":1,"33":2,"36":3,"37":1,"39":1,"40":1,"42":1,"46":1,"47":3,"51":1,"58":2,"62":1,"64":1,"65":1,"66":2,"69":5,"70":2,"72":5,"73":1,"76":4,"78":2,"86":2,"98":2,"99":1,"103":4,"106":2,"109":1,"113":1,"117":3,"118":3}}],["коврике",{"2":{"118":1}}],["коп",{"2":{"108":1}}],["копирования",{"2":{"102":1}}],["копий",{"2":{"16":1}}],["корректировку",{"2":{"137":1}}],["корректный",{"2":{"55":1}}],["коридоре",{"2":{"118":1}}],["корень",{"2":{"97":1}}],["короткий",{"2":{"117":1}}],["коротким",{"0":{"38":1}}],["короткоживущий",{"2":{"2":1}}],["коем",{"2":{"45":1}}],["кого",{"0":{"77":1},"2":{"39":3,"64":1}}],["когда",{"0":{"47":1},"2":{"2":4,"3":1,"4":1,"6":1,"7":8,"8":1,"11":3,"14":1,"15":1,"17":2,"18":1,"19":4,"28":1,"32":2,"33":3,"36":4,"39":2,"47":4,"52":1,"55":1,"60":1,"61":1,"65":4,"66":1,"70":1,"71":2,"72":1,"73":2,"99":1,"105":2,"106":3,"116":1,"117":1,"118":3}}],["ко",{"2":{"29":1,"39":1,"106":1,"109":1}}],["координация",{"2":{"7":1}}],["координации",{"2":{"7":1}}],["координировать",{"2":{"7":1}}],["коллеги",{"2":{"117":1}}],["коллекции",{"2":{"51":1}}],["коллекций",{"2":{"16":1}}],["коллекция",{"2":{"7":1}}],["колоночной",{"2":{"116":1}}],["колоночным",{"2":{"113":1}}],["количеством",{"2":{"105":1,"107":1}}],["количество",{"2":{"6":1,"38":1,"61":1}}],["количества",{"2":{"2":1,"37":1}}],["которую",{"2":{"8":1,"41":1,"97":1,"106":1,"117":1}}],["которое",{"2":{"18":1,"65":1,"72":1,"107":1}}],["которого",{"2":{"11":4,"36":1}}],["которой",{"2":{"8":1,"30":1,"64":1,"69":1,"87":1}}],["которому",{"2":{"16":1}}],["котором",{"2":{"6":2,"10":1,"33":1,"63":1,"65":1,"98":1,"105":1,"106":1}}],["которая",{"2":{"5":1,"7":1,"8":1,"11":1,"14":1,"31":1,"56":1,"59":1,"64":1,"70":2,"72":1,"106":2,"108":1,"116":1,"117":1,"118":1}}],["которых",{"2":{"6":1,"7":1,"9":1,"11":1,"16":1,"40":1,"60":1,"66":2,"106":1,"108":1,"118":1}}],["которыми",{"2":{"25":1,"64":1,"106":1}}],["которым",{"2":{"4":1,"11":1,"25":1,"116":1}}],["который",{"2":{"3":2,"4":2,"6":1,"7":2,"8":2,"9":1,"10":4,"11":4,"19":2,"20":1,"33":2,"39":1,"49":1,"51":1,"59":1,"62":1,"64":2,"65":3,"66":3,"67":1,"68":2,"71":1,"72":1,"85":1,"99":1,"102":1,"106":3,"107":1,"108":1,"118":2}}],["которые",{"2":{"2":1,"4":1,"6":5,"8":2,"9":3,"10":1,"11":4,"12":1,"15":1,"18":3,"19":3,"20":1,"28":2,"29":2,"31":2,"34":1,"36":3,"37":2,"38":1,"40":3,"41":2,"44":1,"61":2,"66":1,"69":1,"73":1,"76":2,"77":1,"98":1,"99":1,"116":1,"117":1,"118":2}}],["конфликтуют",{"2":{"103":1}}],["конфигом",{"2":{"103":1}}],["конфиге",{"2":{"102":1}}],["конфигурациях",{"2":{"118":1}}],["конфигурация",{"2":{"103":1}}],["конфигурационного",{"2":{"97":1}}],["конфигурации",{"2":{"33":1}}],["конвейеров",{"2":{"69":1}}],["консистентности",{"2":{"106":1}}],["консоль",{"2":{"65":3,"71":2}}],["конструкции",{"2":{"106":1}}],["конструкторе",{"2":{"50":1,"55":1,"56":1,"61":1}}],["конструкторы",{"2":{"22":1}}],["конструктора",{"2":{"11":1,"72":1}}],["конструктор",{"2":{"8":1,"11":3,"64":1,"65":1,"72":1}}],["константные",{"2":{"22":1}}],["константе",{"2":{"11":1}}],["константа",{"2":{"11":2}}],["константы",{"0":{"22":1},"2":{"11":2}}],["константу",{"2":{"11":2}}],["контакты",{"2":{"137":1}}],["контрагентами",{"2":{"108":1}}],["контролирует",{"2":{"105":1,"108":1}}],["контролировать",{"2":{"58":1}}],["контроля",{"2":{"33":1,"91":2}}],["контроль",{"0":{"91":1},"2":{"11":2,"71":1}}],["контент",{"2":{"118":1}}],["контентом",{"2":{"118":2}}],["контента",{"2":{"6":1,"8":1,"19":1,"118":1}}],["контексте",{"2":{"28":1}}],["контекста",{"2":{"11":1,"30":1,"41":1,"45":1,"63":1}}],["конечный",{"2":{"11":1}}],["конечном",{"2":{"25":1}}],["конечно",{"2":{"5":1,"66":1,"72":1,"109":1,"118":1}}],["концов",{"2":{"69":1}}],["концом",{"2":{"66":1}}],["концептуального",{"2":{"86":1}}],["концептуальные",{"2":{"29":1}}],["концепцию",{"2":{"11":1}}],["концепции",{"2":{"9":1,"28":1,"76":1,"92":1,"109":1}}],["концепцией",{"2":{"7":1,"86":1}}],["концепций",{"2":{"6":1,"69":1,"76":1}}],["концепциями",{"2":{"89":1}}],["концепция",{"2":{"6":1,"7":1,"11":1,"33":1,"34":1,"46":1,"62":1,"65":1}}],["конце",{"2":{"8":1,"69":1}}],["концу",{"2":{"6":1}}],["конкретика",{"2":{"33":1}}],["конкретным",{"2":{"40":1}}],["конкретные",{"2":{"7":1}}],["конкретную",{"2":{"33":1}}],["конкретном",{"2":{"7":1}}],["конкретное",{"2":{"4":1,"11":1}}],["конкурировать",{"2":{"6":1}}],["конкурировали",{"2":{"6":1}}],["кончается",{"2":{"2":2}}],["кончился",{"2":{"2":1}}],["комфорту",{"2":{"118":1}}],["комфортно",{"2":{"106":1}}],["комфортней",{"2":{"103":1}}],["комментирование",{"2":{"138":1}}],["комментарию",{"2":{"57":1}}],["комментарии",{"2":{"39":2}}],["комментариев",{"2":{"36":1}}],["комментариями",{"2":{"2":1}}],["коммерческих",{"2":{"97":1}}],["коммуникации",{"2":{"72":1}}],["коммуникационного",{"2":{"37":1}}],["комманда",{"0":{"62":1},"1":{"63":1}}],["командной",{"2":{"102":1}}],["командного",{"2":{"62":1}}],["команду",{"2":{"63":1}}],["команд",{"2":{"62":1,"63":1,"97":1,"108":1}}],["командой",{"2":{"50":1,"91":1,"118":1}}],["команда",{"2":{"25":1,"28":1,"62":1}}],["команде",{"2":{"7":1,"25":1,"62":1}}],["команды",{"2":{"7":1,"30":1,"62":2,"63":1}}],["компетентные",{"2":{"117":1}}],["компаниях",{"2":{"117":1}}],["компании",{"2":{"2":1}}],["компьютера",{"2":{"103":1}}],["компьютерам",{"2":{"38":1}}],["компьютере",{"2":{"78":1,"102":1,"118":1}}],["компьютеров",{"2":{"78":1}}],["компьютером",{"2":{"37":1}}],["композаблы",{"2":{"109":1}}],["композабле",{"2":{"106":1}}],["композаблом",{"2":{"106":1}}],["композабл",{"2":{"105":1,"106":4,"109":1}}],["композитные",{"2":{"32":1}}],["композиции",{"2":{"32":1}}],["композиция",{"0":{"32":1,"86":1},"2":{"9":1,"10":2,"17":1,"28":1,"32":1,"33":1,"36":1,"58":1,"66":1,"67":1}}],["компонуемый",{"2":{"36":1}}],["компонентно",{"2":{"108":1}}],["компонентом",{"2":{"106":2}}],["компонентов",{"0":{"10":1,"23":1,"86":1},"2":{"6":1,"8":1,"9":2,"10":2,"11":2,"18":2,"19":5,"26":1,"32":2,"33":4,"34":1,"36":1,"86":1,"91":1,"104":1,"106":1}}],["компоненту",{"2":{"11":1,"68":1}}],["компонентам",{"2":{"33":1}}],["компонентами",{"0":{"111":1},"2":{"10":1,"11":2,"17":1,"43":1,"44":1,"58":2,"66":1,"67":1,"89":2}}],["компонента",{"2":{"9":1,"10":4,"11":7,"19":4,"31":1,"33":1,"36":4,"58":1,"64":1,"67":3,"68":1,"106":4,"109":1,"116":2}}],["компонентах",{"2":{"1":1,"10":1,"11":1,"37":1,"66":1}}],["компонент",{"2":{"8":2,"9":1,"10":3,"11":4,"19":7,"33":9,"36":2,"37":1,"66":1,"67":1,"99":1,"101":1,"105":1,"106":7,"108":3,"111":1,"116":2}}],["компоненты",{"0":{"19":1},"2":{"6":1,"9":2,"10":3,"11":2,"17":1,"19":2,"27":1,"32":1,"33":2,"34":3,"66":2,"68":1,"106":2,"108":2,"109":1,"111":2,"112":1,"116":3}}],["компоненте",{"2":{"1":1,"37":1,"67":1,"106":3}}],["компиляция",{"2":{"8":1}}],["компромиссы",{"2":{"7":1,"76":1}}],["компромисс",{"2":{"7":2}}],["компромиссами",{"2":{"7":1}}],["комплексное",{"2":{"2":1}}],["кому",{"2":{"2":1}}],["кодироваться",{"2":{"99":1}}],["кодирования",{"2":{"72":1,"76":1}}],["кодирование",{"2":{"53":1}}],["коду",{"2":{"39":1}}],["кодовой",{"2":{"56":1}}],["кодовых",{"2":{"20":1,"26":1,"36":1}}],["кодовые",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"25":1}}],["кодом",{"2":{"3":1,"26":1,"69":1}}],["кодера",{"2":{"103":1}}],["коде",{"2":{"11":3,"25":1,"27":1,"36":2,"52":1,"63":1,"66":1,"68":1,"72":2,"108":1,"109":1,"116":1}}],["кода",{"0":{"79":1},"2":{"1":2,"3":1,"7":2,"8":1,"9":1,"10":2,"11":6,"25":1,"29":1,"33":1,"36":2,"37":2,"38":1,"39":1,"40":1,"55":1,"66":1,"70":2,"78":1,"79":1,"95":2,"97":1,"103":1,"108":3,"110":1,"112":2,"116":2,"117":1,"118":2,"138":1}}],["код",{"0":{"39":1,"80":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"1":2,"4":1,"5":1,"7":1,"8":2,"9":2,"11":5,"20":1,"25":1,"28":1,"36":3,"37":2,"39":6,"40":2,"49":2,"50":2,"52":2,"55":2,"65":1,"66":1,"71":1,"72":2,"80":1,"97":1,"103":1,"105":1,"112":1,"117":2}}],["сюда",{"2":{"138":1}}],["сэкономит",{"2":{"110":1}}],["сэкономить",{"2":{"76":1,"116":1}}],["схожи",{"2":{"108":1}}],["схеме",{"2":{"62":1}}],["сжатие",{"2":{"101":1}}],["сгенеренные",{"2":{"118":1}}],["сгенерировать",{"2":{"98":1}}],["сгруппированы",{"2":{"62":1}}],["сгруппированные",{"2":{"31":1}}],["сгруппированных",{"2":{"31":1}}],["сбивать",{"2":{"71":1}}],["сборок",{"2":{"102":1}}],["сборщиком",{"2":{"9":1,"10":1}}],["сборщики",{"2":{"9":1}}],["сборщика",{"0":{"9":1},"2":{"9":2,"10":1,"11":1,"102":3}}],["сборщик",{"2":{"8":1,"9":1,"10":1,"11":1,"36":1,"102":3}}],["сборка",{"0":{"102":1},"2":{"8":1,"97":1,"102":1}}],["сборки",{"2":{"8":1}}],["сша",{"2":{"38":1}}],["сферы",{"2":{"38":1}}],["смысл",{"2":{"118":1}}],["смысле",{"2":{"15":1,"38":1,"106":1}}],["смартфоне",{"2":{"118":1}}],["смартфона",{"2":{"118":1}}],["смену",{"2":{"108":1}}],["смешивает",{"2":{"40":1,"108":1}}],["сможете",{"2":{"113":1}}],["сможет",{"2":{"72":1}}],["сможем",{"2":{"31":1,"72":1}}],["смонтирован",{"2":{"11":1}}],["смонтировать",{"2":{"8":1}}],["см",{"2":{"19":1,"61":1}}],["ссылок",{"2":{"36":1,"56":1}}],["ссылку",{"2":{"50":2,"61":1}}],["ссылка",{"2":{"36":1}}],["ссылки",{"2":{"22":3,"32":1,"46":1,"102":1}}],["ссылке",{"2":{"11":1}}],["ссылаются",{"2":{"65":1}}],["ссылаемой",{"2":{"17":1}}],["ссылаться",{"2":{"11":2,"16":1,"61":1,"73":1}}],["сделанный",{"2":{"118":1}}],["сделайте",{"2":{"111":1,"117":2}}],["сделав",{"2":{"110":1}}],["сделали",{"2":{"118":1}}],["сделал",{"2":{"39":1,"113":1}}],["сделает",{"2":{"10":1,"25":1}}],["сделать",{"2":{"2":2,"3":3,"39":2,"69":1,"76":1,"98":1,"105":1,"106":1,"108":1,"109":1,"118":1}}],["сценариев",{"2":{"76":1}}],["сценариям",{"2":{"39":1}}],["сценария",{"2":{"8":1}}],["сценарий",{"2":{"2":1}}],["скилл",{"2":{"117":1}}],["сказать",{"2":{"108":1}}],["скачивает",{"2":{"97":1}}],["скачать",{"0":{"79":1},"2":{"117":1}}],["склонений",{"2":{"105":1}}],["скромный",{"2":{"66":1}}],["скромного",{"2":{"66":1}}],["скромное",{"2":{"8":2}}],["скрытие",{"2":{"69":1}}],["скрытия",{"2":{"15":1}}],["скрыть",{"2":{"69":1}}],["скрыто",{"2":{"15":1}}],["скрывать",{"2":{"33":1}}],["скрываться",{"2":{"15":1}}],["скрывают",{"2":{"15":1}}],["скрывая",{"2":{"15":1}}],["скрывает",{"2":{"14":1}}],["скрипта",{"2":{"118":1}}],["скриптами",{"2":{"118":1}}],["скриптам",{"2":{"107":1}}],["скрипт",{"2":{"3":2}}],["скопируйте",{"2":{"110":1}}],["скорости",{"2":{"118":1}}],["скорость",{"2":{"99":1}}],["скоростью",{"2":{"7":1}}],["скорей",{"2":{"106":1}}],["сколько",{"2":{"16":1,"70":1,"102":1}}],["скобки",{"2":{"8":1}}],["считывать",{"2":{"106":1}}],["считать",{"2":{"109":1}}],["считает",{"2":{"106":1}}],["считается",{"2":{"4":1,"117":1}}],["считая",{"2":{"72":1}}],["счастью",{"2":{"72":1}}],["счет",{"2":{"7":1}}],["сне",{"2":{"105":1}}],["снятие",{"2":{"56":1}}],["снять",{"2":{"36":1,"61":1,"118":1}}],["снова",{"2":{"19":1,"62":1,"65":1}}],["снижает",{"2":{"118":1}}],["снижают",{"2":{"107":1}}],["снижением",{"2":{"7":1}}],["сниппет",{"2":{"71":2}}],["снизить",{"2":{"69":1,"116":1}}],["снимаем",{"2":{"36":1}}],["снимать",{"2":{"2":1}}],["снимаются",{"2":{"2":1}}],["сначала",{"2":{"6":1,"8":1,"9":1,"10":1,"11":1,"66":1,"70":1}}],["суть",{"2":{"66":1}}],["сути",{"2":{"2":1,"3":1,"28":1,"32":1,"56":1,"105":1,"106":1}}],["сущность",{"2":{"64":2,"106":1}}],["сущности",{"2":{"64":2,"69":1,"108":1}}],["существенные",{"2":{"108":1}}],["существенный",{"2":{"39":1}}],["существенно",{"2":{"71":1}}],["существовать",{"2":{"37":1,"46":1}}],["существующего",{"2":{"117":1}}],["существующие",{"2":{"57":1}}],["существуют",{"2":{"7":2,"19":1,"48":1,"69":1,"71":1,"108":1}}],["существует",{"2":{"6":1,"7":2,"8":1,"11":2,"32":1,"41":1,"45":2,"48":1,"50":2,"61":1,"66":1,"71":1,"104":1}}],["субъективное",{"2":{"139":1}}],["субъекту",{"2":{"61":1}}],["субъекта",{"2":{"60":1}}],["субъект",{"2":{"60":5,"61":2}}],["семантические",{"2":{"114":1}}],["секунд",{"2":{"103":1}}],["секции",{"2":{"10":1,"11":1}}],["сейчас",{"2":{"9":1,"26":1,"66":1,"98":1,"117":1}}],["себе",{"0":{"35":1},"2":{"9":1,"33":1,"40":1,"108":1}}],["себя",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"6":2,"7":1,"9":1,"15":1,"16":1,"18":1,"36":1,"37":1,"39":1,"60":1,"64":1,"99":1,"106":1,"108":2,"117":1}}],["селекторы",{"2":{"8":1}}],["сетевые",{"2":{"72":1}}],["сетевой",{"2":{"70":1}}],["сети",{"2":{"8":1}}],["сетями",{"2":{"7":1}}],["сертификация",{"2":{"117":1}}],["сертификат",{"2":{"98":3}}],["сертификаты",{"2":{"98":1}}],["сертификата",{"2":{"92":1}}],["сериализовываться",{"2":{"63":1}}],["сериализованы",{"2":{"62":1}}],["серая",{"2":{"7":1}}],["сервиcа",{"2":{"3":1}}],["сервисами",{"2":{"40":1}}],["сервиса",{"2":{"3":2,"5":1,"118":1}}],["сервисов",{"2":{"3":3}}],["сервисы",{"2":{"2":1,"3":1,"25":1,"103":1,"106":1,"117":1}}],["сервис",{"0":{"1":1},"2":{"1":1,"3":1,"57":1,"58":1,"108":1,"117":1,"138":1}}],["серверному",{"2":{"118":1}}],["серверных",{"2":{"5":1}}],["серверам",{"2":{"38":1}}],["сервера",{"2":{"4":1,"37":1,"64":1,"70":1,"99":1,"105":1,"118":6}}],["сервере",{"2":{"3":1,"4":2,"63":1,"92":1,"95":1,"97":2,"98":1,"118":1,"123":1,"124":1}}],["сервером",{"2":{"3":1,"37":3,"65":1,"69":1,"118":1}}],["сервер",{"2":{"1":1,"3":2,"4":2,"5":2,"97":2,"98":1,"103":1,"117":1,"118":3}}],["сегодня",{"2":{"6":2,"33":1}}],["сигнализирует",{"2":{"72":1}}],["силами",{"2":{"38":1}}],["сильное",{"2":{"101":1}}],["сильно",{"2":{"5":1,"11":2,"36":1,"102":1,"105":1,"107":1,"108":2,"111":1,"116":1,"117":2,"118":1}}],["ситуация",{"2":{"108":1}}],["ситуациях",{"2":{"34":1,"109":1}}],["ситуацией",{"2":{"106":1}}],["ситуации",{"2":{"7":1}}],["синтез",{"2":{"106":1}}],["синтаксису",{"2":{"72":1}}],["синтаксисе",{"2":{"67":1}}],["синтаксисом",{"2":{"11":1,"19":1,"72":2}}],["синтаксисы",{"2":{"10":1}}],["синтаксис",{"2":{"10":2,"11":6,"72":3}}],["синтаксиса",{"2":{"6":1,"10":1,"72":1}}],["синхронность",{"2":{"71":1}}],["синхронной",{"2":{"70":3,"71":1}}],["синхронный",{"0":{"71":1}}],["синхронные",{"2":{"70":1}}],["синхронизировать",{"2":{"66":1}}],["синхронизацию",{"2":{"17":1}}],["синглтоны",{"2":{"50":1}}],["синглтонами",{"2":{"49":1}}],["синглтона",{"2":{"48":1,"54":1,"56":1}}],["синглтон",{"2":{"28":1,"40":1,"46":1,"50":2,"57":2,"61":1,"106":1}}],["сих",{"2":{"9":1,"18":1,"69":1}}],["систем",{"2":{"108":1}}],["системе",{"2":{"78":1,"108":1}}],["системой",{"2":{"69":1,"91":3}}],["системы",{"2":{"2":2,"31":1,"41":1,"64":1,"108":1,"109":1,"116":1}}],["систему",{"2":{"2":1,"31":2,"33":1,"38":1}}],["системами",{"2":{"108":1}}],["система",{"2":{"2":2,"31":2,"37":1,"38":1,"69":1}}],["сваливает",{"2":{"108":1}}],["сверху",{"2":{"70":1,"139":1}}],["своя",{"2":{"97":1,"105":1}}],["сворачивать",{"2":{"36":1}}],["своим",{"2":{"103":1,"106":1}}],["своими",{"2":{"97":1}}],["своих",{"2":{"54":1,"118":1}}],["свои",{"2":{"25":1,"61":1,"62":1,"69":1,"102":2,"106":1,"108":1,"109":1,"111":1,"116":2}}],["свободу",{"2":{"11":1}}],["свою",{"2":{"8":1,"10":1,"31":2,"72":1,"106":2,"109":1,"110":1}}],["своем",{"2":{"116":1}}],["своему",{"2":{"102":2}}],["свое",{"2":{"15":1,"72":1,"76":1,"117":1}}],["своей",{"2":{"3":1,"25":1,"28":1,"32":1,"72":1,"118":1}}],["своего",{"2":{"3":2,"5":1,"60":1,"65":1,"78":1,"118":1}}],["свойстве",{"2":{"54":1}}],["свойству",{"2":{"53":1,"65":1}}],["свойств",{"2":{"51":1,"65":1}}],["свойство",{"2":{"33":1,"55":1,"65":1}}],["свойствами",{"2":{"64":1,"118":1}}],["свойствах",{"2":{"53":1}}],["свойства",{"2":{"11":1,"65":1}}],["свой",{"0":{"3":1},"2":{"3":2,"10":1,"11":2,"36":1,"39":4,"97":1,"98":2,"117":3}}],["связыванием",{"2":{"17":1}}],["связывает",{"2":{"13":1,"18":1}}],["связь",{"2":{"5":1,"37":2,"58":1}}],["связанность",{"2":{"109":1}}],["связанного",{"2":{"37":1}}],["связанные",{"2":{"109":1}}],["связанными",{"2":{"11":1}}],["связанных",{"2":{"6":1}}],["связанный",{"2":{"1":1}}],["связана",{"2":{"36":1,"65":1}}],["связаны",{"2":{"2":1,"109":1}}],["связи",{"0":{"0":1},"1":{"1":1},"2":{"1":2,"11":1,"67":1,"98":1}}],["среди",{"2":{"107":1}}],["средства",{"2":{"107":1,"116":1}}],["средствами",{"2":{"105":1,"116":1}}],["средство",{"2":{"102":1}}],["среда",{"2":{"103":1}}],["средам",{"2":{"38":1}}],["средним",{"2":{"60":1}}],["средний",{"2":{"60":3}}],["среднем",{"2":{"117":1}}],["средней",{"2":{"38":1}}],["среднего",{"2":{"7":2,"117":1}}],["среды",{"2":{"36":1,"70":1}}],["срабатывает",{"2":{"72":1}}],["сравнится",{"2":{"118":1}}],["сравниваются",{"2":{"116":1}}],["сравним",{"2":{"11":2}}],["сравнении",{"2":{"7":1}}],["сравнению",{"2":{"6":1}}],["сразу",{"2":{"2":1,"17":1,"18":1,"62":1,"72":1,"99":1,"118":2}}],["срок",{"2":{"2":3}}],["сроком",{"2":{"2":1}}],["слабая",{"2":{"109":1}}],["слабо",{"2":{"33":1,"109":1}}],["слишком",{"2":{"11":1,"33":1,"38":1}}],["следит",{"2":{"108":1}}],["следить",{"2":{"61":1,"108":1}}],["следовать",{"2":{"34":1,"78":1}}],["следовательно",{"2":{"8":1}}],["следуя",{"2":{"31":1,"48":1}}],["следующего",{"0":{"39":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"28":1,"71":1}}],["следующей",{"2":{"26":1,"61":1,"73":1}}],["следующему",{"2":{"58":1,"69":1}}],["следующем",{"2":{"18":1}}],["следующее",{"2":{"18":1,"56":1,"78":1,"109":1}}],["следующий",{"2":{"18":1,"36":1}}],["следующими",{"2":{"27":1,"61":1,"65":1}}],["следующим",{"2":{"9":1,"16":1,"53":1,"56":1,"58":1,"64":1,"66":1,"69":1,"71":1,"72":1}}],["следующих",{"2":{"7":1,"40":1,"69":1}}],["следующие",{"2":{"6":1,"10":1,"11":1,"49":1,"64":1,"66":1,"67":1,"70":1}}],["следующую",{"2":{"7":1,"71":1,"117":1}}],["следует",{"2":{"7":1,"25":1,"28":1,"33":1,"40":1,"47":1,"106":1}}],["служат",{"2":{"108":1}}],["служит",{"2":{"4":1}}],["слушателей",{"2":{"108":1}}],["слушателями",{"2":{"60":1}}],["случай",{"2":{"97":1,"117":1}}],["случаи",{"2":{"33":1,"36":1}}],["случаях",{"2":{"19":1,"48":1,"50":2,"70":1,"106":2}}],["случая",{"2":{"8":1,"39":1}}],["случаен",{"2":{"58":1}}],["случаев",{"2":{"2":1,"61":3,"70":1,"71":2,"72":1,"104":1,"105":1,"118":2}}],["случае",{"2":{"2":3,"3":1,"4":1,"7":2,"8":1,"10":1,"11":1,"25":1,"31":1,"39":1,"45":1,"54":1,"56":2,"60":1,"62":1,"63":1,"64":1,"66":1,"72":5,"97":1,"98":1,"102":1,"105":2,"106":1,"108":1}}],["сложен",{"2":{"69":2}}],["сложную",{"2":{"38":1}}],["сложно",{"2":{"117":1}}],["сложному",{"2":{"69":1}}],["сложное",{"2":{"32":1}}],["сложностям",{"2":{"32":1}}],["сложности",{"2":{"6":1,"11":1,"31":1,"69":1,"108":2,"139":1}}],["сложность",{"2":{"1":1,"38":1,"69":2}}],["сложнее",{"2":{"31":1,"38":1,"72":1}}],["сложны",{"2":{"73":1}}],["сложными",{"2":{"108":1}}],["сложным",{"2":{"69":1,"118":1}}],["сложный",{"2":{"65":1,"106":1}}],["сложные",{"2":{"17":1}}],["сложных",{"2":{"6":1,"64":1,"76":1,"116":1}}],["сложная",{"2":{"5":1}}],["слоев",{"2":{"66":1}}],["слой",{"2":{"60":1,"116":1}}],["словами",{"2":{"95":1,"106":1,"118":1}}],["словаря",{"2":{"57":1,"61":1}}],["словом",{"2":{"72":1}}],["слово",{"2":{"8":1,"11":3,"23":1,"25":1,"64":1,"72":1,"137":1}}],["сломать",{"2":{"2":1}}],["сопоставимое",{"2":{"107":1}}],["сопутствующей",{"2":{"106":2}}],["сопутствующие",{"2":{"106":1}}],["сопровождаемость",{"2":{"29":1}}],["сопровождения",{"2":{"25":1}}],["составителя",{"2":{"139":1}}],["состоять",{"2":{"106":1}}],["состоят",{"2":{"31":1,"38":1}}],["состоящую",{"2":{"31":1}}],["состоянию",{"2":{"47":1}}],["состоянии",{"2":{"36":1,"72":2}}],["состояний",{"2":{"25":1}}],["состояниями",{"2":{"89":1}}],["состояния",{"2":{"17":1,"19":1}}],["состоянием",{"2":{"77":1,"89":1,"109":1}}],["состояние",{"2":{"15":2,"19":1,"106":2}}],["состоит",{"2":{"6":1,"9":1,"10":1,"69":1}}],["сосредоточились",{"2":{"56":1}}],["сотен",{"2":{"38":1}}],["сожалению",{"2":{"37":1,"103":1,"117":1}}],["согласовать",{"2":{"50":1}}],["согласно",{"2":{"38":1}}],["согласны",{"2":{"25":1}}],["соглашений",{"2":{"20":1,"25":1,"26":1,"36":1}}],["соглашения",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"25":3,"27":1,"39":1}}],["соглашение",{"2":{"11":1}}],["сочетании",{"2":{"16":1,"47":1,"59":1}}],["сокращения",{"0":{"138":1}}],["сокращение",{"0":{"13":1,"18":1},"2":{"18":1}}],["сокращенный",{"2":{"13":1}}],["содержащая",{"2":{"106":1}}],["содержащимся",{"2":{"63":1}}],["содержащий",{"2":{"10":1,"11":1}}],["содержат",{"2":{"36":1,"116":1}}],["содержать",{"2":{"9":1,"11":1}}],["содержание",{"2":{"27":1}}],["содержимым",{"2":{"19":1}}],["содержимое",{"2":{"8":2,"10":1,"118":1}}],["содержите",{"2":{"39":1}}],["содержит",{"2":{"4":2,"10":1,"11":1,"13":1,"64":1}}],["собеседованию",{"2":{"117":1}}],["соберет",{"2":{"8":1}}],["собрать",{"2":{"102":1}}],["собрано",{"2":{"10":1}}],["собственное",{"2":{"69":1}}],["собственные",{"2":{"12":1,"25":1,"69":1}}],["собственный",{"2":{"10":1}}],["собирает",{"2":{"102":1}}],["собирались",{"2":{"37":1}}],["собираются",{"2":{"19":1,"39":1}}],["соблюсти",{"2":{"32":1}}],["соблюдаться",{"2":{"29":1}}],["соблюдали",{"2":{"25":1}}],["событий",{"2":{"60":4,"61":2,"69":1}}],["событию",{"2":{"36":1}}],["событии",{"2":{"36":1}}],["событием",{"2":{"36":3}}],["событие",{"2":{"18":4,"36":1,"60":4,"61":3,"65":1}}],["событиями",{"2":{"45":1,"60":1}}],["события",{"0":{"24":1},"2":{"11":1,"36":3,"60":1,"61":2}}],["собой",{"2":{"6":2,"7":1,"9":1,"10":1,"36":1,"66":1,"74":1,"83":1,"103":1}}],["социальными",{"2":{"7":1}}],["солидно",{"2":{"104":1}}],["соли",{"2":{"7":1}}],["совпадении",{"2":{"118":1}}],["совпадают",{"2":{"58":1,"97":1}}],["совсем",{"2":{"68":1,"108":1,"118":1}}],["советы",{"0":{"105":1},"2":{"109":1,"127":1}}],["советуется",{"2":{"97":1,"105":1}}],["совет",{"2":{"11":1,"15":1,"25":1,"33":1,"39":1,"56":1,"117":1}}],["совершенно",{"2":{"10":1,"19":1}}],["совместимость",{"2":{"64":1}}],["совместимости",{"2":{"11":1}}],["совместно",{"2":{"11":1}}],["совместное",{"2":{"4":1}}],["современный",{"2":{"78":1,"101":1,"102":1,"117":1}}],["современных",{"2":{"69":1,"78":1}}],["современные",{"0":{"114":1},"2":{"38":1,"98":1,"102":1}}],["современным",{"2":{"10":1}}],["современной",{"2":{"34":1}}],["современном",{"2":{"9":1}}],["современная",{"2":{"6":1}}],["соединения",{"2":{"5":1}}],["соображения",{"2":{"56":1}}],["сообщение",{"2":{"64":1,"137":1}}],["сообщений",{"2":{"5":2}}],["сообщения",{"2":{"5":1}}],["соответствовать",{"2":{"72":1}}],["соответствующую",{"2":{"97":1}}],["соответствующий",{"2":{"63":1,"105":1}}],["соответствующим",{"2":{"36":1}}],["соответствующих",{"2":{"31":1,"86":1}}],["соответствующему",{"2":{"62":2}}],["соответствующем",{"2":{"36":1}}],["соответствующее",{"2":{"16":1}}],["соответствует",{"2":{"7":1,"53":1,"97":1}}],["соответствии",{"2":{"7":1,"37":1,"62":1,"63":2,"117":1}}],["соответственно",{"2":{"4":1,"116":1,"118":1}}],["создадим",{"2":{"36":1,"56":1,"69":1}}],["создать",{"2":{"31":1,"38":1,"67":2,"99":1,"103":1,"106":1,"109":1}}],["создаются",{"2":{"69":1,"88":1}}],["создают",{"2":{"16":1,"40":1}}],["создаст",{"2":{"11":1}}],["создан",{"2":{"139":1}}],["созданы",{"2":{"118":1}}],["созданном",{"2":{"118":1}}],["созданному",{"2":{"11":1}}],["создана",{"2":{"97":1}}],["создание",{"0":{"85":1,"102":1},"2":{"47":1,"102":2,"103":1,"118":1}}],["созданию",{"2":{"11":1,"42":1}}],["создания",{"2":{"7":4,"8":2,"9":2,"11":1,"19":1,"34":1,"36":1,"59":2,"64":1,"69":2,"76":1,"77":1,"87":1,"90":1,"107":1,"108":1}}],["создании",{"2":{"4":1,"7":3,"62":1,"66":1}}],["создаем",{"2":{"8":1,"18":1,"57":1,"61":1,"85":1}}],["создается",{"2":{"8":1,"85":1}}],["создает",{"2":{"2":1,"50":1,"58":1,"105":1}}],["создавать",{"2":{"6":2,"12":1,"32":1,"38":1,"66":1,"73":1,"91":1,"116":1}}],["со",{"2":{"4":2,"11":1,"13":1,"22":1,"56":1,"60":1,"65":1,"69":1,"97":1,"105":1,"106":1,"118":4}}],["сохранил",{"2":{"97":1}}],["сохранили",{"2":{"68":1}}],["сохранив",{"2":{"69":1}}],["сохраним",{"2":{"36":1}}],["сохранить",{"2":{"2":1,"64":1,"118":1}}],["сохранения",{"2":{"11":1,"19":1}}],["сохраняющий",{"2":{"66":1}}],["сохраняя",{"2":{"66":1}}],["сохраняем",{"2":{"50":1,"68":1}}],["сохраняется",{"2":{"7":1}}],["сохраняет",{"2":{"2":1,"19":1,"50":1,"65":1,"97":1,"102":1}}],["сохраняйте",{"0":{"35":1}}],["сохранять",{"2":{"3":1}}],["стейты",{"2":{"106":1}}],["стейтом",{"2":{"106":5}}],["стейт",{"2":{"106":2,"108":1}}],["стейта",{"2":{"105":1,"106":3}}],["степени",{"2":{"6":1,"11":1,"28":1,"70":1}}],["студенты",{"2":{"78":1}}],["стиля",{"2":{"138":1}}],["стиль",{"2":{"14":1,"15":1,"25":1,"116":1}}],["стилизованной",{"2":{"116":1}}],["стилизацию",{"2":{"108":1,"111":1}}],["стили",{"2":{"10":2,"34":1,"116":4}}],["стилей",{"2":{"6":1,"10":2}}],["стилем",{"2":{"6":1}}],["сторе",{"2":{"106":1}}],["сторами",{"2":{"106":1}}],["сторы",{"2":{"106":2,"124":1,"126":1}}],["стор",{"2":{"106":4}}],["сторов",{"2":{"106":1}}],["стором",{"2":{"106":1}}],["стороне",{"2":{"118":2}}],["сторонняя",{"2":{"110":1}}],["сторонней",{"2":{"106":1}}],["стороннего",{"2":{"4":1,"118":1}}],["сторонним",{"2":{"4":3}}],["сторонних",{"0":{"111":1},"2":{"4":1,"5":1,"69":1}}],["сторонний",{"2":{"2":1}}],["стороны",{"2":{"4":1,"7":1,"28":1}}],["стоит",{"2":{"27":1,"39":1,"45":1,"67":1}}],["столько",{"2":{"16":1}}],["столкнуться",{"2":{"7":1,"64":1}}],["стрелочную",{"2":{"71":1}}],["стратегий",{"2":{"117":1}}],["страшном",{"2":{"105":1}}],["страдает",{"2":{"11":1}}],["странички",{"2":{"118":1}}],["страницу",{"2":{"9":2,"118":3}}],["страниц",{"2":{"6":2,"116":1}}],["странице",{"2":{"4":1,"6":1,"7":1,"8":2,"16":1,"19":2,"99":1,"107":1}}],["страницы",{"2":{"4":2,"8":2,"9":2,"69":1,"76":1,"118":4}}],["страницах",{"2":{"40":1}}],["страница",{"2":{"4":2,"6":1,"9":1,"10":1,"118":1}}],["страницам",{"2":{"4":3}}],["странным",{"2":{"10":1}}],["странно",{"2":{"9":1}}],["структуре",{"2":{"118":1}}],["структурируя",{"2":{"112":1}}],["структур",{"2":{"42":1,"64":1}}],["структуру",{"2":{"40":1}}],["структура",{"2":{"7":1,"56":1}}],["структуры",{"2":{"7":1,"62":1}}],["структурные",{"0":{"44":1},"2":{"6":1}}],["структурой",{"2":{"6":1}}],["строчкой",{"2":{"39":1}}],["строятся",{"2":{"18":1}}],["строительные",{"2":{"9":1}}],["строгость",{"2":{"5":1}}],["строке",{"2":{"61":2,"65":4,"67":2,"68":4,"72":3}}],["строковому",{"2":{"57":1}}],["строк",{"2":{"33":1,"110":1,"118":1}}],["строки",{"2":{"8":1,"11":1,"17":1,"61":1,"72":1,"102":1}}],["строками",{"2":{"4":1,"61":1}}],["строка",{"2":{"4":1,"63":1,"72":2}}],["строку",{"2":{"2":1,"4":1,"57":1,"66":1,"72":1,"105":1}}],["стало",{"2":{"106":1,"108":1}}],["стала",{"2":{"66":1,"106":1}}],["стали",{"2":{"6":1,"105":1,"106":1,"116":1}}],["стадии",{"2":{"19":1}}],["старайтесь",{"2":{"113":1,"117":1}}],["стартапе",{"2":{"107":1}}],["стартового",{"2":{"7":1}}],["старой",{"2":{"97":1}}],["старший",{"2":{"2":1}}],["статей",{"2":{"116":1}}],["статистики",{"2":{"102":1}}],["статичный",{"2":{"118":2}}],["статичным",{"2":{"109":1}}],["статичных",{"2":{"98":1}}],["статичной",{"2":{"6":1}}],["статическим",{"2":{"49":1}}],["стать",{"2":{"40":1,"117":1}}],["статьи",{"2":{"5":1,"19":1}}],["статья",{"2":{"4":1,"107":1}}],["статье",{"2":{"2":1,"104":1,"105":1,"116":1}}],["становится",{"2":{"11":1,"106":1}}],["становятся",{"2":{"4":1}}],["станут",{"2":{"11":1,"39":1}}],["станет",{"2":{"8":1}}],["стандартного",{"2":{"104":1}}],["стандартный",{"2":{"59":1}}],["стандартом",{"2":{"93":1}}],["стандартизации",{"2":{"6":1}}],["стандарты",{"0":{"114":1},"2":{"6":1,"7":1,"116":1}}],["стандарте",{"2":{"4":1}}],["стандартами",{"2":{"6":1,"25":1}}],["стандарта",{"2":{"2":1}}],["стандарт",{"2":{"2":1,"4":1}}],["ставиться",{"2":{"63":1}}],["ставить",{"2":{"2":1}}],["спальни",{"2":{"118":1}}],["спать",{"2":{"118":1}}],["спагетти",{"2":{"39":2}}],["сперва",{"2":{"101":1,"106":1,"117":1,"118":1}}],["спектр",{"2":{"51":1}}],["спецификаций",{"2":{"118":1}}],["спецификации",{"2":{"7":1}}],["специфичное",{"2":{"5":1}}],["специальную",{"2":{"12":1}}],["специальный",{"2":{"19":1,"72":1}}],["специальные",{"2":{"12":1}}],["специальных",{"2":{"4":1}}],["специального",{"2":{"5":1}}],["специализированным",{"2":{"4":1}}],["справочную",{"2":{"117":1}}],["справочник",{"2":{"73":1,"117":1}}],["справочного",{"2":{"58":1}}],["справочный",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1}}],["спрятана",{"2":{"1":1}}],["списке",{"2":{"55":1,"69":1}}],["списка",{"2":{"19":1}}],["списков",{"2":{"15":1}}],["список",{"0":{"30":1,"41":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"4":2,"11":1,"18":1,"28":1,"40":1,"41":1,"45":1}}],["способа",{"2":{"118":1}}],["способами",{"2":{"63":1}}],["способы",{"2":{"48":1,"71":1}}],["способов",{"2":{"48":1,"53":1,"69":1}}],["способом",{"2":{"8":1,"10":1,"38":1,"53":1,"72":2}}],["способе",{"2":{"11":1}}],["способ",{"2":{"2":1,"11":3,"49":1,"59":1,"61":1,"71":1,"97":2,"102":1,"118":1}}],["сайтов",{"2":{"118":1}}],["сайтом",{"2":{"117":1,"138":1}}],["сайты",{"2":{"3":1}}],["сайт",{"2":{"2":1,"95":1,"97":1,"98":4,"109":1,"117":2,"118":2}}],["сайту",{"2":{"2":1,"98":2}}],["сайте",{"2":{"2":1,"3":1,"80":1,"102":1,"105":1,"106":1,"118":1}}],["сайтами",{"2":{"118":1}}],["сайтах",{"2":{"33":1}}],["сайта",{"2":{"2":4,"97":2,"105":1,"107":1,"108":1,"109":1,"118":3}}],["самая",{"2":{"109":1}}],["самим",{"2":{"118":1}}],["сами",{"2":{"39":1,"98":1,"102":1,"117":1}}],["самые",{"2":{"72":1,"102":1,"108":1}}],["самых",{"2":{"46":1}}],["самым",{"2":{"7":1,"10":1,"17":1,"106":1,"118":1}}],["самый",{"2":{"2":1,"31":1,"46":1,"49":1,"61":1,"72":1,"97":1,"107":1,"117":1}}],["сам",{"2":{"7":1,"50":1,"60":1,"76":1,"105":1,"106":2,"112":1}}],["самоучитель",{"2":{"117":1}}],["самописный",{"2":{"116":1}}],["самой",{"2":{"107":1,"118":1}}],["самостоятельно",{"2":{"33":1,"98":2}}],["самостоятельный",{"2":{"3":1}}],["самого",{"2":{"20":1,"97":1}}],["самому",{"2":{"39":1,"55":1,"108":1,"116":1}}],["самом",{"2":{"7":1,"25":1,"40":1,"105":1}}],["самое",{"2":{"2":2,"56":2,"65":1,"103":1,"108":1,"111":1}}],["с",{"0":{"0":1,"86":1,"90":1,"94":1},"1":{"1":1},"2":{"1":3,"2":13,"3":10,"4":3,"5":4,"6":4,"7":9,"8":4,"9":3,"10":8,"11":5,"12":1,"15":2,"16":1,"17":1,"18":4,"19":1,"20":1,"22":2,"23":1,"25":1,"26":1,"28":3,"29":1,"31":3,"32":2,"33":2,"34":2,"36":9,"37":6,"39":1,"40":3,"45":3,"47":1,"48":1,"50":2,"51":2,"53":1,"56":1,"58":3,"59":1,"61":3,"62":3,"63":3,"64":6,"65":1,"66":7,"67":3,"69":9,"70":1,"71":6,"72":15,"73":3,"76":3,"78":1,"79":1,"86":2,"89":1,"90":2,"91":2,"92":2,"97":4,"98":4,"99":3,"101":1,"102":3,"103":4,"104":1,"105":3,"106":9,"107":4,"108":3,"109":7,"110":1,"111":1,"113":1,"117":10,"118":11,"121":1,"138":3}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.de88e89c.js b/assets/chunks/VPLocalSearchBox.b532e603.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.de88e89c.js rename to assets/chunks/VPLocalSearchBox.b532e603.js index 43b38b6de..93993c928 100644 --- a/assets/chunks/VPLocalSearchBox.de88e89c.js +++ b/assets/chunks/VPLocalSearchBox.b532e603.js @@ -1,4 +1,4 @@ -import{V as ze,h as ne,x as Be,ah as Nt,ai as Tt,d as kt,E as ge,aj as et,g as ke,ak as It,al as Dt,y as _t,am as Ot,j as Ie,O as fe,S as be,an as Rt,ao as Mt,W as Lt,s as Pt,ap as zt,o as Z,b as Bt,k as S,$ as Vt,l as W,a1 as $t,a2 as Wt,aq as Kt,c as ee,n as tt,e as we,D as rt,F as at,a as de,t as he,ar as jt,p as Jt,m as Ut,as as nt,at as Ht,a6 as Gt,ac as qt,_ as Qt}from"./framework.477046d0.js";import{u as Yt,c as Zt}from"./theme.88e180d0.js";const Xt={root:()=>ze(()=>import("./@localSearchIndexroot.82b40a0d.js"),[]),en:()=>ze(()=>import("./@localSearchIndexen.ab12eb82.js"),[])};/*! +import{V as ze,h as ne,x as Be,ah as Nt,ai as Tt,d as kt,E as ge,aj as et,g as ke,ak as It,al as Dt,y as _t,am as Ot,j as Ie,O as fe,S as be,an as Rt,ao as Mt,W as Lt,s as Pt,ap as zt,o as Z,b as Bt,k as S,$ as Vt,l as W,a1 as $t,a2 as Wt,aq as Kt,c as ee,n as tt,e as we,D as rt,F as at,a as de,t as he,ar as jt,p as Jt,m as Ut,as as nt,at as Ht,a6 as Gt,ac as qt,_ as Qt}from"./framework.477046d0.js";import{u as Yt,c as Zt}from"./theme.b4470a0e.js";const Xt={root:()=>ze(()=>import("./@localSearchIndexroot.cc321437.js"),[]),en:()=>ze(()=>import("./@localSearchIndexen.ab12eb82.js"),[])};/*! * tabbable 6.2.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var pt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ee=pt.join(","),yt=typeof Element>"u",oe=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Se=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ae=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},er=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},mt=function(e,t,r){if(Ae(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ee));return t&&oe.call(e,Ee)&&n.unshift(e),n=n.filter(r),n},gt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ae(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=oe.call(i,Ee);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ae(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var y=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},bt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||er(e))&&!bt(e)?0:e.tabIndex},tr=function(e,t){var r=ie(e);return r<0&&t&&!bt(e)?0:r},rr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},ar=function(e){return wt(e)&&e.type==="hidden"},nr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},ir=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(oe.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Se(e);if(u&&!u.shadowRoot&&n(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(lr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},fr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},hr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=tr(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(rr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},vr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=gt([e],t.includeContainer,{filter:Ve.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:dr}):r=mt(e,t.includeContainer,Ve.bind(null,t)),hr(r)},pr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=gt([e],t.includeContainer,{filter:Ce.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=mt(e,t.includeContainer,Ce.bind(null,t)),r},se=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return oe.call(e,Ee)===!1?!1:Ve(t,e)},yr=pt.concat("iframe").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return oe.call(e,yr)===!1?!1:Ce(t,e)};/*! diff --git a/assets/chunks/theme.88e180d0.js b/assets/chunks/theme.b4470a0e.js similarity index 99% rename from assets/chunks/theme.88e180d0.js rename to assets/chunks/theme.b4470a0e.js index ae4879273..c78e2b5eb 100644 --- a/assets/chunks/theme.88e180d0.js +++ b/assets/chunks/theme.b4470a0e.js @@ -1 +1 @@ -import{d as g,o as a,c as i,r as u,n as C,a as x,t as L,_ as m,b as $,w as v,T as ce,e as f,u as De,i as Ee,f as ue,g as P,h as I,j as K,k as c,l as r,p as H,m as z,q as j,s as W,v as le,x as q,y as te,z as de,A as we,B as Fe,C as R,F as T,D as A,E as _e,G as Y,H as h,I as U,J as Le,K as se,L as Z,M as ne,N as Oe,O as Ge,P as Se,Q as Ue,R as je,S as ye,U as Ke,V as qe,W as Me,X as Ne,Y as Re,Z as We,$ as Ye,a0 as Je}from"./framework.477046d0.js";const Xe=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:C(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(L(e.text),1)],!0)],2))}});const Ze=m(Xe,[["__scopeId","data-v-394e4c62"]]),Qe={key:0,class:"VPBackdrop"},et=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(ce,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",Qe)):f("",!0)]),_:1}))}});const tt=m(et,[["__scopeId","data-v-da587472"]]),V=De;function st(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function re(s){return/^\//.test(s)?s:`/${s}`}function J(s){if(Ee(s))return s;const{site:e}=V(),{pathname:t,search:n,hash:o}=new URL(s,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${n}${o}`);return ue(l)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:l}=V(),d=P(()=>{var _,b;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,b])=>s&&d.value.label===b.label?[]:{text:b.label,link:nt(b.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function nt(s,e,t,n){return e?s.replace(/\/$/,"")+re(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const ot=s=>(H("data-v-f8580bb4"),s=s(),z(),s),at={class:"NotFound"},lt={class:"code"},rt={class:"title"},it=ot(()=>c("div",{class:"divider"},null,-1)),ct={class:"quote"},ut={class:"action"},dt=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=V(),{localeLinks:n}=X({removeCurrent:!1}),o=I("/");return K(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(l)))==null?void 0:d.link)||n.value[0].link)}),(l,d)=>{var p,_,b,w,S;return a(),i("div",at,[c("p",lt,L(((p=r(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",rt,L(((_=r(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),it,c("blockquote",ct,L(((b=r(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",ut,[c("a",{class:"link",href:r(ue)(o.value),"aria-label":((w=r(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=r(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,dt)])])}}});const vt=m(_t,[["__scopeId","data-v-f8580bb4"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=re(e);const t=Object.keys(s).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(re(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function pt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ht(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):j(s,e.link)?!0:e.items?ie(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function F(){const{frontmatter:s,page:e,theme:t}=V(),n=le("(min-width: 960px)"),o=I(!1),l=P(()=>{const N=t.value.sidebar,y=e.value.relativePath;return N?Ie(N,y):[]}),d=I(l.value);q(l,(N,y)=>{JSON.stringify(N)!==JSON.stringify(y)&&(d.value=l.value)});const p=P(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=P(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=P(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),w=P(()=>p.value&&n.value),S=P(()=>p.value?pt(d.value):[]);function B(){o.value=!0}function k(){o.value=!1}function M(){o.value?k():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:p,hasAside:b,leftAside:_,isSidebarEnabled:w,open:B,close:k,toggle:M}}function ft(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",n)}),de(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Te=I(W?location.hash:"");W&&window.addEventListener("hashchange",()=>{Te.value=location.hash});function mt(s){const{page:e}=V(),t=I(!1),n=P(()=>s.value.collapsed!=null),o=P(()=>!!s.value.link),l=I(!1),d=()=>{l.value=j(e.value.relativePath,s.value.link)};q([e,s,Te],d),K(d);const p=P(()=>l.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),_=P(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(l.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:p,hasChildren:_,toggle:b}}function gt(){const{hasSidebar:s}=F(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const bt=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:$t(t),link:"#"+t.id,level:n}});return kt(e,s)}function $t(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function kt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const b=s[_];if(b.level{requestAnimationFrame(l),window.addEventListener("scroll",n)}),Fe(()=>{d(location.hash)}),de(()=>{window.removeEventListener("scroll",n)});function l(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>p.some(M=>M.hash===k.hash&&k.offsetParent!==null)),b=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs(b+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let k=0;k<_.length;k++){const M=_[k],N=_[k+1],[y,D]=Pt(k,M,N);if(y){d(D);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-bt}function Pt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=R("VPDocOutlineItem",!0);return a(),i("ul",{class:C(t.root?"root":"nested")},[(a(!0),i(T,null,A(t.headers,({children:l,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Vt),l!=null&&l.length?(a(),$(o,{key:0,headers:l},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(wt,[["__scopeId","data-v-c043bf3a"]]),Lt=s=>(H("data-v-832577d7"),s=s(),z(),s),St={class:"content"},Mt={class:"outline-title",role:"heading","aria-level":"2"},Nt={"aria-labelledby":"doc-outline-aria-label"},It=Lt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Tt=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=V(),n=_e([]);Y(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=I(),l=I();return yt(o,l),(d,p)=>(a(),i("div",{class:C(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",St,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",Mt,L(r(ve)(r(t))),1),c("nav",Nt,[It,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Ct=m(Tt,[["__scopeId","data-v-832577d7"]]),Bt={class:"VPDocAsideCarbonAds"},At=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",Bt,[h(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),xt=s=>(H("data-v-59f2eefd"),s=s(),z(),s),Ht={class:"VPDocAside"},zt=xt(()=>c("div",{class:"spacer"},null,-1)),Dt=g({__name:"VPDocAside",setup(s){const{theme:e}=V();return(t,n)=>(a(),i("div",Ht,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Ct),u(t.$slots,"aside-outline-after",{},void 0,!0),zt,u(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),$(At,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Et=m(Dt,[["__scopeId","data-v-59f2eefd"]]);function Ft(){const{theme:s,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Ot(){const{page:s,theme:e,frontmatter:t}=V();return P(()=>{var _,b,w,S,B,k,M,N;const n=Ie(e.value.sidebar,s.value.relativePath),o=ht(n),l=o.findIndex(y=>j(s.value.relativePath,y.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((k=o[l+1])==null?void 0:k.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=o[l+1])==null?void 0:N.link)}}})}const Gt={},Ut={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},jt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Kt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qt=[jt,Kt];function Rt(s,e){return a(),i("svg",Ut,qt)}const Wt=m(Gt,[["render",Rt]]),G=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=P(()=>e.tag??(e.href?"a":"span")),n=P(()=>e.href&&Le.test(e.href));return(o,l)=>(a(),$(U(t.value),{class:C(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?r(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Jt=["datetime"],Xt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=V(),l=P(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),p=I("");return K(()=>{te(()=>{var _,b,w;p.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,b)=>{var w;return a(),i("p",Yt,[x(L(((w=r(e).lastUpdated)==null?void 0:w.text)||r(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Jt)])}}});const Zt=m(Xt,[["__scopeId","data-v-82edb21a"]]),Qt={key:0,class:"VPDocFooter"},es={key:0,class:"edit-info"},ts={key:0,class:"edit-link"},ss={key:1,class:"last-updated"},ns={key:1,class:"prev-next"},os={class:"pager"},as=["href"],ls=["innerHTML"],rs=["innerHTML"],is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=V(),o=Ft(),l=Ot(),d=P(()=>e.value.editLink&&n.value.editLink!==!1),p=P(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=P(()=>d.value||p.value||l.value.prev||l.value.next);return(b,w)=>{var S,B,k,M,N,y;return _.value?(a(),i("footer",Qt,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",es,[d.value?(a(),i("div",ts,[h(G,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:v(()=>[h(Wt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+L(r(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",ss,[h(Zt)])):f("",!0)])):f("",!0),(S=r(l).prev)!=null&&S.link||(B=r(l).next)!=null&&B.link?(a(),i("nav",ns,[c("div",os,[(k=r(l).prev)!=null&&k.link?(a(),i("a",{key:0,class:"pager-link prev",href:r(J)(r(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=r(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:r(l).prev.text},null,8,rs)],8,as)):f("",!0)]),c("div",is,[(N=r(l).next)!=null&&N.link?(a(),i("a",{key:0,class:"pager-link next",href:r(J)(r(l).next.link)},[c("span",{class:"desc",innerHTML:((y=r(e).docFooter)==null?void 0:y.next)||"Next page"},null,8,us),c("span",{class:"title",innerHTML:r(l).next.text},null,8,ds)],8,cs)):f("",!0)])])):f("",!0)])):f("",!0)}}});const vs=m(_s,[["__scopeId","data-v-93d7bb42"]]),ps={},hs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fs=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ms=[fs];function gs(s,e){return a(),i("svg",hs,ms)}const fe=m(ps,[["render",gs]]),bs={key:0,class:"VPDocOutlineDropdown"},$s={key:0,class:"items"},ks=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=V(),n=I(!1);Y(()=>{n.value=!1});const o=_e([]);return Y(()=>{o.value=pe(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),i("div",bs,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:C({open:n.value})},[x(L(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",$s,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const ys=m(ks,[["__scopeId","data-v-29293128"]]),Ps=s=>(H("data-v-0484986b"),s=s(),z(),s),Vs={class:"container"},ws=Ps(()=>c("div",{class:"aside-curtain"},null,-1)),Ls={class:"aside-container"},Ss={class:"aside-content"},Ms={class:"content"},Ns={class:"content-container"},Is={class:"main"},Ts=g({__name:"VPDoc",setup(s){const{theme:e}=V(),t=se(),{hasSidebar:n,hasAside:o,leftAside:l}=F(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const b=R("Content");return a(),i("div",{class:C(["VPDoc",{"has-sidebar":r(n),"has-aside":r(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Vs,[r(o)?(a(),i("div",{key:0,class:C(["aside",{"left-aside":r(l)}])},[ws,c("div",Ls,[c("div",Ss,[h(Et,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ms,[c("div",Ns,[u(p.$slots,"doc-before",{},void 0,!0),h(ys),c("main",Is,[h(b,{class:C(["vp-doc",[d.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(vs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Cs=m(Ts,[["__scopeId","data-v-0484986b"]]),Bs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=P(()=>e.href&&Le.test(e.href)),n=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),$(U(n.value),{class:C(["VPButton",[o.size,o.theme]]),href:o.href?r(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const As=m(Bs,[["__scopeId","data-v-ccb90d73"]]),xs=["src","alt"],Hs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),i(T,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,xs)):(a(),i(T,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Hs,[["__scopeId","data-v-1a473120"]]),zs=s=>(H("data-v-9f4ba9bd"),s=s(),z(),s),Ds={class:"container"},Es={class:"main"},Fs={key:0,class:"name"},Os=["innerHTML"],Gs=["innerHTML"],Us=["innerHTML"],js={key:0,class:"actions"},Ks={key:0,class:"image"},qs={class:"image-container"},Rs=zs(()=>c("div",{class:"image-bg"},null,-1)),Ws=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:C(["VPHero",{"has-image":t.image||r(e)}])},[c("div",Ds,[c("div",Es,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Fs,[c("span",{innerHTML:t.name,class:"clip"},null,8,Os)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Gs)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Us)):f("",!0)],!0),t.actions?(a(),i("div",js,[(a(!0),i(T,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(As,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||r(e)?(a(),i("div",Ks,[c("div",qs,[Rs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Ys=m(Ws,[["__scopeId","data-v-9f4ba9bd"]]),Js=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=V();return(t,n)=>r(e).hero?(a(),$(Ys,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Xs={},Zs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Qs=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),en=[Qs];function tn(s,e){return a(),i("svg",Zs,en)}const sn=m(Xs,[["render",tn]]),nn={class:"box"},on={key:0,class:"icon"},an=["innerHTML"],ln=["innerHTML"],rn=["innerHTML"],cn={key:4,class:"link-text"},un={class:"link-text-value"},dn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(G,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",on,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,an)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,rn)):f("",!0),e.linkText?(a(),i("div",cn,[c("p",un,[x(L(e.linkText)+" ",1),h(sn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const _n=m(dn,[["__scopeId","data-v-484eeed2"]]),vn={key:0,class:"VPFeatures"},pn={class:"container"},hn={class:"items"},fn=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=P(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",vn,[c("div",pn,[c("div",hn,[(a(!0),i(T,null,A(n.features,l=>(a(),i("div",{key:l.title,class:C(["item",[t.value]])},[h(_n,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const mn=m(fn,[["__scopeId","data-v-a4ebea2b"]]),gn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=V();return(t,n)=>r(e).features?(a(),$(mn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):f("",!0)}}),bn={class:"VPHome"},$n=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),i("div",bn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Js,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(gn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const kn=m($n,[["__scopeId","data-v-26209f9b"]]),yn={},Pn={class:"VPPage"};function Vn(s,e){const t=R("Content");return a(),i("div",Pn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const wn=m(yn,[["render",Vn]]),Ln=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=V(),{hasSidebar:n}=F();return(o,l)=>(a(),i("div",{class:C(["VPContent",{"has-sidebar":r(n),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(vt)],!0):r(t).layout==="page"?(a(),$(wn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),$(kn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),$(U(r(t).layout),{key:3})):(a(),$(Cs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Sn=m(Ln,[["__scopeId","data-v-2b03cc39"]]),Mn={class:"container"},Nn=["innerHTML"],In=["innerHTML"],Tn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=F();return(o,l)=>r(e).footer&&r(t).footer!==!1?(a(),i("footer",{key:0,class:C(["VPFooter",{"has-sidebar":r(n)}])},[c("div",Mn,[r(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,Nn)):f("",!0),r(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,In)):f("",!0)])],2)):f("",!0)}});const Cn=m(Tn,[["__scopeId","data-v-8a6e0bb4"]]),Bn={class:"header"},An={class:"outline"},xn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=V(),n=I(!1),o=I(0),l=I();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ge(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,w)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Oe({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),i("button",{key:0,onClick:d,class:C({open:n.value})},[x(L(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(r(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:p},[c("div",Bn,[c("a",{class:"top-link",href:"#",onClick:_},L(r(t).returnToTopLabel||"Return to top"),1)]),c("div",An,[h(he,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Hn=m(xn,[["__scopeId","data-v-885e757a"]]),zn={},Dn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},En=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Fn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),On=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Gn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Un=[En,Fn,On,Gn];function jn(s,e){return a(),i("svg",Dn,Un)}const Kn=m(zn,[["render",jn]]),qn=["aria-expanded"],Rn={class:"menu-text"},Wn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=F(),{y:o}=Se(),l=_e([]),d=I(0);K(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{l.value=pe(t.value.outline??e.value.outline)});const p=P(()=>l.value.length===0&&!n.value),_=P(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(b,w)=>r(t).layout!=="home"&&(!p.value||r(o)>=d.value)?(a(),i("div",{key:0,class:C(_.value)},[r(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>b.$emit("open-menu"))},[h(Kn,{class:"menu-icon"}),c("span",Rn,L(r(e).sidebarMenuLabel||"Menu"),1)],8,qn)):f("",!0),h(Hn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Yn=m(Wn,[["__scopeId","data-v-d3e292f7"]]);function Jn(){const s=I(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=se();return q(()=>l.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Xn={},Zn={class:"VPSwitch",type:"button",role:"switch"},Qn={class:"check"},eo={key:0,class:"icon"};function to(s,e){return a(),i("button",Zn,[c("span",Qn,[s.$slots.default?(a(),i("span",eo,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const so=m(Xn,[["render",to],["__scopeId","data-v-979c26e2"]]),no={},oo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ao=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),lo=[ao];function ro(s,e){return a(),i("svg",oo,lo)}const io=m(no,[["render",ro]]),co={},uo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_o=Ue('',9),vo=[_o];function po(s,e){return a(),i("svg",uo,vo)}const ho=m(co,[["render",po]]),fo=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=V(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(so,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(t)},{default:v(()=>[h(ho,{class:"sun"}),h(io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(fo,[["__scopeId","data-v-fb67176c"]]),mo={key:0,class:"VPNavBarAppearance"},go=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=V();return(t,n)=>r(e).appearance&&r(e).appearance!=="force-dark"?(a(),i("div",mo,[h(me)])):f("",!0)}});const bo=m(go,[["__scopeId","data-v-1b34bacc"]]),ge=I();let Ce=!1,ae=0;function $o(s){const e=I(!1);if(W){!Ce&&ko(),ae++;const t=q(ge,n=>{var o,l,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(l=s.onFocus)==null||l.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});de(()=>{t(),ae--,ae||yo()})}return je(e)}function ko(){document.addEventListener("focusin",Be),Ce=!0,ge.value=document.activeElement}function yo(){document.removeEventListener("focusin",Be)}function Be(){ge.value=document.activeElement}const Po={},Vo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Lo=[wo];function So(s,e){return a(),i("svg",Vo,Lo)}const Ae=m(Po,[["render",So]]),Mo={},No={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),To=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Bo=[Io,To,Co];function Ao(s,e){return a(),i("svg",No,Bo)}const xo=m(Mo,[["render",Ao]]),Ho={class:"VPMenuLink"},zo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),i("div",Ho,[h(G,{class:C({active:r(j)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(zo,[["__scopeId","data-v-f34060c4"]]),Do={class:"VPMenuGroup"},Eo={key:0,class:"title"},Fo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Do,[e.text?(a(),i("p",Eo,L(e.text),1)):f("",!0),(a(!0),i(T,null,A(e.items,n=>(a(),i(T,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Oo=m(Fo,[["__scopeId","data-v-d9d9a1a9"]]),Go={class:"VPMenu"},Uo={key:0,class:"items"},jo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Go,[e.items?(a(),i("div",Uo,[(a(!0),i(T,null,A(e.items,n=>(a(),i(T,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Oo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ko=m(jo,[["__scopeId","data-v-b93937a4"]]),qo=["aria-expanded","aria-label"],Ro={key:0,class:"text"},Wo=["innerHTML"],Yo={class:"menu"},Jo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=I(!1),t=I();$o({el:t,onBlur:n});function n(){e.value=!1}return(o,l)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Ro,[o.icon?(a(),$(U(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Wo)):f("",!0),h(Ae,{class:"text-icon"})])):(a(),$(xo,{key:1,class:"icon"}))],8,qo),c("div",Yo,[h(Ko,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Jo,[["__scopeId","data-v-e68c2038"]]),Xo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Zo=["href","aria-label","innerHTML"],Qo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=P(()=>typeof e.icon=="object"?e.icon.svg:Xo[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Zo))}});const ea=m(Qo,[["__scopeId","data-v-89712794"]]),ta={class:"VPSocialLinks"},sa=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",ta,[(a(!0),i(T,null,A(e.links,({link:n,icon:o,ariaLabel:l})=>(a(),$(ea,{key:n,icon:o,link:n,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const $e=m(sa,[["__scopeId","data-v-75d6f2f5"]]),na={key:0,class:"group translations"},oa={class:"trans-title"},aa={key:1,class:"group"},la={class:"item appearance"},ra={class:"label"},ia={class:"appearance-action"},ca={key:2,class:"group"},ua={class:"item social-links"},da=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=V(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),l=P(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>l.value?(a(),$(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[r(n).length&&r(o).label?(a(),i("div",na,[c("p",oa,L(r(o).label),1),(a(!0),i(T,null,A(r(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),r(e).appearance?(a(),i("div",aa,[c("div",la,[c("p",ra,L(r(t).darkModeSwitchLabel||"Appearance"),1),c("div",ia,[h(me)])])])):f("",!0),r(t).socialLinks?(a(),i("div",ca,[c("div",ua,[h($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const _a=m(da,[["__scopeId","data-v-754c055d"]]),va=s=>(H("data-v-c70218b2"),s=s(),z(),s),pa=["aria-expanded"],ha=va(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),fa=[ha],ma=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:C(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},fa,10,pa))}});const ga=m(ma,[["__scopeId","data-v-c70218b2"]]),ba=["innerHTML"],$a=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),$(G,{class:C({VPNavBarMenuLink:!0,active:r(j)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,ba)]),_:1},8,["class","href","target","rel"]))}});const ka=m($a,[["__scopeId","data-v-f7d34d3c"]]),ya=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=V(),n=l=>"link"in l?j(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(n),o=P(()=>n(e.item));return(l,d)=>(a(),$(be,{class:C({VPNavBarMenuGroup:!0,active:r(j)(r(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Pa=s=>(H("data-v-344279fb"),s=s(),z(),s),Va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=Pa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),La=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=V();return(t,n)=>r(e).nav?(a(),i("nav",Va,[wa,(a(!0),i(T,null,A(r(e).nav,o=>(a(),i(T,{key:o.text},["link"in o?(a(),$(ka,{key:0,item:o},null,8,["item"])):(a(),$(ya,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Sa=m(La,[["__scopeId","data-v-344279fb"]]);const Ma={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Na={class:"DocSearch-Button-Container"},Ia=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ta={class:"DocSearch-Button-Placeholder"},Ca=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(s){return(e,t)=>(a(),i("button",Ma,[c("span",Na,[Ia,c("span",Ta,L(e.placeholder),1)]),Ca]))}});const Ba={class:"VPNavBarSearch"},Aa={id:"local-search"},xa={key:1,id:"docsearch"},Ha=g({__name:"VPNavBarSearch",setup(s){const e=Ke(()=>qe(()=>import("./VPLocalSearchBox.de88e89c.js"),["assets/chunks/VPLocalSearchBox.de88e89c.js","assets/chunks/framework.477046d0.js"])),t=()=>null,{theme:n,localeIndex:o}=V(),l=I(!1),d=I(!1),p=P(()=>{var M,N,y,D,O,E,ke;const k=((M=n.value.search)==null?void 0:M.options)??n.value.algolia;return((O=(D=(y=(N=k==null?void 0:k.locales)==null?void 0:N[o.value])==null?void 0:y.translations)==null?void 0:D.button)==null?void 0:O.buttonText)||((ke=(E=k==null?void 0:k.translations)==null?void 0:E.button)==null?void 0:ke.buttonText)||"Search"});K(()=>{});function _(){l.value||(l.value=!0,setTimeout(b,16))}function b(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||b()},16)}function w(k){const M=k.target,N=M.tagName;return M.isContentEditable||N==="INPUT"||N==="SELECT"||N==="TEXTAREA"}const S=I(!1);ye("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),S.value=!0)}),ye("/",k=>{w(k)||(k.preventDefault(),S.value=!0)});const B="local";return(k,M)=>{var N;return a(),i("div",Ba,[r(B)==="local"?(a(),i(T,{key:0},[S.value?(a(),$(r(e),{key:0,placeholder:p.value,onClose:M[0]||(M[0]=y=>S.value=!1)},null,8,["placeholder"])):f("",!0),c("div",Aa,[h(Ve,{placeholder:p.value,onClick:M[1]||(M[1]=y=>S.value=!0)},null,8,["placeholder"])])],64)):r(B)==="algolia"?(a(),i(T,{key:1},[l.value?(a(),$(r(t),{key:0,algolia:((N=r(n).search)==null?void 0:N.options)??r(n).algolia,onVnodeBeforeMount:M[2]||(M[2]=y=>d.value=!0)},null,8,["algolia"])):f("",!0),d.value?f("",!0):(a(),i("div",xa,[h(Ve,{placeholder:p.value,onClick:_},null,8,["placeholder"])]))],64)):f("",!0)])}}});const za=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(a(),$($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}});const Da=m(za,[["__scopeId","data-v-ce6708f5"]]),Ea=["href"],Fa=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=V(),{hasSidebar:n}=F(),{currentLang:o}=X();return(l,d)=>(a(),i("div",{class:C(["VPNavBarTitle",{"has-sidebar":r(n)}])},[c("a",{class:"title",href:r(t).logoLink??r(J)(r(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),$(ee,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):f("",!0),r(t).siteTitle?(a(),i(T,{key:1},[x(L(r(t).siteTitle),1)],64)):r(t).siteTitle===void 0?(a(),i(T,{key:2},[x(L(r(e).title),1)],64)):f("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ea)],2))}});const Oa=m(Fa,[["__scopeId","data-v-7f378e0f"]]),Ga={},Ua={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ka=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),qa=[ja,Ka];function Ra(s,e){return a(),i("svg",Ua,qa)}const xe=m(Ga,[["render",Ra]]),Wa={class:"items"},Ya={class:"title"},Ja=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=V(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,l)=>r(t).length&&r(n).label?(a(),$(be,{key:0,class:"VPNavBarTranslations",icon:xe,label:r(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Wa,[c("p",Ya,L(r(n).label),1),(a(!0),i(T,null,A(r(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Xa=m(Ja,[["__scopeId","data-v-555fc0a2"]]),Za=s=>(H("data-v-c3e73ad1"),s=s(),z(),s),Qa={class:"container"},el={class:"title"},tl={class:"content"},sl=Za(()=>c("div",{class:"curtain"},null,-1)),nl={class:"content-body"},ol=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=F(),{frontmatter:n}=V(),o=I({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),i("div",{class:C(["VPNavBar",o.value])},[c("div",Qa,[c("div",el,[h(Oa,null,{"nav-bar-title-before":v(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",tl,[sl,c("div",nl,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),h(Ha,{class:"search"}),h(Sa,{class:"menu"}),h(Xa,{class:"translations"}),h(bo,{class:"appearance"}),h(Da,{class:"social-links"}),h(_a,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),h(ga,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const al=m(ol,[["__scopeId","data-v-c3e73ad1"]]),ll={key:0,class:"VPNavScreenAppearance"},rl={class:"text"},il=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=V();return(n,o)=>r(e).appearance?(a(),i("div",ll,[c("p",rl,L(r(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const cl=m(il,[["__scopeId","data-v-0ef3d703"]]),ul=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(G,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const dl=m(ul,[["__scopeId","data-v-cd45b3cd"]]),_l={},vl={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pl=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),hl=[pl];function fl(s,e){return a(),i("svg",vl,hl)}const ml=m(_l,[["render",fl]]),gl=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(G,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const He=m(gl,[["__scopeId","data-v-67e5b794"]]),bl={class:"VPNavScreenMenuGroupSection"},$l={key:0,class:"title"},kl=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",bl,[e.text?(a(),i("p",$l,L(e.text),1)):f("",!0),(a(!0),i(T,null,A(e.items,n=>(a(),$(He,{key:n.text,item:n},null,8,["item"]))),128))]))}});const yl=m(kl,[["__scopeId","data-v-c7bb2a3e"]]),Pl=["aria-controls","aria-expanded"],Vl={class:"button-text"},wl=["id"],Ll={key:1,class:"group"},Sl=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=I(!1),n=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),i("div",{class:C(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Vl,L(l.text),1),h(ml,{class:"button-icon"})],8,Pl),c("div",{id:n.value,class:"items"},[(a(!0),i(T,null,A(l.items,p=>(a(),i(T,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(He,{item:p},null,8,["item"])])):(a(),i("div",Ll,[h(yl,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,wl)],2))}});const Ml=m(Sl,[["__scopeId","data-v-63fd6e4e"]]),Nl={key:0,class:"VPNavScreenMenu"},Il=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=V();return(t,n)=>r(e).nav?(a(),i("nav",Nl,[(a(!0),i(T,null,A(r(e).nav,o=>(a(),i(T,{key:o.text},["link"in o?(a(),$(dl,{key:0,item:o},null,8,["item"])):(a(),$(Ml,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Tl=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(a(),$($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Cl={class:"list"},Bl=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=I(!1);function o(){n.value=!n.value}return(l,d)=>r(e).length&&r(t).label?(a(),i("div",{key:0,class:C(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(xe,{class:"icon lang"}),x(" "+L(r(t).label)+" ",1),h(Ae,{class:"icon chevron"})]),c("ul",Cl,[(a(!0),i(T,null,A(r(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(G,{class:"link",href:p.link},{default:v(()=>[x(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Al=m(Bl,[["__scopeId","data-v-10cb32fc"]]),xl={class:"container"},Hl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=I(null),t=Me(W?document.body:null);return(n,o)=>(a(),$(ce,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",xl,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Il,{class:"menu"}),h(Al,{class:"translations"}),h(cl,{class:"appearance"}),h(Tl,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const zl=m(Hl,[["__scopeId","data-v-c4b5a2af"]]),Dl={key:0,class:"VPNav"},El=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Jn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Ne("close-screen",t),te(()=>{W&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,p)=>l.value?(a(),i("header",Dl,[h(al,{"is-screen-open":r(e),onToggleScreen:r(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(zl,{open:r(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Fl=m(El,[["__scopeId","data-v-a8878f8a"]]),Ol=s=>(H("data-v-66eb756e"),s=s(),z(),s),Gl=["role","tabindex"],Ul=Ol(()=>c("div",{class:"indicator"},null,-1)),jl=["onKeydown"],Kl={key:1,class:"items"},ql=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:p,toggle:_}=mt(P(()=>e.item)),b=P(()=>p.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M(y){"key"in y&&y.key!=="Enter"||!e.item.link&&_()}function N(){e.item.link&&_()}return(y,D)=>{const O=R("VPSidebarItem",!0);return a(),$(U(b.value),{class:C(["VPSidebarItem",k.value])},{default:v(()=>[y.item.text?(a(),i("div",Z({key:0,class:"item",role:B.value},We(y.item.items?{click:M,keydown:M}:{},!0),{tabindex:y.item.items&&0}),[Ul,y.item.link?(a(),$(G,{key:0,tag:w.value,class:"link",href:y.item.link,rel:y.item.rel,target:y.item.target},{default:v(()=>[(a(),$(U(S.value),{class:"text",innerHTML:y.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(U(S.value),{key:1,class:"text",innerHTML:y.item.text},null,8,["innerHTML"])),y.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:Re(N,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,jl)):f("",!0)],16,Gl)):f("",!0),y.item.items&&y.item.items.length?(a(),i("div",Kl,[y.depth<5?(a(!0),i(T,{key:0},A(y.item.items,E=>(a(),$(O,{key:E.text,item:E,depth:y.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Rl=m(ql,[["__scopeId","data-v-66eb756e"]]),ze=s=>(H("data-v-e9e5071d"),s=s(),z(),s),Wl=ze(()=>c("div",{class:"curtain"},null,-1)),Yl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Jl=ze(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Xl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const e=s,{sidebarGroups:t,hasSidebar:n}=F(),o=I(null),l=Me(W?document.body:null);return q([e,o],()=>{var d;e.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,p)=>r(n)?(a(),i("aside",{key:0,class:C(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Ye(()=>{},["stop"]))},[Wl,c("nav",Yl,[Jl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(T,null,A(r(t),_=>(a(),i("div",{key:_.text,class:"group"},[h(Rl,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Zl=m(Xl,[["__scopeId","data-v-e9e5071d"]]),Ql=g({__name:"VPSkipLink",setup(s){const e=se(),t=I();q(()=>e.path,()=>t.value.focus());function n({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),i(T,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const er=m(Ql,[["__scopeId","data-v-7ac0da99"]]),tr=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=F(),o=se();q(()=>o.path,n),ft(e,n);const{frontmatter:l}=V(),d=Je(),p=P(()=>!!d["home-hero-image"]);return Ne("hero-image-slot-exists",p),(_,b)=>{const w=R("Content");return r(l).layout!==!1?(a(),i("div",{key:0,class:C(["Layout",r(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(er),h(tt,{class:"backdrop",show:r(e),onClick:r(n)},null,8,["show","onClick"]),h(Fl,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Yn,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),h(Zl,{open:r(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Sn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Cn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(w,{key:1}))}}});const sr=m(tr,[["__scopeId","data-v-b45c2b2b"]]);const or={Layout:sr,enhanceApp:({app:s})=>{s.component("Badge",Ze)}};function ar(s,e){const{localeIndex:t}=V();function n(o){var k,M;const l=o.split("."),d=s&&typeof s=="object",p=d&&((M=(k=s.locales)==null?void 0:k[t.value])==null?void 0:M.translations)||null,_=d&&s.translations||null;let b=p,w=_,S=e;const B=l.pop();for(const N of l){let y=null;const D=S==null?void 0:S[N];D&&(y=S=D);const O=w==null?void 0:w[N];O&&(y=w=O);const E=b==null?void 0:b[N];E&&(y=b=E),D||(S=y),O||(w=y),E||(b=y)}return(b==null?void 0:b[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return n}export{ar as c,or as t,V as u}; +import{d as g,o as a,c as i,r as u,n as C,a as x,t as L,_ as m,b as $,w as v,T as ce,e as f,u as De,i as Ee,f as ue,g as P,h as I,j as K,k as c,l as r,p as H,m as z,q as j,s as W,v as le,x as q,y as te,z as de,A as we,B as Fe,C as R,F as T,D as A,E as _e,G as Y,H as h,I as U,J as Le,K as se,L as Z,M as ne,N as Oe,O as Ge,P as Se,Q as Ue,R as je,S as ye,U as Ke,V as qe,W as Me,X as Ne,Y as Re,Z as We,$ as Ye,a0 as Je}from"./framework.477046d0.js";const Xe=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:C(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(L(e.text),1)],!0)],2))}});const Ze=m(Xe,[["__scopeId","data-v-394e4c62"]]),Qe={key:0,class:"VPBackdrop"},et=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(ce,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",Qe)):f("",!0)]),_:1}))}});const tt=m(et,[["__scopeId","data-v-da587472"]]),V=De;function st(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function re(s){return/^\//.test(s)?s:`/${s}`}function J(s){if(Ee(s))return s;const{site:e}=V(),{pathname:t,search:n,hash:o}=new URL(s,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${n}${o}`);return ue(l)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:l}=V(),d=P(()=>{var _,b;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,b])=>s&&d.value.label===b.label?[]:{text:b.label,link:nt(b.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function nt(s,e,t,n){return e?s.replace(/\/$/,"")+re(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const ot=s=>(H("data-v-f8580bb4"),s=s(),z(),s),at={class:"NotFound"},lt={class:"code"},rt={class:"title"},it=ot(()=>c("div",{class:"divider"},null,-1)),ct={class:"quote"},ut={class:"action"},dt=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=V(),{localeLinks:n}=X({removeCurrent:!1}),o=I("/");return K(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(l)))==null?void 0:d.link)||n.value[0].link)}),(l,d)=>{var p,_,b,w,S;return a(),i("div",at,[c("p",lt,L(((p=r(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",rt,L(((_=r(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),it,c("blockquote",ct,L(((b=r(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",ut,[c("a",{class:"link",href:r(ue)(o.value),"aria-label":((w=r(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=r(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,dt)])])}}});const vt=m(_t,[["__scopeId","data-v-f8580bb4"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=re(e);const t=Object.keys(s).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(re(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function pt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ht(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):j(s,e.link)?!0:e.items?ie(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function F(){const{frontmatter:s,page:e,theme:t}=V(),n=le("(min-width: 960px)"),o=I(!1),l=P(()=>{const N=t.value.sidebar,y=e.value.relativePath;return N?Ie(N,y):[]}),d=I(l.value);q(l,(N,y)=>{JSON.stringify(N)!==JSON.stringify(y)&&(d.value=l.value)});const p=P(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=P(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=P(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),w=P(()=>p.value&&n.value),S=P(()=>p.value?pt(d.value):[]);function B(){o.value=!0}function k(){o.value=!1}function M(){o.value?k():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:p,hasAside:b,leftAside:_,isSidebarEnabled:w,open:B,close:k,toggle:M}}function ft(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",n)}),de(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Te=I(W?location.hash:"");W&&window.addEventListener("hashchange",()=>{Te.value=location.hash});function mt(s){const{page:e}=V(),t=I(!1),n=P(()=>s.value.collapsed!=null),o=P(()=>!!s.value.link),l=I(!1),d=()=>{l.value=j(e.value.relativePath,s.value.link)};q([e,s,Te],d),K(d);const p=P(()=>l.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),_=P(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(l.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:p,hasChildren:_,toggle:b}}function gt(){const{hasSidebar:s}=F(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const bt=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:$t(t),link:"#"+t.id,level:n}});return kt(e,s)}function $t(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function kt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const b=s[_];if(b.level{requestAnimationFrame(l),window.addEventListener("scroll",n)}),Fe(()=>{d(location.hash)}),de(()=>{window.removeEventListener("scroll",n)});function l(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>p.some(M=>M.hash===k.hash&&k.offsetParent!==null)),b=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs(b+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let k=0;k<_.length;k++){const M=_[k],N=_[k+1],[y,D]=Pt(k,M,N);if(y){d(D);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-bt}function Pt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=R("VPDocOutlineItem",!0);return a(),i("ul",{class:C(t.root?"root":"nested")},[(a(!0),i(T,null,A(t.headers,({children:l,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Vt),l!=null&&l.length?(a(),$(o,{key:0,headers:l},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(wt,[["__scopeId","data-v-c043bf3a"]]),Lt=s=>(H("data-v-832577d7"),s=s(),z(),s),St={class:"content"},Mt={class:"outline-title",role:"heading","aria-level":"2"},Nt={"aria-labelledby":"doc-outline-aria-label"},It=Lt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Tt=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=V(),n=_e([]);Y(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=I(),l=I();return yt(o,l),(d,p)=>(a(),i("div",{class:C(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",St,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",Mt,L(r(ve)(r(t))),1),c("nav",Nt,[It,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Ct=m(Tt,[["__scopeId","data-v-832577d7"]]),Bt={class:"VPDocAsideCarbonAds"},At=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",Bt,[h(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),xt=s=>(H("data-v-59f2eefd"),s=s(),z(),s),Ht={class:"VPDocAside"},zt=xt(()=>c("div",{class:"spacer"},null,-1)),Dt=g({__name:"VPDocAside",setup(s){const{theme:e}=V();return(t,n)=>(a(),i("div",Ht,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Ct),u(t.$slots,"aside-outline-after",{},void 0,!0),zt,u(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),$(At,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Et=m(Dt,[["__scopeId","data-v-59f2eefd"]]);function Ft(){const{theme:s,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Ot(){const{page:s,theme:e,frontmatter:t}=V();return P(()=>{var _,b,w,S,B,k,M,N;const n=Ie(e.value.sidebar,s.value.relativePath),o=ht(n),l=o.findIndex(y=>j(s.value.relativePath,y.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((k=o[l+1])==null?void 0:k.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=o[l+1])==null?void 0:N.link)}}})}const Gt={},Ut={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},jt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Kt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qt=[jt,Kt];function Rt(s,e){return a(),i("svg",Ut,qt)}const Wt=m(Gt,[["render",Rt]]),G=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=P(()=>e.tag??(e.href?"a":"span")),n=P(()=>e.href&&Le.test(e.href));return(o,l)=>(a(),$(U(t.value),{class:C(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?r(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Jt=["datetime"],Xt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=V(),l=P(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),p=I("");return K(()=>{te(()=>{var _,b,w;p.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,b)=>{var w;return a(),i("p",Yt,[x(L(((w=r(e).lastUpdated)==null?void 0:w.text)||r(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Jt)])}}});const Zt=m(Xt,[["__scopeId","data-v-82edb21a"]]),Qt={key:0,class:"VPDocFooter"},es={key:0,class:"edit-info"},ts={key:0,class:"edit-link"},ss={key:1,class:"last-updated"},ns={key:1,class:"prev-next"},os={class:"pager"},as=["href"],ls=["innerHTML"],rs=["innerHTML"],is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=V(),o=Ft(),l=Ot(),d=P(()=>e.value.editLink&&n.value.editLink!==!1),p=P(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=P(()=>d.value||p.value||l.value.prev||l.value.next);return(b,w)=>{var S,B,k,M,N,y;return _.value?(a(),i("footer",Qt,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",es,[d.value?(a(),i("div",ts,[h(G,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:v(()=>[h(Wt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+L(r(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",ss,[h(Zt)])):f("",!0)])):f("",!0),(S=r(l).prev)!=null&&S.link||(B=r(l).next)!=null&&B.link?(a(),i("nav",ns,[c("div",os,[(k=r(l).prev)!=null&&k.link?(a(),i("a",{key:0,class:"pager-link prev",href:r(J)(r(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=r(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:r(l).prev.text},null,8,rs)],8,as)):f("",!0)]),c("div",is,[(N=r(l).next)!=null&&N.link?(a(),i("a",{key:0,class:"pager-link next",href:r(J)(r(l).next.link)},[c("span",{class:"desc",innerHTML:((y=r(e).docFooter)==null?void 0:y.next)||"Next page"},null,8,us),c("span",{class:"title",innerHTML:r(l).next.text},null,8,ds)],8,cs)):f("",!0)])])):f("",!0)])):f("",!0)}}});const vs=m(_s,[["__scopeId","data-v-93d7bb42"]]),ps={},hs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fs=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ms=[fs];function gs(s,e){return a(),i("svg",hs,ms)}const fe=m(ps,[["render",gs]]),bs={key:0,class:"VPDocOutlineDropdown"},$s={key:0,class:"items"},ks=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=V(),n=I(!1);Y(()=>{n.value=!1});const o=_e([]);return Y(()=>{o.value=pe(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),i("div",bs,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:C({open:n.value})},[x(L(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",$s,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const ys=m(ks,[["__scopeId","data-v-29293128"]]),Ps=s=>(H("data-v-0484986b"),s=s(),z(),s),Vs={class:"container"},ws=Ps(()=>c("div",{class:"aside-curtain"},null,-1)),Ls={class:"aside-container"},Ss={class:"aside-content"},Ms={class:"content"},Ns={class:"content-container"},Is={class:"main"},Ts=g({__name:"VPDoc",setup(s){const{theme:e}=V(),t=se(),{hasSidebar:n,hasAside:o,leftAside:l}=F(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const b=R("Content");return a(),i("div",{class:C(["VPDoc",{"has-sidebar":r(n),"has-aside":r(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Vs,[r(o)?(a(),i("div",{key:0,class:C(["aside",{"left-aside":r(l)}])},[ws,c("div",Ls,[c("div",Ss,[h(Et,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ms,[c("div",Ns,[u(p.$slots,"doc-before",{},void 0,!0),h(ys),c("main",Is,[h(b,{class:C(["vp-doc",[d.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(vs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Cs=m(Ts,[["__scopeId","data-v-0484986b"]]),Bs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=P(()=>e.href&&Le.test(e.href)),n=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),$(U(n.value),{class:C(["VPButton",[o.size,o.theme]]),href:o.href?r(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const As=m(Bs,[["__scopeId","data-v-ccb90d73"]]),xs=["src","alt"],Hs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),i(T,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,xs)):(a(),i(T,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Hs,[["__scopeId","data-v-1a473120"]]),zs=s=>(H("data-v-9f4ba9bd"),s=s(),z(),s),Ds={class:"container"},Es={class:"main"},Fs={key:0,class:"name"},Os=["innerHTML"],Gs=["innerHTML"],Us=["innerHTML"],js={key:0,class:"actions"},Ks={key:0,class:"image"},qs={class:"image-container"},Rs=zs(()=>c("div",{class:"image-bg"},null,-1)),Ws=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:C(["VPHero",{"has-image":t.image||r(e)}])},[c("div",Ds,[c("div",Es,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Fs,[c("span",{innerHTML:t.name,class:"clip"},null,8,Os)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Gs)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Us)):f("",!0)],!0),t.actions?(a(),i("div",js,[(a(!0),i(T,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(As,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||r(e)?(a(),i("div",Ks,[c("div",qs,[Rs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Ys=m(Ws,[["__scopeId","data-v-9f4ba9bd"]]),Js=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=V();return(t,n)=>r(e).hero?(a(),$(Ys,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Xs={},Zs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Qs=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),en=[Qs];function tn(s,e){return a(),i("svg",Zs,en)}const sn=m(Xs,[["render",tn]]),nn={class:"box"},on={key:0,class:"icon"},an=["innerHTML"],ln=["innerHTML"],rn=["innerHTML"],cn={key:4,class:"link-text"},un={class:"link-text-value"},dn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(G,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",on,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),$(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,an)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,rn)):f("",!0),e.linkText?(a(),i("div",cn,[c("p",un,[x(L(e.linkText)+" ",1),h(sn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const _n=m(dn,[["__scopeId","data-v-484eeed2"]]),vn={key:0,class:"VPFeatures"},pn={class:"container"},hn={class:"items"},fn=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=P(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",vn,[c("div",pn,[c("div",hn,[(a(!0),i(T,null,A(n.features,l=>(a(),i("div",{key:l.title,class:C(["item",[t.value]])},[h(_n,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const mn=m(fn,[["__scopeId","data-v-a4ebea2b"]]),gn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=V();return(t,n)=>r(e).features?(a(),$(mn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):f("",!0)}}),bn={class:"VPHome"},$n=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),i("div",bn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Js,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(gn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const kn=m($n,[["__scopeId","data-v-26209f9b"]]),yn={},Pn={class:"VPPage"};function Vn(s,e){const t=R("Content");return a(),i("div",Pn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const wn=m(yn,[["render",Vn]]),Ln=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=V(),{hasSidebar:n}=F();return(o,l)=>(a(),i("div",{class:C(["VPContent",{"has-sidebar":r(n),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(vt)],!0):r(t).layout==="page"?(a(),$(wn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),$(kn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),$(U(r(t).layout),{key:3})):(a(),$(Cs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Sn=m(Ln,[["__scopeId","data-v-2b03cc39"]]),Mn={class:"container"},Nn=["innerHTML"],In=["innerHTML"],Tn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=F();return(o,l)=>r(e).footer&&r(t).footer!==!1?(a(),i("footer",{key:0,class:C(["VPFooter",{"has-sidebar":r(n)}])},[c("div",Mn,[r(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,Nn)):f("",!0),r(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,In)):f("",!0)])],2)):f("",!0)}});const Cn=m(Tn,[["__scopeId","data-v-8a6e0bb4"]]),Bn={class:"header"},An={class:"outline"},xn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=V(),n=I(!1),o=I(0),l=I();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ge(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,w)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Oe({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),i("button",{key:0,onClick:d,class:C({open:n.value})},[x(L(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(r(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:p},[c("div",Bn,[c("a",{class:"top-link",href:"#",onClick:_},L(r(t).returnToTopLabel||"Return to top"),1)]),c("div",An,[h(he,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Hn=m(xn,[["__scopeId","data-v-885e757a"]]),zn={},Dn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},En=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Fn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),On=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Gn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Un=[En,Fn,On,Gn];function jn(s,e){return a(),i("svg",Dn,Un)}const Kn=m(zn,[["render",jn]]),qn=["aria-expanded"],Rn={class:"menu-text"},Wn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=F(),{y:o}=Se(),l=_e([]),d=I(0);K(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{l.value=pe(t.value.outline??e.value.outline)});const p=P(()=>l.value.length===0&&!n.value),_=P(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(b,w)=>r(t).layout!=="home"&&(!p.value||r(o)>=d.value)?(a(),i("div",{key:0,class:C(_.value)},[r(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>b.$emit("open-menu"))},[h(Kn,{class:"menu-icon"}),c("span",Rn,L(r(e).sidebarMenuLabel||"Menu"),1)],8,qn)):f("",!0),h(Hn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Yn=m(Wn,[["__scopeId","data-v-d3e292f7"]]);function Jn(){const s=I(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=se();return q(()=>l.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Xn={},Zn={class:"VPSwitch",type:"button",role:"switch"},Qn={class:"check"},eo={key:0,class:"icon"};function to(s,e){return a(),i("button",Zn,[c("span",Qn,[s.$slots.default?(a(),i("span",eo,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const so=m(Xn,[["render",to],["__scopeId","data-v-979c26e2"]]),no={},oo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ao=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),lo=[ao];function ro(s,e){return a(),i("svg",oo,lo)}const io=m(no,[["render",ro]]),co={},uo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_o=Ue('',9),vo=[_o];function po(s,e){return a(),i("svg",uo,vo)}const ho=m(co,[["render",po]]),fo=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=V(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(so,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(t)},{default:v(()=>[h(ho,{class:"sun"}),h(io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(fo,[["__scopeId","data-v-fb67176c"]]),mo={key:0,class:"VPNavBarAppearance"},go=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=V();return(t,n)=>r(e).appearance&&r(e).appearance!=="force-dark"?(a(),i("div",mo,[h(me)])):f("",!0)}});const bo=m(go,[["__scopeId","data-v-1b34bacc"]]),ge=I();let Ce=!1,ae=0;function $o(s){const e=I(!1);if(W){!Ce&&ko(),ae++;const t=q(ge,n=>{var o,l,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(l=s.onFocus)==null||l.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});de(()=>{t(),ae--,ae||yo()})}return je(e)}function ko(){document.addEventListener("focusin",Be),Ce=!0,ge.value=document.activeElement}function yo(){document.removeEventListener("focusin",Be)}function Be(){ge.value=document.activeElement}const Po={},Vo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Lo=[wo];function So(s,e){return a(),i("svg",Vo,Lo)}const Ae=m(Po,[["render",So]]),Mo={},No={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),To=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Bo=[Io,To,Co];function Ao(s,e){return a(),i("svg",No,Bo)}const xo=m(Mo,[["render",Ao]]),Ho={class:"VPMenuLink"},zo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),i("div",Ho,[h(G,{class:C({active:r(j)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(zo,[["__scopeId","data-v-f34060c4"]]),Do={class:"VPMenuGroup"},Eo={key:0,class:"title"},Fo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Do,[e.text?(a(),i("p",Eo,L(e.text),1)):f("",!0),(a(!0),i(T,null,A(e.items,n=>(a(),i(T,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Oo=m(Fo,[["__scopeId","data-v-d9d9a1a9"]]),Go={class:"VPMenu"},Uo={key:0,class:"items"},jo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Go,[e.items?(a(),i("div",Uo,[(a(!0),i(T,null,A(e.items,n=>(a(),i(T,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Oo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ko=m(jo,[["__scopeId","data-v-b93937a4"]]),qo=["aria-expanded","aria-label"],Ro={key:0,class:"text"},Wo=["innerHTML"],Yo={class:"menu"},Jo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=I(!1),t=I();$o({el:t,onBlur:n});function n(){e.value=!1}return(o,l)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Ro,[o.icon?(a(),$(U(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Wo)):f("",!0),h(Ae,{class:"text-icon"})])):(a(),$(xo,{key:1,class:"icon"}))],8,qo),c("div",Yo,[h(Ko,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Jo,[["__scopeId","data-v-e68c2038"]]),Xo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Zo=["href","aria-label","innerHTML"],Qo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=P(()=>typeof e.icon=="object"?e.icon.svg:Xo[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Zo))}});const ea=m(Qo,[["__scopeId","data-v-89712794"]]),ta={class:"VPSocialLinks"},sa=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",ta,[(a(!0),i(T,null,A(e.links,({link:n,icon:o,ariaLabel:l})=>(a(),$(ea,{key:n,icon:o,link:n,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const $e=m(sa,[["__scopeId","data-v-75d6f2f5"]]),na={key:0,class:"group translations"},oa={class:"trans-title"},aa={key:1,class:"group"},la={class:"item appearance"},ra={class:"label"},ia={class:"appearance-action"},ca={key:2,class:"group"},ua={class:"item social-links"},da=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=V(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),l=P(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>l.value?(a(),$(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[r(n).length&&r(o).label?(a(),i("div",na,[c("p",oa,L(r(o).label),1),(a(!0),i(T,null,A(r(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),r(e).appearance?(a(),i("div",aa,[c("div",la,[c("p",ra,L(r(t).darkModeSwitchLabel||"Appearance"),1),c("div",ia,[h(me)])])])):f("",!0),r(t).socialLinks?(a(),i("div",ca,[c("div",ua,[h($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const _a=m(da,[["__scopeId","data-v-754c055d"]]),va=s=>(H("data-v-c70218b2"),s=s(),z(),s),pa=["aria-expanded"],ha=va(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),fa=[ha],ma=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:C(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},fa,10,pa))}});const ga=m(ma,[["__scopeId","data-v-c70218b2"]]),ba=["innerHTML"],$a=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),$(G,{class:C({VPNavBarMenuLink:!0,active:r(j)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,ba)]),_:1},8,["class","href","target","rel"]))}});const ka=m($a,[["__scopeId","data-v-f7d34d3c"]]),ya=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=V(),n=l=>"link"in l?j(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(n),o=P(()=>n(e.item));return(l,d)=>(a(),$(be,{class:C({VPNavBarMenuGroup:!0,active:r(j)(r(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Pa=s=>(H("data-v-344279fb"),s=s(),z(),s),Va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=Pa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),La=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=V();return(t,n)=>r(e).nav?(a(),i("nav",Va,[wa,(a(!0),i(T,null,A(r(e).nav,o=>(a(),i(T,{key:o.text},["link"in o?(a(),$(ka,{key:0,item:o},null,8,["item"])):(a(),$(ya,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Sa=m(La,[["__scopeId","data-v-344279fb"]]);const Ma={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Na={class:"DocSearch-Button-Container"},Ia=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ta={class:"DocSearch-Button-Placeholder"},Ca=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(s){return(e,t)=>(a(),i("button",Ma,[c("span",Na,[Ia,c("span",Ta,L(e.placeholder),1)]),Ca]))}});const Ba={class:"VPNavBarSearch"},Aa={id:"local-search"},xa={key:1,id:"docsearch"},Ha=g({__name:"VPNavBarSearch",setup(s){const e=Ke(()=>qe(()=>import("./VPLocalSearchBox.b532e603.js"),["assets/chunks/VPLocalSearchBox.b532e603.js","assets/chunks/framework.477046d0.js"])),t=()=>null,{theme:n,localeIndex:o}=V(),l=I(!1),d=I(!1),p=P(()=>{var M,N,y,D,O,E,ke;const k=((M=n.value.search)==null?void 0:M.options)??n.value.algolia;return((O=(D=(y=(N=k==null?void 0:k.locales)==null?void 0:N[o.value])==null?void 0:y.translations)==null?void 0:D.button)==null?void 0:O.buttonText)||((ke=(E=k==null?void 0:k.translations)==null?void 0:E.button)==null?void 0:ke.buttonText)||"Search"});K(()=>{});function _(){l.value||(l.value=!0,setTimeout(b,16))}function b(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||b()},16)}function w(k){const M=k.target,N=M.tagName;return M.isContentEditable||N==="INPUT"||N==="SELECT"||N==="TEXTAREA"}const S=I(!1);ye("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),S.value=!0)}),ye("/",k=>{w(k)||(k.preventDefault(),S.value=!0)});const B="local";return(k,M)=>{var N;return a(),i("div",Ba,[r(B)==="local"?(a(),i(T,{key:0},[S.value?(a(),$(r(e),{key:0,placeholder:p.value,onClose:M[0]||(M[0]=y=>S.value=!1)},null,8,["placeholder"])):f("",!0),c("div",Aa,[h(Ve,{placeholder:p.value,onClick:M[1]||(M[1]=y=>S.value=!0)},null,8,["placeholder"])])],64)):r(B)==="algolia"?(a(),i(T,{key:1},[l.value?(a(),$(r(t),{key:0,algolia:((N=r(n).search)==null?void 0:N.options)??r(n).algolia,onVnodeBeforeMount:M[2]||(M[2]=y=>d.value=!0)},null,8,["algolia"])):f("",!0),d.value?f("",!0):(a(),i("div",xa,[h(Ve,{placeholder:p.value,onClick:_},null,8,["placeholder"])]))],64)):f("",!0)])}}});const za=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(a(),$($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}});const Da=m(za,[["__scopeId","data-v-ce6708f5"]]),Ea=["href"],Fa=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=V(),{hasSidebar:n}=F(),{currentLang:o}=X();return(l,d)=>(a(),i("div",{class:C(["VPNavBarTitle",{"has-sidebar":r(n)}])},[c("a",{class:"title",href:r(t).logoLink??r(J)(r(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),$(ee,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):f("",!0),r(t).siteTitle?(a(),i(T,{key:1},[x(L(r(t).siteTitle),1)],64)):r(t).siteTitle===void 0?(a(),i(T,{key:2},[x(L(r(e).title),1)],64)):f("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ea)],2))}});const Oa=m(Fa,[["__scopeId","data-v-7f378e0f"]]),Ga={},Ua={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ka=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),qa=[ja,Ka];function Ra(s,e){return a(),i("svg",Ua,qa)}const xe=m(Ga,[["render",Ra]]),Wa={class:"items"},Ya={class:"title"},Ja=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=V(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,l)=>r(t).length&&r(n).label?(a(),$(be,{key:0,class:"VPNavBarTranslations",icon:xe,label:r(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Wa,[c("p",Ya,L(r(n).label),1),(a(!0),i(T,null,A(r(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Xa=m(Ja,[["__scopeId","data-v-555fc0a2"]]),Za=s=>(H("data-v-c3e73ad1"),s=s(),z(),s),Qa={class:"container"},el={class:"title"},tl={class:"content"},sl=Za(()=>c("div",{class:"curtain"},null,-1)),nl={class:"content-body"},ol=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=F(),{frontmatter:n}=V(),o=I({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),i("div",{class:C(["VPNavBar",o.value])},[c("div",Qa,[c("div",el,[h(Oa,null,{"nav-bar-title-before":v(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",tl,[sl,c("div",nl,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),h(Ha,{class:"search"}),h(Sa,{class:"menu"}),h(Xa,{class:"translations"}),h(bo,{class:"appearance"}),h(Da,{class:"social-links"}),h(_a,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),h(ga,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const al=m(ol,[["__scopeId","data-v-c3e73ad1"]]),ll={key:0,class:"VPNavScreenAppearance"},rl={class:"text"},il=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=V();return(n,o)=>r(e).appearance?(a(),i("div",ll,[c("p",rl,L(r(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const cl=m(il,[["__scopeId","data-v-0ef3d703"]]),ul=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(G,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const dl=m(ul,[["__scopeId","data-v-cd45b3cd"]]),_l={},vl={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pl=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),hl=[pl];function fl(s,e){return a(),i("svg",vl,hl)}const ml=m(_l,[["render",fl]]),gl=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(G,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const He=m(gl,[["__scopeId","data-v-67e5b794"]]),bl={class:"VPNavScreenMenuGroupSection"},$l={key:0,class:"title"},kl=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",bl,[e.text?(a(),i("p",$l,L(e.text),1)):f("",!0),(a(!0),i(T,null,A(e.items,n=>(a(),$(He,{key:n.text,item:n},null,8,["item"]))),128))]))}});const yl=m(kl,[["__scopeId","data-v-c7bb2a3e"]]),Pl=["aria-controls","aria-expanded"],Vl={class:"button-text"},wl=["id"],Ll={key:1,class:"group"},Sl=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=I(!1),n=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),i("div",{class:C(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Vl,L(l.text),1),h(ml,{class:"button-icon"})],8,Pl),c("div",{id:n.value,class:"items"},[(a(!0),i(T,null,A(l.items,p=>(a(),i(T,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(He,{item:p},null,8,["item"])])):(a(),i("div",Ll,[h(yl,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,wl)],2))}});const Ml=m(Sl,[["__scopeId","data-v-63fd6e4e"]]),Nl={key:0,class:"VPNavScreenMenu"},Il=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=V();return(t,n)=>r(e).nav?(a(),i("nav",Nl,[(a(!0),i(T,null,A(r(e).nav,o=>(a(),i(T,{key:o.text},["link"in o?(a(),$(dl,{key:0,item:o},null,8,["item"])):(a(),$(Ml,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Tl=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(a(),$($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Cl={class:"list"},Bl=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=I(!1);function o(){n.value=!n.value}return(l,d)=>r(e).length&&r(t).label?(a(),i("div",{key:0,class:C(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(xe,{class:"icon lang"}),x(" "+L(r(t).label)+" ",1),h(Ae,{class:"icon chevron"})]),c("ul",Cl,[(a(!0),i(T,null,A(r(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(G,{class:"link",href:p.link},{default:v(()=>[x(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Al=m(Bl,[["__scopeId","data-v-10cb32fc"]]),xl={class:"container"},Hl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=I(null),t=Me(W?document.body:null);return(n,o)=>(a(),$(ce,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",xl,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Il,{class:"menu"}),h(Al,{class:"translations"}),h(cl,{class:"appearance"}),h(Tl,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const zl=m(Hl,[["__scopeId","data-v-c4b5a2af"]]),Dl={key:0,class:"VPNav"},El=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Jn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Ne("close-screen",t),te(()=>{W&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,p)=>l.value?(a(),i("header",Dl,[h(al,{"is-screen-open":r(e),onToggleScreen:r(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(zl,{open:r(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Fl=m(El,[["__scopeId","data-v-a8878f8a"]]),Ol=s=>(H("data-v-66eb756e"),s=s(),z(),s),Gl=["role","tabindex"],Ul=Ol(()=>c("div",{class:"indicator"},null,-1)),jl=["onKeydown"],Kl={key:1,class:"items"},ql=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:p,toggle:_}=mt(P(()=>e.item)),b=P(()=>p.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M(y){"key"in y&&y.key!=="Enter"||!e.item.link&&_()}function N(){e.item.link&&_()}return(y,D)=>{const O=R("VPSidebarItem",!0);return a(),$(U(b.value),{class:C(["VPSidebarItem",k.value])},{default:v(()=>[y.item.text?(a(),i("div",Z({key:0,class:"item",role:B.value},We(y.item.items?{click:M,keydown:M}:{},!0),{tabindex:y.item.items&&0}),[Ul,y.item.link?(a(),$(G,{key:0,tag:w.value,class:"link",href:y.item.link,rel:y.item.rel,target:y.item.target},{default:v(()=>[(a(),$(U(S.value),{class:"text",innerHTML:y.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(U(S.value),{key:1,class:"text",innerHTML:y.item.text},null,8,["innerHTML"])),y.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:Re(N,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,jl)):f("",!0)],16,Gl)):f("",!0),y.item.items&&y.item.items.length?(a(),i("div",Kl,[y.depth<5?(a(!0),i(T,{key:0},A(y.item.items,E=>(a(),$(O,{key:E.text,item:E,depth:y.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Rl=m(ql,[["__scopeId","data-v-66eb756e"]]),ze=s=>(H("data-v-e9e5071d"),s=s(),z(),s),Wl=ze(()=>c("div",{class:"curtain"},null,-1)),Yl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Jl=ze(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Xl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const e=s,{sidebarGroups:t,hasSidebar:n}=F(),o=I(null),l=Me(W?document.body:null);return q([e,o],()=>{var d;e.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,p)=>r(n)?(a(),i("aside",{key:0,class:C(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Ye(()=>{},["stop"]))},[Wl,c("nav",Yl,[Jl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(T,null,A(r(t),_=>(a(),i("div",{key:_.text,class:"group"},[h(Rl,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Zl=m(Xl,[["__scopeId","data-v-e9e5071d"]]),Ql=g({__name:"VPSkipLink",setup(s){const e=se(),t=I();q(()=>e.path,()=>t.value.focus());function n({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),i(T,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const er=m(Ql,[["__scopeId","data-v-7ac0da99"]]),tr=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=F(),o=se();q(()=>o.path,n),ft(e,n);const{frontmatter:l}=V(),d=Je(),p=P(()=>!!d["home-hero-image"]);return Ne("hero-image-slot-exists",p),(_,b)=>{const w=R("Content");return r(l).layout!==!1?(a(),i("div",{key:0,class:C(["Layout",r(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(er),h(tt,{class:"backdrop",show:r(e),onClick:r(n)},null,8,["show","onClick"]),h(Fl,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Yn,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),h(Zl,{open:r(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Sn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Cn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(w,{key:1}))}}});const sr=m(tr,[["__scopeId","data-v-b45c2b2b"]]);const or={Layout:sr,enhanceApp:({app:s})=>{s.component("Badge",Ze)}};function ar(s,e){const{localeIndex:t}=V();function n(o){var k,M;const l=o.split("."),d=s&&typeof s=="object",p=d&&((M=(k=s.locales)==null?void 0:k[t.value])==null?void 0:M.translations)||null,_=d&&s.translations||null;let b=p,w=_,S=e;const B=l.pop();for(const N of l){let y=null;const D=S==null?void 0:S[N];D&&(y=S=D);const O=w==null?void 0:w[N];O&&(y=w=O);const E=b==null?void 0:b[N];E&&(y=b=E),D||(S=y),O||(w=y),E||(b=y)}return(b==null?void 0:b[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return n}export{ar as c,or as t,V as u}; diff --git a/backend/api.html b/backend/api.html index 30b2e3a5f..386af181f 100644 --- a/backend/api.html +++ b/backend/api.html @@ -7,10 +7,10 @@ - + - + @@ -95,7 +95,7 @@ return await http.get("/api/users/user", params); }, };

http.js - обертка вокруг запросов на сервер через вашу любимую библиотеку.

Чем удобно абстрагирование кода связи с бэкендом от основного кода приложения в отдельный сервис?

Можно легко заменить axios на fetch или XHR, REST на JSON-RPC или WebSockets. Код в компонентах не меняется и остается простым и явным.

- + \ No newline at end of file diff --git a/backend/auth.html b/backend/auth.html index 07c830a5f..e5283cd6b 100644 --- a/backend/auth.html +++ b/backend/auth.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Аутентификация и авторизация

Что такое аутентификация и авторизация

Грубо говоря:

Аутентификация - когда система удостоверяется, что в неё залогинился именно Вася Пупкин, например, проверив его логин и пароль

Авторизация - когда система удостоверяется, что запрашивающий ресурс/действие пользователь имеет право доступа к нему. Например, старший менеджер имеет право удаления товара в админке, а простой менеджер - нет.

Как сделать систему аутентификации на сайта

Для SPA самый распространенный способ - на JWT токенах. Вариантов это сделать много, в зависимости от требований уровня безопасности (личный блог Васи Пупкина с комментариями гостей и онлайн магазин с депозитами и бонусами - две большие разницы).

JWT - это стандарт записи небольшого количества информации в строку (токен) и подписывания её (криптография). Делает это бэкенд. Таким образом только бэкенд может удостовериться, что токен выписан им, и в нем действительная информация.

Стандарта аутентификация на токенах как такового нет, есть лучшие практики.

Варианты:

  1. Бэкенд генерит токен (access token - AT) и кладет в httpOnly cookie. Фронтэнд доступа к токену не имеет, браузер просто возвращает куку. Метод незаслужено редко используемый, но вполне надежный. С фронта снимаются все заморочки по манипуляции с АТ.

Сценарий:

  • Фронт логинится, получает данные пользователя с бэка и работает с ними. При получении при любом запросе 401 - направляет пользователя на форму логина, обнуляет данные пользователя.
  • Бэк при логине создает httpOnly cookie с токеном с определенным сроком жизни. На каждом запросе проверяет токен, определяет того, кому выписан этот токен и его права, и дальше решает разрешать ли доступ. Если срок жизни токена кончился - возвращает 401.
  1. Бэкенд генерит токен (access token - AT) и передаёт фронту. Фронт сохраняет его и каждый раз отправляет его обратно. По сути то же самое, что и в первом случае, плюс лишние телодвижения и возможность потерять токен через XSS.

  2. Используются два токена - короткоживущий access token (AT) и дольше живущий refresh token (RT) пересылаемый в httpOnly cookie. AT работает как во втором случае. Когда записанный в нем срок его жизни кончается, бэкенд проверяет RT, и если он валиден, обновляет AT. Кончается RT - пользователь направляется на перелогин.

Подробнее по данной теме можно ознакомиться в, например, этой статье

Где хранить access token на фронте?

В 95% случаев в LocalStorage

Что такое oAuth и SSO?

oAuth - Логин "через Google". Также когда, например, у пользователь есть возможность на твоем сайте сохранить что-то в Google Drive. Чтобы получить разрешение для твоего сайта работы с Google Drive аккаунтом пользователя, ты просишь его дать через Google разрешения твоему сайту лазить в его аккаунт. Итого у нас есть четыре части - Google (авторизационный центр), сторонний ресурс (Google Drive), твой сайт и пользователь

SSO - single sign-on - логин пользователя на портал некой компании один раз, и затем прозрачный доступ на разные его сервисы. Например, логин в GMail и доступ в сразу в Google Диск, Google Photo и так далее.

Дает ли аутентификация через JWT безопасность?

Безопасность - очень комплексное понятие, аутентификация через JWT - всего лишь один из её элементов. Для критичных приложений можно снимать отпечаток системы пользователя (browser fingerprint) и заставлять пользователя перелогиниваться как только он изменился. То же самое с IP. Таким образом можно бороться с кражей АТ. Также ставить очень маленький срок жизни AT, если используется RT. Но основные меры безопасности связаны не с аутентификацией, а с постоянным мониторингом системы на подозрительные действия.

Авторизация

Если нужно давать пользователям разный уровень доступа к ресурсам сайта, то обычно применяется или RBAC (Role-based access control) или PBA - Policy-Based Authorization (Permission-Based Authorization).

В первом случае пользователи распределяются по ролям (админ, менеджер, юзер) и уровень доступа определяется ролью.

Во-втором можно более гранулировано задать разрешение каждому пользователю индивидуально на любое действие.

Нужно понимать, что на фронте авторизация делается для удобства (пользователь не видит разделы сайта, которые ему запрещены), но за безопасность отвечает бэк - он должен проверять каждый раз, имеет ли пользователь право доступа к запрашиваемому ресурсу, даже если на фронте его как бы видно не должно быть. Сломать фронт - очень несложно.

- + \ No newline at end of file diff --git a/backend/backend.html b/backend/backend.html index ec2ae5419..f9697e430 100644 --- a/backend/backend.html +++ b/backend/backend.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Варианты задействовать свой бэкенд для фронтендера

Как протестировать фронт на данных с бэка?

Есть много сервисов, предлагающих свой API с различными данными для тестирования либо полноценной работы

Например, jsonplaceholder.typicode.com

Гуглить по "json placeholder"

Есть ли бесплатные открытые API с реальными данными?

Полно. Например, тут

Гуглить по "public api"

Также можно похакать релевантные сайты в DevTools / Network на предмет эндпойнтов с данными в подходящем формате

Как сделать свой бэкенд?

Если уже знаете JavaScript, поставить и запустить Node.js с HTTP сервером проблем вызвать не должно.

Node.js далеко не очень популярный сервер для интернета, но для небольшого проекта пойдет.

В абсолютном значении проще всего установить и начать работать с Nginx и PHP

Большинство крупных облачных провайдеров (Amazon, Google, Oracle, Microsoft) предоставляет бесплатные планы с возможностью запустить виртуальный сервер. Поставив туда что требуется, можно захостить и бэк, и бандл фронта.

Что такое BaaS (Backend as a service)?

Это облачное решение, когда бэкенд в виде базы данных и интерфейса доступа к ней, а возможно и возможность использовать некоторую логику, предоставляет BaaS провайдер.

Например, NoSQL базу данных и доступ к ней предоставляет Google с помощью своего сервиcа Firebase

Альтернатива с PostgreSQL - Supabase

То есть, ваш фронтэнд будет обращаться к их определенным эндпойнтам и получать нужные сервисы - например, сохранять и запрашивать данные в базе данных.

Оба сервиса предоставляют возможность сделать аутентификацию на сайте. Таким образом, фронтэндер может написать приложение используя подобный сервис без написания своего бэкенд кода и без размещения его где-то на сервере в интернете.

У данных сервисов есть бесплатные планы с довольно большими ресурсами.

Бизнес логика на BaaS

Большинство BaaS сервисов предоставляет не только CRUD доступ к своей базе данных, но и возможность написать кастомную логику в виде Cloud Functions у Firebase, Edge Functions у Supabase, AWS Lambda у Amazon и т.д.

Данные функции являются кодом на каком-то языке программирования, который будет вызываться при обращении к определенному эндпойнту бэкенда.

В случае, если фронтенд разработчик хочет сделать полноценное приложение, но заморачиваться на самостоятельный бэкенд не хочет, это является довольно неплохим и очень экономичным решением.

Как работают Edge/Cloud/Lamda функции

По сути, это бэкенд в миниатюре

Твой фронт обращаешься к заданному эндпойнту (через API gateway сервиса BaaS провайдера) - например, /api/somefunc

Там лежит написанный тобой скрипт на js или другом языке программирования который выполняется, имеет доступ к базе данных и может делать другие вещи (грузить данные из инета например)

Затем скрипт формирует результат и возвращает его твоему фронту

- + \ No newline at end of file diff --git a/backend/cors.html b/backend/cors.html index b45abff00..b0d9b1567 100644 --- a/backend/cors.html +++ b/backend/cors.html @@ -7,10 +7,10 @@ - + - + @@ -31,7 +31,7 @@ Origin: client-1.com
GET /info HTTP/1.1
 Host: server-site.com
 Origin: client-1.com

В случае, если сервер по адресу www.server-site.com разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится строка Access-Control-Allow-Origin с именем объявленного домена:

Access-Control-Allow-Origin: https://client-1.com
Access-Control-Allow-Origin: https://client-1.com

Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла info вернет код ошибки.

Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска «*».

Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *

Если на сервере разрешен доступ не всем, а нескольким сторонним клиентам, ответ сервера содержит имена всех этих доменов, выведенных отдельными строками или разделенных пробелами:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com
Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com

В стандарте CORS много нюансов. Вот более подробная статья по теме CORS

Проблемы с CORS

CORS проблемы могут возникнуть только когда к ресурсу обращается браузер, а не отдельная программа типа Postman или другой бэкенд.

Как временное решение при разработке могут помочь CORS proxy, которые становятся посредником между фронтендом и бэкендом, или расширения браузера.

Vite предоставляет подобный прокси для dev режима.

- + \ No newline at end of file diff --git a/backend/protocols.html b/backend/protocols.html index 9de3d93ea..d04978962 100644 --- a/backend/protocols.html +++ b/backend/protocols.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Протоколы. To REST или не REST?

REST, WebSockets, JSON-RPC

Для новичка, конечно, удобнее начинать с REST - запросы на сервер абы как.

Для более опытных, особенно, фулстеков, предлагаю взглянуть на JSON-RPC

WebSockets удобен тем, что дает двунаправленную связь (сервер может посылать сообщения на клиент), но требует специального программного обеспечения на бэкенде.

Почему JSON-RPC?

После опыта с JSON-RPC общение с бэком обычно уже никогда не бывает прежним.

Он дает порядок, четкость, строгость и вместе с тем гибкость. Сильно упрощает и делает понятным код как на фронте, так и на бэке.

Вот две мои статьи на эту тему - Популяризация JSON-RPC (часть 1) и Популяризация JSON-RPC (часть 2)

Вариант TypeScript реализации фронтэнд api сервиса на JSON-RPC - здесь

При использовании JSON-RPC переход на WebSockets или другие транспортные протоколы не вызовет никаких трудностей из-за унификации формата сообщений.

Как организовать реконнект WebSocket соединения на фронте?

Нужна шина, или Еvent bus, которая будет работать как прокси для приходящих сообщений.

Можно использовать mitt.

Что такое GraphGL?

Сложная штука, попытка перевести язык запросов SQL для клиент-серверных запросов в интернете.

Имеет довольно специфичное применение, преимущественно у сторонних поставщиков данных через API.

Для своего фулстек приложения - на 99% ненужное решение.

- + \ No newline at end of file diff --git a/book/ru/Chapter 1_ The Vue 3 Framework.html b/book/ru/Chapter 1_ The Vue 3 Framework.html index 4d41d1ca1..b341108e1 100644 --- a/book/ru/Chapter 1_ The Vue 3 Framework.html +++ b/book/ru/Chapter 1_ The Vue 3 Framework.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@ -
Skip to content

Фреймворк Vue 3

Современная всемирная паутина (World Wide Web) претерпела значительные изменения по сравнению с теми временами, когда Интернет представлял собой лишь набор связанных между собой страниц, предназначенных для академических и научных целей. По мере развития технологий и увеличения мощности машин к прежним протоколам добавлялись все новые и новые возможности, конкурировали новые методы и технологии, пока, наконец, не были приняты стандарты. Дополнительные возможности появились в виде плагинов для браузера и встроенного контента. Распространенными были Java-апплеты, Flash, Macromedia, Quicktime и другие плагины. Именно с появлением HTML5 большинство из них, если не все, были постепенно вытеснены стандартами.

Сегодня существует четкое различие между структурой, стилем и поведением. Язык разметки гипертекста (HTML) определяет структурные элементы, из которых состоит веб-страница. Каскадные таблицы стилей (CSS) предоставляют правила, изменяющие внешний вид HTML-элементов, включая даже анимацию и трансформацию. И, наконец, JavaScript - язык программирования, который обеспечивает поведение и может обращаться и изменять как HTML, так и CSS. Такое количество различных возможностей также привело к высокой сложности и несовместимости между браузерами. Именно здесь и зародились библиотеки и фреймворки, которые сначала решали проблемы несовместимости и стандартизации внешнего вида, но вскоре стали включать в себя и другие парадигмы программирования, выходящие за рамки простого манипулирования HTML и CSS.

Некоторые из наиболее популярных сегодня библиотек и фреймворков используют реактивную парадигму. Они умело вносят изменения в JavaScript, которые автоматически отражаются в HTML/CSS. Vue 3 - это последняя версия прогрессивного фреймворка, в котором в значительной степени используется концепция реактивности. В нем также реализованы другие парадигмы и паттерны проектирования программного обеспечения, позволяющие создавать все: от простых взаимодействий на статичной веб-странице до сложных приложений, которые могут даже устанавливаться локально и конкурировать с нативными настольными приложениями.

В этой книге мы познакомимся с фреймворком Vue 3 и изучим различные шаблоны проектирования, которые помогут нам создавать первоклассные приложения: от простых веб-страниц до мощных прогрессивных веб-приложений (PWA). Попутно мы рассмотрим лучшие практики и хорошо зарекомендовавшие себя паттерны в программной инженерии.

В этой главе рассматриваются следующие темы:

  • Прогрессивный фреймворк
  • Однофайловые компоненты
  • Различные варианты синтаксиса для написания компонентов

К концу этой главы вы будете иметь базовое представление о том, какое место Vue 3 занимает в ландшафте JavaScript и какие возможности он предоставляет. Для пользователей Vue 2 в этой книге есть приложение, в котором описаны изменения, на которые необходимо обратить внимание при переносе приложения. По мере продвижения по книге мы будем наращивать знания на основе этих концепций.

Прогрессивный фреймворк

Перед тем как рассказать о том, что представляет собой Vue, необходимо провести различие между терминами библиотека и фреймворк. Они часто используются как взаимозаменяемые, но разница между ними есть, и хороший разработчик должен знать об этом, выбирая тот или иной вариант для создания веб-приложения.

Выбирая тот или иной вариант для создания веб-приложения, мы должны понимать, что это такое.

Давайте рассмотрим определения этих терминов:

  • Библиотека - это коллекция многократно используемого кода в виде функций, классов и т.д., который был разработан кем-то другим и может быть легко импортирован в вашу программу. Они не предписывают, как и где их использовать, но обычно предоставляют документацию по их применению. Программист сам решает, когда и как их применять. Эта концепция существует в большинстве языков разработки, вплоть до того, что некоторые из них полностью основаны на понятии импорта библиотек для обеспечения функциональности.
  • В фреймворке также есть наборы классов и функций для использования, но в нем прописаны спецификации, определяющие, как должна работать программа, с какой архитектурой, в каких условиях может быть использован ваш код. Ключевой атрибут, на который следует обратить внимание, заключается в том, что фреймворк инвертирует управление в приложении, то есть определяет поток программы и данных. Тем самым он подчеркивает структуры или стандарты, которых должен придерживаться программист.

Разделив понятия, теперь возникает вопрос, когда использовать библиотеку, а когда фреймворк. Прежде чем ответить на этот вопрос, давайте поймем, что при создании реальных приложений между ними существует огромная "серая зона". Теоретически одно и то же приложение можно построить, используя любой из этих двух вариантов. Как и всегда в программной инженерии, необходимо определиться с компромиссами для каждого подхода. Так что воспринимайте то, что будет написано дальше, с щепоткой соли; это не закон, написанный на камне:

  • Вы можете использовать библиотеку при создании приложений малого и среднего размера или при необходимости добавления дополнительной функциональности в приложение (в общем случае, вы можете использовать дополнительные библиотеки внутри фреймворков). Существуют и исключения из правила "размера". Например, React - это библиотека, но на ее основе построены огромные приложения, такие как Facebook. Компромисс заключается в том, что использование только библиотек без фреймворка потребует выработки общих подходов и большей координации внутри команды, поэтому усилия по управлению и руководству могут значительно возрасти. С другой стороны, библиотека, используемая в рамках обычного программирования на JavaScript, может предложить некоторые важные улучшения производительности и обеспечить значительную гибкость.
  • Вы можете захотеть использовать фреймворк при создании приложений среднего и большого размера, когда вам нужна структура, помогающая координировать разработку, или когда вы хотите быстро начать, минуя "азы" разработки общей функциональности с нуля. Существуют фреймворки, построенные поверх других фреймворков, например, Nuxt построен поверх Vue. Компромисс заключается в том, что для построения приложения вам предписывается архитектурная модель, которая часто соответствует определенному подходу и образу мышления. Вам и вашей команде придется изучить фреймворк и его ограничения и жить в этих границах. Всегда есть вероятность того, что в будущем ваше приложение может перерасти рамки. В то же время некоторые из преимуществ таковы: более легкая координация работы, значительный выигрыш от стартового рывка, верное и проверенное решение общих проблем, ориентация на конкретные ситуации (например, торговые приложения в сравнении с социальными сетями) и многое другое. Однако в зависимости от фреймворка вы можете столкнуться с небольшим снижением производительности за счет дополнительной обработки данных или трудностями масштабирования. Вам предстоит взвесить компромиссы в каждом конкретном случае.

Итак, что же такое Vue? По определению, Vue - это прогрессивный фреймворк для создания пользовательских интерфейсов. Прогрессивность означает, что он обладает архитектурными преимуществами фреймворка, а также скоростью и модульными преимуществами библиотеки, поскольку функции и функциональность могут быть реализованы постепенно. На практике это означает, что Vue предписывает определенные модели построения приложения, но в то же время позволяет начинать с малого и расширять его настолько, насколько это необходимо. Вы даже можете использовать несколько приложений Vue на одной странице или взять на себя все приложение. При необходимости можно даже импортировать и использовать другие библиотеки и фреймворки. Весьма причудливо!

Еще одной фундаментальной концепцией Vue является реактивность. Она подразумевает возможность автоматического отображения в HTML значения или изменений, внесенных в переменную в JavaScript, а также внутри вашего кода. В этом заключается большая часть волшебства, предлагаемого Vue.

В традиционном программировании, когда переменная изменяется, она автоматически отображается в HTML.

В традиционном программировании, когда переменной присваивается значение, оно сохраняется до тех пор, пока не будет программно изменено. Однако в реактивном программировании, если значение переменной зависит от других переменных, то при изменении одной из этих зависимостей переменная примет новое результирующее значение. Возьмем, к примеру, следующую простую формулу:

sh
A = B + C
A = B + C

В реактивном программировании каждый раз, когда B или C меняют значение, изменяется и A. Как вы увидите далее в этой книге, это очень мощная модель для построения пользовательских интерфейсов. В данном примере, в соответствии с терминологией, A - это зависимое, а B и C - зависимости.

В следующих главах мы будем изучать этот прогрессивный атрибут в процессе создания примеров приложений. Но перед этим нам нужно посмотреть, что предлагает Vue 3 в самом базовом виде.

Использование Vue в веб-приложении

Существует несколько вариантов использования Vue в веб-приложении, и это во многом зависит от того, какую цель вы преследуете:

  • Для размещения на странице небольшого автономного приложения или фрагмента кода можно напрямую импортировать Vue и код внутри тега script
  • Для создания более крупного приложения вам понадобится инструмент сборки, который возьмет ваш код и соберет его для распространения

Обратите внимание, что я использую слово сборка, а не компиляция, поскольку JavaScript-приложения интерпретируются и выполняются во время исполнения в браузере. Это станет очевидным позже, когда мы введем понятие однофайловых компонентов

Давайте кратко рассмотрим пример первого случая на примере очень простой HTML-страницы:

html
<html>
+    
Skip to content

Фреймворк Vue 3

Современная всемирная паутина (World Wide Web) претерпела значительные изменения по сравнению с теми временами, когда Интернет представлял собой лишь набор связанных между собой страниц, предназначенных для академических и научных целей. По мере развития технологий и увеличения мощности машин к прежним протоколам добавлялись все новые и новые возможности, конкурировали новые методы и технологии, пока, наконец, не были приняты стандарты. Дополнительные возможности появились в виде плагинов для браузера и встроенного контента. Распространенными были Java-апплеты, Flash, Macromedia, Quicktime и другие плагины. Именно с появлением HTML5 большинство из них, если не все, были постепенно вытеснены стандартами.

Сегодня существует четкое различие между структурой, стилем и поведением. Язык разметки гипертекста (HTML) определяет структурные элементы, из которых состоит веб-страница. Каскадные таблицы стилей (CSS) предоставляют правила, изменяющие внешний вид HTML-элементов, включая даже анимацию и трансформацию. И, наконец, JavaScript - язык программирования, который обеспечивает поведение и может обращаться и изменять как HTML, так и CSS. Такое количество различных возможностей также привело к высокой сложности и несовместимости между браузерами. Именно здесь и зародились библиотеки и фреймворки, которые сначала решали проблемы несовместимости и стандартизации внешнего вида, но вскоре стали включать в себя и другие парадигмы программирования, выходящие за рамки простого манипулирования HTML и CSS.

Некоторые из наиболее популярных сегодня библиотек и фреймворков используют реактивную парадигму. Они умело вносят изменения в JavaScript, которые автоматически отражаются в HTML/CSS. Vue 3 - это последняя версия прогрессивного фреймворка, в котором в значительной степени используется концепция реактивности. В нем также реализованы другие парадигмы и паттерны проектирования программного обеспечения, позволяющие создавать все: от простых взаимодействий на статичной веб-странице до сложных приложений, которые могут даже устанавливаться локально и конкурировать с нативными настольными приложениями.

В этой книге мы познакомимся с фреймворком Vue 3 и изучим различные шаблоны проектирования, которые помогут нам создавать первоклассные приложения: от простых веб-страниц до мощных прогрессивных веб-приложений (PWA). Попутно мы рассмотрим лучшие практики и хорошо зарекомендовавшие себя паттерны в программной инженерии.

В этой главе рассматриваются следующие темы:

  • Прогрессивный фреймворк
  • Однофайловые компоненты
  • Различные варианты синтаксиса для написания компонентов

К концу этой главы вы будете иметь базовое представление о том, какое место Vue 3 занимает в ландшафте JavaScript и какие возможности он предоставляет. Для пользователей Vue 2 в этой книге есть приложение, в котором описаны изменения, на которые необходимо обратить внимание при переносе приложения. По мере продвижения по книге мы будем наращивать знания на основе этих концепций.

Прогрессивный фреймворк

Перед тем как рассказать о том, что представляет собой Vue, необходимо провести различие между терминами библиотека и фреймворк. Они часто используются как взаимозаменяемые, но разница между ними есть, и хороший разработчик должен знать об этом, выбирая тот или иной вариант для создания веб-приложения.

Выбирая тот или иной вариант для создания веб-приложения, мы должны понимать, что это такое.

Давайте рассмотрим определения этих терминов:

  • Библиотека - это коллекция многократно используемого кода в виде функций, классов и т.д., который был разработан кем-то другим и может быть легко импортирован в вашу программу. Они не предписывают, как и где их использовать, но обычно предоставляют документацию по их применению. Программист сам решает, когда и как их применять. Эта концепция существует в большинстве языков разработки, вплоть до того, что некоторые из них полностью основаны на понятии импорта библиотек для обеспечения функциональности.
  • В фреймворке также есть наборы классов и функций для использования, но в нем прописаны спецификации, определяющие, как должна работать программа, с какой архитектурой, в каких условиях может быть использован ваш код. Ключевой атрибут, на который следует обратить внимание, заключается в том, что фреймворк инвертирует управление в приложении, то есть определяет поток программы и данных. Тем самым он подчеркивает структуры или стандарты, которых должен придерживаться программист.

Разделив понятия, теперь возникает вопрос, когда использовать библиотеку, а когда фреймворк. Прежде чем ответить на этот вопрос, давайте поймем, что при создании реальных приложений между ними существует огромная "серая зона". Теоретически одно и то же приложение можно построить, используя любой из этих двух вариантов. Как и всегда в программной инженерии, необходимо определиться с компромиссами для каждого подхода. Так что воспринимайте то, что будет написано дальше, с щепоткой соли; это не закон, написанный на камне:

  • Вы можете использовать библиотеку при создании приложений малого и среднего размера или при необходимости добавления дополнительной функциональности в приложение (в общем случае, вы можете использовать дополнительные библиотеки внутри фреймворков). Существуют и исключения из правила "размера". Например, React - это библиотека, но на ее основе построены огромные приложения, такие как Facebook. Компромисс заключается в том, что использование только библиотек без фреймворка потребует выработки общих подходов и большей координации внутри команды, поэтому усилия по управлению и руководству могут значительно возрасти. С другой стороны, библиотека, используемая в рамках обычного программирования на JavaScript, может предложить некоторые важные улучшения производительности и обеспечить значительную гибкость.
  • Вы можете захотеть использовать фреймворк при создании приложений среднего и большого размера, когда вам нужна структура, помогающая координировать разработку, или когда вы хотите быстро начать, минуя "азы" разработки общей функциональности с нуля. Существуют фреймворки, построенные поверх других фреймворков, например, Nuxt построен поверх Vue. Компромисс заключается в том, что для построения приложения вам предписывается архитектурная модель, которая часто соответствует определенному подходу и образу мышления. Вам и вашей команде придется изучить фреймворк и его ограничения и жить в этих границах. Всегда есть вероятность того, что в будущем ваше приложение может перерасти рамки. В то же время некоторые из преимуществ таковы: более легкая координация работы, значительный выигрыш от стартового рывка, верное и проверенное решение общих проблем, ориентация на конкретные ситуации (например, торговые приложения в сравнении с социальными сетями) и многое другое. Однако в зависимости от фреймворка вы можете столкнуться с небольшим снижением производительности за счет дополнительной обработки данных или трудностями масштабирования. Вам предстоит взвесить компромиссы в каждом конкретном случае.

Итак, что же такое Vue? По определению, Vue - это прогрессивный фреймворк для создания пользовательских интерфейсов. Прогрессивность означает, что он обладает архитектурными преимуществами фреймворка, а также скоростью и модульными преимуществами библиотеки, поскольку функции и функциональность могут быть реализованы постепенно. На практике это означает, что Vue предписывает определенные модели построения приложения, но в то же время позволяет начинать с малого и расширять его настолько, насколько это необходимо. Вы даже можете использовать несколько приложений Vue на одной странице или взять на себя все приложение. При необходимости можно даже импортировать и использовать другие библиотеки и фреймворки. Весьма причудливо!

Еще одной фундаментальной концепцией Vue является реактивность. Она подразумевает возможность автоматического отображения в HTML значения или изменений, внесенных в переменную в JavaScript, а также внутри вашего кода. В этом заключается большая часть волшебства, предлагаемого Vue.

В традиционном программировании, когда переменная изменяется, она автоматически отображается в HTML.

В традиционном программировании, когда переменной присваивается значение, оно сохраняется до тех пор, пока не будет программно изменено. Однако в реактивном программировании, если значение переменной зависит от других переменных, то при изменении одной из этих зависимостей переменная примет новое результирующее значение. Возьмем, к примеру, следующую простую формулу:

sh
A = B + C
A = B + C

В реактивном программировании каждый раз, когда B или C меняют значение, изменяется и A. Как вы увидите далее в этой книге, это очень мощная модель для построения пользовательских интерфейсов. В данном примере, в соответствии с терминологией, A - это зависимое, а B и C - зависимости.

В следующих главах мы будем изучать этот прогрессивный атрибут в процессе создания примеров приложений. Но перед этим нам нужно посмотреть, что предлагает Vue 3 в самом базовом виде.

Использование Vue в веб-приложении

Существует несколько вариантов использования Vue в веб-приложении, и это во многом зависит от того, какую цель вы преследуете:

  • Для размещения на странице небольшого автономного приложения или фрагмента кода можно напрямую импортировать Vue и код внутри тега script
  • Для создания более крупного приложения вам понадобится инструмент сборки, который возьмет ваш код и соберет его для распространения

Обратите внимание, что я использую слово сборка, а не компиляция, поскольку JavaScript-приложения интерпретируются и выполняются во время исполнения в браузере. Это станет очевидным позже, когда мы введем понятие однофайловых компонентов

Давайте кратко рассмотрим пример первого случая на примере очень простой HTML-страницы:

html
<html>
   <head>         
     <script src="https://unpkg.com/vue@3"></script>
   </head>
@@ -137,8 +137,8 @@
 <template>     
   <component :is="action"></component>     
   <button @click="action = 'EditItem'">Edit</button>
-</template>

В этом простом примере, когда пользователь нажмет кнопку Edit, значение action изменится на EditItem, и компонент заменится. Документацию можно найти здесь:https://vuejs.org/api/built-in-special-elements.html.

Поняв, что такое фреймворки и компоненты, мы теперь лучше подготовлены к дальнейшей работе.

Кодовые соглашения (code conventions) в книге

В этой книге мы будем использовать набор кодовых соглашений и рекомендаций, которые являются хорошей практикой для Vue 3. Они помогут вам не только понять примеры, приведенные в этой книге, но и код, который вы можете встретить в природе, поскольку все больше разработчиков используют его. Давайте начнем с самого начала.

Переменные и пропсы

Они всегда пишутся в нижнем регистре, а пробелы заменяются знаком подчеркивания, например, total_count и person_id.

Константы

Ссылки на инжектируемые объекты начинаются со знака $, например, $router, $modals и $notifications.

Ссылки на реактивные данные начинаются с _ и набираются в змеином регистре (snake case), например, _total и _first_input.

Ссылки на константные значения обозначаются заглавными буквами, например, OPTION и LANGUAGE_CODE.

Функции-конструкторы для инжектируемых зависимостей будут начинаться с use, например, const $store=useStore().

Имена классов и компонентов

Они записываются в PascalCase (каждое слово начинается с буквы верхнего регистра), например, Person, Task и QueueBuilder.

Функции, методы, события и имена файлов

Они пишутся в CamelCase, например, doSubscribe() и processQueue().

"Экземпляры

Экземпляры будут иметь абстрактное имя, за которым следует слово Service в случае обычных JavaScript-объектов, предоставляющих функции, Model для моделей состояний и так далее. Мы будем использовать сервисы для инкапсуляции функциональности.

Например: const projectService=new ProjectService().

Совет

В своей команде всегда используйте кодовые соглашения, с которыми все согласны. Это сделает код более читаемым и удобным для сопровождения. Можно также порекомендовать использовать линкер (процессор для фиксации соглашений в коде).

Как уже говорилось, эти соглашения набирают популярность, поэтому вы можете встретить их во многих проектах. Однако они не являются обязательными стандартами и уж точно не предписаны фреймворком. Вы можете писать все заглавными буквами, если это ваш стиль, но на самом деле важно, чтобы вы и ваша команда определили и соблюдали свои собственные соглашения в последовательной манере. В конечном итоге важно, чтобы при написании кода у всех нас был общий язык.

Подведение итогов

В этой главе мы прошли путь от основ библиотек и фреймворков до директив Vue 3, компонентов и даже кодовых соглашений. Эти понятия все еще немного абстрактны, поэтому мы будем доводить их до реализации по мере продвижения по книге и работы с реальным кодом. Однако сейчас мы готовы для изучения принципов проектирования и паттернов в следующей главе.

Вопросы для проверки

Для того чтобы помочь вам закрепить содержание этой главы, вы можете воспользоваться следующими вопросами:

  • В чем разница между библиотекой и фреймворком?
  • Почему Vue является "прогрессивным" фреймворком?
  • Что такое однофайловые компоненты?
  • Какие директивы наиболее часто используются при разработке Vue?
  • Почему важны соглашения в коде?

Если вы можете быстро ответить на эти вопросы в уме, то вы готовы к работе! Если нет, то, возможно, вам стоит кратко просмотреть главу, чтобы убедиться, что у вас есть основа для дальнейшей работы.

- +</template>

В этом простом примере, когда пользователь нажмет кнопку Edit, значение action изменится на EditItem, и компонент заменится. Документацию можно найти здесь:https://vuejs.org/api/built-in-special-elements.html.

Поняв, что такое фреймворки и компоненты, мы теперь лучше подготовлены к дальнейшей работе.

Кодовые соглашения (code conventions) в книге

В этой книге мы будем использовать набор кодовых соглашений и рекомендаций, которые являются хорошей практикой для Vue 3. Они помогут вам не только понять примеры, приведенные в этой книге, но и код, который вы можете встретить в природе, поскольку все больше разработчиков используют его. Давайте начнем с самого начала.

Переменные и пропсы

Они всегда пишутся в нижнем регистре, а пробелы заменяются знаком подчеркивания, например, total_count и person_id.

Константы

Ссылки на инжектируемые объекты начинаются со знака $, например, $router, $modals и $notifications.

Ссылки на реактивные данные начинаются с _ и набираются в змеином регистре (snake case), например, _total и _first_input.

Ссылки на константные значения обозначаются заглавными буквами, например, OPTION и LANGUAGE_CODE.

Функции-конструкторы для инжектируемых зависимостей будут начинаться с use, например, const $store=useStore().

Имена классов и компонентов

Они записываются в PascalCase (каждое слово начинается с буквы верхнего регистра), например, Person, Task и QueueBuilder.

Функции, методы, события и имена файлов

Они пишутся в CamelCase, например, doSubscribe() и processQueue().

"Экземпляры

Экземпляры будут иметь абстрактное имя, за которым следует слово Service в случае обычных JavaScript-объектов, предоставляющих функции, Model для моделей состояний и так далее. Мы будем использовать сервисы для инкапсуляции функциональности.

Например: const projectService=new ProjectService().

Совет

В своей команде всегда используйте кодовые соглашения, с которыми все согласны. Это сделает код более читаемым и удобным для сопровождения. Можно также порекомендовать использовать линкер (процессор для фиксации соглашений в коде).

Как уже говорилось, эти соглашения набирают популярность, поэтому вы можете встретить их во многих проектах. Однако они не являются обязательными стандартами и уж точно не предписаны фреймворком. Вы можете писать все заглавными буквами, если это ваш стиль, но на самом деле важно, чтобы вы и ваша команда определили и соблюдали свои собственные соглашения в последовательной манере. В конечном итоге важно, чтобы при написании кода у всех нас был общий язык.

Подведение итогов

В этой главе мы прошли путь от основ библиотек и фреймворков до директив Vue 3, компонентов и даже кодовых соглашений. Эти понятия все еще немного абстрактны, поэтому мы будем доводить их до реализации по мере продвижения по книге и работы с реальным кодом. Однако сейчас мы готовы для изучения принципов проектирования и паттернов в следующей главе.

Вопросы для проверки

Для того чтобы помочь вам закрепить содержание этой главы, вы можете воспользоваться следующими вопросами:

  • В чем разница между библиотекой и фреймворком?
  • Почему Vue является "прогрессивным" фреймворком?
  • Что такое однофайловые компоненты?
  • Какие директивы наиболее часто используются при разработке Vue?
  • Почему важны соглашения в коде?

Если вы можете быстро ответить на эти вопросы в уме, то вы готовы к работе! Если нет, то, возможно, вам стоит кратко просмотреть главу, чтобы убедиться, что у вас есть основа для дальнейшей работы.

+ \ No newline at end of file diff --git a/book/ru/Chapter 2_ Software Design Principles and Patterns.html b/book/ru/Chapter 2_ Software Design Principles and Patterns.html new file mode 100644 index 000000000..2a0735b5b --- /dev/null +++ b/book/ru/Chapter 2_ Software Design Principles and Patterns.html @@ -0,0 +1,575 @@ + + + + + + Принципы и шаблоны проектирования программного обеспечения | Vue FAQ + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Принципы и шаблоны проектирования программного обеспечения

Разработка программного обеспечения по своей сути является человекоемкой дисциплиной. Это означает, что она требует не только знания техники и технологии, но и понимания проблемы и умения принимать решения для реализации решения на нескольких уровнях абстракции.

Программирование во многом зависит от того, как мыслит разработчик. С годами в каждом контексте и языке появились рекомендации и решения для решения повторяющихся проблем. Знание этих паттернов (шаблонов) поможет вам определить, когда их следует применять, и ускорить разработку. С другой стороны, принципы - это руководящие концепции, которые должны применяться на каждом этапе процесса, и они в большей степени зависят от того, как вы подходите к процессу.

В этой главе мы рассмотрим неполный и не исчерпывающий список принципов и шаблонов, которые часто встречаются при разработке приложений на Vue 3.

Принципы проектирования

  • Separation of concerns (Разделение ответственности)
  • Composition over inheritance (Композиция вместо наследования)
  • Single responsibility (Единая ответственность)
  • Encapsulation (Инкапсуляция)
  • KIC - keep it clean (держи это чистым)
  • DRY - don’t repeat yourself (не повторяться)
  • KISS - keep it simple stupid (держи это максимально простым)
  • Code for the next (пиши код для следующего программиста)

Шаблоны проектирования

  • Singleton (Синглтон)
  • Dependency injection (Инъекция зависимостей)
  • Observer (Обсервер)
  • Command (Команда)
  • Proxy (Прокси)
  • Decorator (Декоратор)
  • Façade (Фасад)
  • Callbacks (Обратные вызовы)
  • Promises (Промисы)

Понимание этих принципов и шаблонов поможет вам использовать фреймворк более эффективно и чаще всего не позволит вам "изобретать велосипед". Вместе с первой главой эта глава завершает фундаментальную часть данной книги и дает основу для изучения практической части и реализации примеров приложений в остальных частях книги.

Каковы принципы проектирования программного обеспечения?

При разработке программного обеспечения принципы проектирования - это концептуальные рекомендации высокого уровня, которые должны применяться ко всему процессу. Не в каждом проекте будут использоваться одни и те же принципы, и это не обязательные правила, которые должны соблюдаться. Они могут проявляться в проекте, начиная с архитектуры и заканчивая пользовательским интерфейсом (UI) и последним фрагментом кода. На практике некоторые из этих принципов могут также влиять на такие атрибуты программного обеспечения, как сопровождаемость (maintainability) и возможность повторного использования (re-usability).

Неполный список принципов проектирования

Принципы проектирования несколько различаются в зависимости от контекста, области и даже команды, в которой человек работает в данный момент. Поэтому принципы, включенные в данную главу, являются неисчерпывающими.

Separation of concerns (Разделение ответственности)

Это, пожалуй, самый важный принцип в программной инженерии. Разделение ответственности подразумевает, что система должна быть разделена на подсистемы элементов, сгруппированных по их функциям или услугам (ответственности). Например, мы можем рассматривать человеческий организм как систему, состоящую из множества подсистем (дыхательной, кровеносной, пищеварительной и т.д.). Они, в свою очередь, объединены различными органами, которые состоят из тканей, и так далее, вплоть до мельчайшей клетки. Следуя той же идее в программном обеспечении, приложение можно разделить на элементы, сгруппированные по проблемам, начиная с большой архитектуры и заканчивая последней функцией. Без такого разделения сложности на управляемые части создать функциональную систему было бы гораздо сложнее, а то и вовсе невозможно.

В общем случае применение этого принципа начинается с общей картины того, какой должна быть система, рассматривает, что она должна делать для достижения этой цели, а затем разбивает ее на управляемые рабочие части.

В качестве примера приведем грубое графическое представление разделения задач для веб-приложения. Каждый квадрат на этой диаграмме обозначает отдельную зону ответственности, которая, в свою очередь, может быть детализирована на более мелкие функциональные части. Еще лучше, если вы увидите, как этот принцип позволяет выявить интегрирующие части системы.

Рисунок 2.1 - Простой архитектурный вид веб-приложения, демонстрирующий разделение ответственности

Если мы будем углубляться в любую из этих маленьких ячеек внутри соответствующих доменов, мы сможем найти еще больше проблем, которые можно разделить, пока не достигнем неделимого атомарного элемента (компонента или функции, например). Этот принцип имеет много общего с другими принципами, такими как абстракция и единая ответственность, и выигрывает от них. Мы рассмотрим их далее в этой же главе.

Composition over inheritance (Композиция над наследованием)

Принцип композиции над наследованием заимствован непосредственно из объектно-ориентированного программирования (ООП). Он гласит, что объект должен пытаться использовать функциональность других объектов, когда это необходимо, путем ссылки на них или инстанцирования, а не создавать большое и сложное дерево классов наследования для добавления такой функциональности.

В наши дни, JavaScript по своей сути является функциональным языком, хотя и поддерживает множество парадигм, включая черты ООП, поэтому этот принцип также применим. Есть одно предостережение для тех, кто переходит с ООП на JavaScript, - не поддавайтесь искушению рассматривать JavaScript как чистый ООП-язык. Это может привести к ненужным сложностям, вместо того чтобы воспользоваться достоинствами языка.

В Vue 3 не существует расширения или наследования компонентов. Когда нам нужна общая или наследуемая функциональность, у нас есть хороший набор инструментов для замены парадигмы наследования. Как соблюсти этот принцип, используя композитные компоненты, мы увидим позже в главе 4, Композиция пользовательского интерфейса с помощью компонентов.

Single responsibility principle (Принцип единой ответственности)

Этот принцип можно встретить как в ООП, так и в функциональном программировании. Проще говоря, он гласит, что класс, метод, функция или компонент должны иметь дело только с одной ответственностью или функциональностью.

Если вы работали в других дисциплинах и языках, то это естественно. Многоцелевые функции трудно поддерживать и они имеют тенденцию выходить из-под контроля, особенно в таких языках, как JavaScript, который является слабо типизированным и очень динамичным. Эта же концепция напрямую относится и к компонентам Vue 3. Каждый компонент должен выполнять одну конкретную операцию и не пытаться делать слишком много самостоятельно.

На практике, когда компонент выходит за определенные рамки, лучше разделить его на несколько компонентов или вынести поведение во внешние модули. Бывают случаи, когда в итоге получается компонент длиной в несколько тысяч строк, но, по моему опыту, это редко бывает необходимо, и этого можно и нужно избегать. Однако следует предупредить, что излишняя конкретика также может привести к ненужному усложнению.

В качестве примера представим себе экран входа в систему, на котором также отображается опция регистрации. Такой подход встречается сегодня на многих сайтах. Можно включить все функции в один компонент, но это нарушит данный принцип. Лучшей альтернативой будет разделение компонентов как минимум на три компонента для решения этой задачи:

  • Родительский компонент, который управляет логикой пользовательского интерфейса. Этот компонент решает, когда показывать/скрывать компоненты входа и регистрации.
  • Дочерний компонент, выполняющий функцию входа.
  • Дочерний компонент, выполняющий функцию регистрации.

Здесь представлено графическое представление данной конфигурации:

Рисунок 2.2 - Композиция интерфейса входа/регистрации с использованием нескольких компонентов.

Я думаю, что вы быстро поймете преимущества этого принципа. Он облегчает управление, поддержку и адаптацию кода, поскольку веб-приложения имеют свойство очень и очень быстро мутировать и развиваться.

Совет из лучших практик

Наделите компоненты единой ответственностью и функциональностью. По возможности избегайте монолитных компонентов.

Encapsulation (Инкапсуляция)

Инкапсуляция - это представление о том, что данные и методы должны быть обернуты в единое целое и при этом предоставлять четко определенный интерфейс прикладного программирования (API).

Часто это делается в виде классов, модулей или библиотек. JavaScript не является исключением, и настоятельно рекомендуется следовать этому принципу. В Vue 3 эта концепция распространяется не только на компоненты, но и на стили CSS и HTML. Введение однофайловых компонентов - яркий пример того, как фреймворк продвигает этот принцип в действии и насколько он важен для современной разработки.

Лишь в некоторых исключительных ситуациях мы должны рассматривать компоненты (UI) как "черные ящики", которые принимают входящие параметры и предоставляют исходящие данные. Другие компоненты не должны быть знакомы с их внутренним устройством, только с API. По мере создания примеров приложений, описанных в этой книге, вы увидите этот принцип в действии.

KIC - сохраняйте в себе все необходимые параметры

.

KIC - keep it clean

Этот принцип относится главным образом к тому, как вы пишете код. Здесь я должен подчеркнуть, что KIC непосредственно относится к двум категориям, которые сильно влияют на веб-приложения и приложения Vue 3:

  • Как вы форматируете свой код
  • Как вы упорядотичиваете события и переменные

Первый пункт включает в себя использование кодовых соглашений, комментариев и отступов для организации кода и логической группировки функций. Например, если у вас есть методы, которые работают с операциями создания, чтения, обновления и удаления (CRUD), то лучше всего разместить их в коде рядом друг с другом, а не разбрасывать по всему исходному файлу.

Многие интегрированные среды разработки (IDE) содержат функции, позволяющие сворачивать или разворачивать внутренний код функций. Это помогает быстро просматривать и находить в коде участки с похожей логикой.

Вторая часть этого принципа связана с обработкой памяти и ссылок. JavaScript имеет очень хороший сборщик мусора, функция которого заключается в отбрасывании неиспользуемых данных для освобождения памяти. Однако бывают случаи, когда алгоритм не может освободить ресурсы из-за того, что ссылка все еще не выполнена. Если вы работали с другими языками, такими как C/C++, то эта проблема может показаться вам знакомой, поскольку вам необходимо вручную резервировать и освобождать память, когда она не используется.

В JavaScript, если вы регистрируете функцию для прослушивания события, лучше всего вручную снять ее с регистрации в соответствующем событии жизненного цикла компонента, когда она больше не нужна. Это позволит избежать утечек и нерационального использования памяти, а также предотвратить некоторые риски безопасности (которые выходят за рамки данной книги).

Мы рассмотрим жизненный цикл компонента в главе 4, Композиция пользовательского интерфейса с помощью компонентов, а пока возьмем следующий пример в качестве хорошего применения этого принципа и сохраним его в качестве лучшей практики. В этом примере мы создадим компонуемый компонент для обнаружения изменения размера окна, поэтому в разделе script setup мы найдем что-то подобное этому:

  1. Регистрируем функцию на событие изменения размера объекта окна в состоянии монтирования.
  2. Снимаем регистрацию события перед размонтированием компонента.

Здесь приведен фрагмент кода:

vue
<script setup>
+   import {onMounted, onBeforeUnmount} from "vue"
+   onMounted(()=>{
+       window.addEventListener("resize", myFunction)
+    })
+   onBeforeUnmount(()=>{
+       window.removeEventListener("resize", myFunction)
+    })
+   function myFunction(){
+          // Делаем что-то с событием здесь
+    }
+</script>
<script setup>
+   import {onMounted, onBeforeUnmount} from "vue"
+   onMounted(()=>{
+       window.addEventListener("resize", myFunction)
+    })
+   onBeforeUnmount(()=>{
+       window.removeEventListener("resize", myFunction)
+    })
+   function myFunction(){
+          // Делаем что-то с событием здесь
+    }
+</script>

Функции onMounted и onBeforeUnmount являются частью фреймворка Vue 3 и вызываются соответствующим событием жизненного цикла компонента. Здесь мы прикрепляем нашу функцию к событию resize, когда компонент монтируется в Document Object Model (DOM), и освобождаем ее непосредственно перед удалением. Важно помнить, что необходимо убирать за собой и keep it clean.

DRY – don’t repeat yourself (не повторяйся)

Этот принцип достаточно известен, почти превратился в клише. К сожалению, его легко забыть. Его авторство принадлежит Эндрю Ханту и Дэвиду Томасу, которые использовали его в книге Прагматичный программист. Чаще всего его понимают как не пиши одно и то же дважды, и это не так уж и далеко от истины, но он выходит за рамки этого понятия.

Он включает в себя понятие избегания избыточности как в процессе, так и в логике приложения. Основная идея заключается в том, что каждый процесс, выполняющий бизнес-логику, должен существовать только в одном месте во всем приложении.

Например, большинство веб-приложений имеют асинхронную связь с сервером через API. В приложении может быть несколько элементов, которые будут использовать или должны использовать эту связь между удаленным компьютером и сервером. Если бы вы собирались написать весь код/логику взаимодействия с сервером в каждом компоненте, то в итоге мы бы получили не только дублирование кода, но и логики приложения. Такая система открыла бы двери для огромного количества негативных побочных эффектов, проблем с безопасностью, плохой работы пользователей и многого другого.

В соответствии с этим принципом более правильным подходом является абстрагирование всего коммуникационного кода, связанного с API сервера, в единый модуль или класс. На практике в JavaScript это можно даже делегировать веб-рабочему в отдельном потоке. Мы рассмотрим эту реализацию позже в главе 8, Многопоточность с Web Workers.

Как правило, если вы видите, что пишете один и тот же код в разных компонентах или классах, то это явная возможность абстрагировать функциональность в отдельный модуль или компонент.

KISS - keep it simple and short (держи это простым и коротким)

Этот принцип не является исключительным для сферы разработки программного обеспечения. Он был введен в обиход военно-морскими силами США еще в 60-х годах (согласно Википедии, https://en.wikipedia.org/wiki/KISS_principle).

Идея основана на здравом смысле: лучше создавать простые, небольшие функциональные части, которые работают вместе, чем пытаться создать большую и сложную программу за один раз. Кроме того, алгоритмы должны быть реализованы наиболее простым и эффективным способом. В веб-разработке этот принцип очень важен.

Современные веб-приложения состоят из сотен работающих частей, распределенных по нескольким компьютерам, серверам и средам. Чем сложнее система или реализация кода, тем труднее ее обслуживать и адаптировать.

Однако есть одно предостережение. Простота не означает чрезмерного упрощения или ненужного разделения. Слишком большое количество мелких деталей может внести в систему ненужную сложность. Применять принцип KISS означает оставаться в той средней точке, где все поддается управлению и легко понимается.

Code for the next (Пиши код для следующего)

Этот принцип заключается в том, что вы должны сделать свой код читаемым и понятным для кого-то еще, кроме вас. Соглашения об именовании, логический поток и межстрочные комментарии являются частью этого принципа. Не только для случая, когда вам придется передать свой код другому, но и когда вы вернетесь через год или два к тому же самому коду.

Меньше всего вам хочется тратить время на размышления о том, что же сделал прошлый неопытный человек с той заумной строчкой спагетти-кода. Умные разработчики пишут код так, как будто собираются учить кого-то другого, просто и элегантно. Особенно если вы используете открытый код или вносите в него свой вклад, этот принцип жизненно важен для групповой работы.

В этом случае стоит упомянуть о принципе бойскаута, который аналогичен, но применяется в группах. Он гласит, что если вы обнаружили трудночитаемый или "спагетти"-код, то рефакторите его, чтобы сделать чистым.

Совет из лучших практик

Содержите свой код в чистоте, используя комментарии и документацию, объясняющие логику, как будто учите кого-то другого. Чаще всего вы сами себя учите.

Принципы проектирования применимы ко многим различным сценариям, некоторые из них выходят за рамки практики разработки программного обеспечения. Важно усваивать их до тех пор, пока они не станут привычными. В целом, применение этих и других принципов, а также шаблонов проектирования накладывает существенный отпечаток на ваше профессиональное развитие.

Что такое шаблон проектирования программного обеспечения?

При разработке программного обеспечения часто бывает так, что определенные процессы и задачи встречаются в нескольких проектах, в том или ином виде или с некоторыми вариациями. Шаблон проектирования - это проверенное решение для подобных задач. Он не предписывает код, а действует как шаблон рассуждений, подход, абстрагированный независимо от реализации, для повторного использования и адаптации к конкретным условиям.

На практике применение шаблона дает большой простор для творчества. Этой теме посвящены целые книги, в которых приводится больше подробностей, чем позволяет объем данной книги. На следующих страницах мы рассмотрим наиболее часто встречающиеся, на мой взгляд, шаблоны, которые следует иметь в виду при работе с приложениями Vue 3.

Несмотря на то, что для целей изучения мы видим их по отдельности, в реальности часто реализация накладывает, смешивает и заключает в себе несколько шаблонов в одном фрагменте кода. Например, вы можете использовать синглтон для выполнения функций декоратора и прокси для упрощения или изменения взаимодействия между сервисами в вашем приложении (на самом деле мы будем делать это довольно часто, и полный код можно увидеть в Глава 8, Многопоточность с Web Workers.

Шаблоны проектирования также можно понимать как лучшие практики в области программной инженерии и разработки. А противоположную ей, плохую практику, часто называют антипаттерном. Антипаттерны - это "решения", которые, даже устраняя проблему в краткосрочной перспективе, создают проблемы и плохие последствия в дальнейшем. Они порождают необходимость обхода проблемы и дестабилизируют всю структуру и реализацию.

Давайте рассмотрим список шаблонов, которые должны стать частью вашего инструментария для проектов на Vue 3.

Краткий справочный список шаблонов

Шаблоны классифицируются в зависимости от типа функции или проблемы, которую они решают. Существует множество шаблонов в зависимости от контекста, языка и архитектуры системы. Вот неполный список шаблонов, которые мы будем использовать в этой книге и которые, по моему опыту, чаще всего встречаются в приложениях на Vue:

Порождающие шаблоны

Они касаются подхода к созданию классов, объектов и структур данных:

  • Шаблон Singleton
  • Шаблон Dependency injection
  • Шаблон Factory

Поведенческие шаблоны

Они касаются взаимодействия между объектами, компонентами и другими элементами приложения:

  • Шаблон Observer
  • Шаблон Command

Структурные шаблоны

Они предоставляют шаблоны, которые влияют на дизайн вашего приложения и взаимоотношения между компонентами:

  • Шаблон Proxy
  • Шаблон Decorator
  • Шаблон Façade

Асинхронные шаблоны

Они работают с потоком данных и процессов с асинхронными запросами и событиями в однопоточных приложениях (широко используются в веб-приложениях):

  • Шаблон Callbacks
  • Шаблон Promises

Ни в коем случае этот список шаблонов не является полным. Существует гораздо больше шаблонов и классификаций, и этому вопросу посвящена целая библиотека. Стоит отметить, что описание и применение некоторых из них может отличаться в разных литературах, а также существует некоторое дублирование в зависимости от контекста и реализации.

После такого знакомства с шаблонами проектирования давайте рассмотрим их подробнее на примерах.

Шаблон Singleton

Это очень распространенный шаблон в JavaScript и, возможно, один из самых важных, если не самый важный. Основная концепция определяет, что экземпляр одного объекта должен существовать только один раз во всем приложении, и все ссылки и вызовы функций осуществляются через этот объект. Синглтон может выступать в качестве шлюза для доступа к ресурсам, библиотекам и данным.

Когда его использовать

Вот краткое эмпирическое правило, позволяющее понять, когда следует применять этот шаблон:

  • Когда необходимо убедиться, что доступ к ресурсу осуществляется только через один шлюз, например, к глобальному состоянию приложения
  • Когда необходимо инкапсулировать или упростить поведение или взаимодействие (используется в сочетании с другими шаблонами). Например, объект доступа к API.
  • Когда затраты на многочисленные инстанцирования являются большими.Например, создание web workers.

Реализация

Существует множество способов применения этого шаблона в JavaScript. В некоторых случаях реализация из других языков переносится в JavaScript, часто следуя примерам Java с использованием метода getInstance() для получения синглтона. Однако существуют более эффективные способы реализации этого шаблона в JavaScript. Рассмотрим их далее.

Метод 1

Самый простой способ - через модуль, экспортирующий обычный объектный литерал или JavaScript Object Notation (JSON), который является статическим объектом:

js
const my_singleton = {
+     // Код реализации здесь...
+}
+export default my_singleton;
const my_singleton = {
+     // Код реализации здесь...
+}
+export default my_singleton;

После этого вы можете импортировать этот модуль в другие модули и всегда иметь один и тот же объект. Это работает потому, что бандлеры и браузеры достаточно умны, чтобы избежать повторения импорта, поэтому, если этот объект был импортирован в первый раз, он будет игнорировать следующие запросы. Если не использовать бандлер, то реализация JavaScript в ES6 также определяет, что модули являются синглтонами.

Метод 2

Этот метод создает класс, а затем, при первом инстанцировании, сохраняет ссылку на него для последующих обращений. Для того чтобы это работало, мы используем переменную (традиционно называемую _instance) из класса и сохраняем ссылку на экземпляр в конструкторе. В последующих вызовах мы проверяем, существует ли значение _instance, и если да, то возвращаем его. Вот код:

js
class myClass{
+    constructor(){
+         if(myClass._instance) {
+             return myClass._instance;
+         } else {
+             myClass._instance=this;
+         }
+         return this;
+     }
+}
+export default new myClass()
class myClass{
+    constructor(){
+         if(myClass._instance) {
+             return myClass._instance;
+         } else {
+             myClass._instance=this;
+         }
+         return this;
+     }
+}
+export default new myClass()

Второй метод может быть более привычным для разработчиков других языков. Обратите внимание, что мы также экспортируем новый экземпляр класса, а не непосредственно сам класс. Таким образом, инвокеру не придется каждый раз вспоминать об инстанцировании класса, а код будет таким же, как и в методе 1. Этот вариант использования необходимо согласовать с вашей командой, чтобы избежать различных реализаций.

Затем инвокер может вызывать методы каждого из них напрямую (при условии, что синглтон имеет функцию/метод с названием myFunction()):

js
import my_method1_singleton from "./singleton-json";
+import my_method2_singleton from "./singleton-class";
+console.log("В обоих случаях инстанцирования нет!")
+my_method1_singleton.myFunction()
+my_method2_singleton.myFunction()
import my_method1_singleton from "./singleton-json";
+import my_method2_singleton from "./singleton-class";
+console.log("В обоих случаях инстанцирования нет!")
+my_method1_singleton.myFunction()
+my_method2_singleton.myFunction()

Шаблон синглтон чрезвычайно полезен, хотя он редко существует в изоляции. Часто мы используем синглтоны, чтобы обернуть реализацию других шаблонов и обеспечить единую точку доступа. В наших примерах мы будем использовать этот шаблон довольно часто.

Шаблон Dependency injection (инъекция зависимостей)

Этот шаблон просто утверждает, что зависимости для класса или функции предоставляются в качестве входных данных, например, в виде параметров, свойств или других типов реализаций. Это простое утверждение открывает очень широкий спектр возможностей. Возьмем, к примеру, класс, работающий с IndexedDB API браузера через класс абстракции. Подробнее об API IndexedDB мы узнаем в главе 7, Управление потоками данных, а пока остановимся на зависимой части.

Предположим, что файл dbManager.js экспортирует объект, который обрабатывает операции с базой данных, а объект projects обрабатывает CRUD-операции для таблицы (или коллекции) projects. Без использования инъекции зависимостей получится что-то подобное этому:

./chapter 2/dependency-injection-1.js

js
import dbManager from "dbManager"
+const projects={
+    getAllProjects(){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;
import dbManager from "dbManager"
+const projects={
+    getAllProjects(){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;

Предыдущий код демонстрирует "нормальный" подход, когда мы импортируем зависимости в начале файла и затем используем их в коде. Теперь давайте изменим этот же код, чтобы использовать инъекцию зависимостей:

./chapter 2/dependency-injection-2.js

js
const projects={
+    getAllProjects(dbManager){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;
const projects={
+    getAllProjects(dbManager){
+         return dbManager.getAll("projects")
+    }
+}
+export default projects;

Как видите, основное отличие заключается в том, что dbManager теперь передается в качестве параметра функции. Это то, что называется инъекцией. Это открывает множество способов управления зависимостями и в то же время отодвигает жесткое кодирование зависимостей вверх по дереву реализации. Это делает данный класс очень удобным для повторного использования, по крайней мере, до тех пор, пока зависимость соответствует ожидаемому API.

Приведенный пример не является единственным способом инъекции зависимости. Можно, например, присвоить ее внутреннему свойству объекта. Например, если бы файл projects.js был реализован с использованием подхода, основанного на свойствах, то он выглядел бы следующим образом:

./chapter 2/dependency-injection-3.js

js
const projects = {
+    dbManager,
+    getAllProjects(){
+        return this.dbManager.getAll("projects")
+    }
+}
+export default projects;
const projects = {
+    dbManager,
+    getAllProjects(){
+        return this.dbManager.getAll("projects")
+    }
+}
+export default projects;

В этом случае инвокер объекта (кстати, синглтона) должен знать об этом свойстве и присвоить его перед вызовом любой из своих функций. Вот пример того, как это будет выглядеть:

./chapter 2/dependency-injection-4.js

js
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.dbManager = dbManager;
+projects.getAllProjects();
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.dbManager = dbManager;
+projects.getAllProjects();

Но такой подход не рекомендуется. Вы можете видеть, что он нарушает принцип инкапсуляции, поскольку мы напрямую присваиваем свойство объекту. Кроме того, это не похоже на чистый код, даже если это корректный код.

Передача зависимостей по одной функции за раз также не рекомендуется. Итак, какой же подход лучше? Это зависит от реализации:

  • В классе удобно требовать наличие зависимостей в конструкторе (а если они не найдены, то выдавать ошибку)
  • В обычном JSON-объекте удобно предоставить функцию для явного задания зависимости и позволить объекту самому решать, как ее использовать

Этот последний подход также рекомендуется для передачи зависимости после инстанцирования объекта, когда зависимость не готова на момент реализации.

Приведем пример кода для первого пункта, упомянутого в предыдущем списке:

./chapter 2/dependency-injection-5.js

js
class Projects {
+    constructor(dbManager = null){
+         if (!dbManager) {
+             throw "Dependency missing"
+         } else {
+             this.dbManager = dbManager;
+         }
+     }
+}
class Projects {
+    constructor(dbManager = null){
+         if (!dbManager) {
+             throw "Dependency missing"
+         } else {
+             this.dbManager = dbManager;
+         }
+     }
+}

В конструкторе мы объявляем ожидаемый параметр со значением по умолчанию. Если зависимость не предоставлена, мы выбрасываем ошибку. В противном случае мы присваиваем ее внутреннему приватному атрибуту для использования экземпляром. В данном случае инвокер должен выглядеть следующим образом:

js
// Projects - это класс
+import Projects from "projects.js"
+import dbManager from "dbManager.js"
+try {
+    const projects = new Projects(dbManager);
+} catch {
+     // Обработчик ошибок здесь
+}
// Projects - это класс
+import Projects from "projects.js"
+import dbManager from "dbManager.js"
+try {
+    const projects = new Projects(dbManager);
+} catch {
+     // Обработчик ошибок здесь
+}

В альтернативной реализации мы могли бы иметь функцию, которая, по сути, делает то же самое, получая зависимость и присваивая ее приватному атрибуту:

js
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.setDBManager(dbManager);
import projects from "projects.js"
+import dbManager from "dbManager.js"
+projects.setDBManager(dbManager);

Этот подход лучше, чем прямое присвоение внутреннего атрибута, но все равно нужно не забыть выполнить присвоение перед использованием любых методов объекта.

::: Совет из лучших практик Какой бы подход вы ни использовали для инъекции зависимостей, он должен оставаться неизменным во всей вашей кодовой базе. :::

Вы, наверное, заметили, что мы в основном сосредоточились на объектах. Как вы уже догадались, передача зависимости в функцию - это то же самое, что и передача другого параметра, поэтому она не заслуживает особого внимания.

В данном примере ответственность за реализацию зависимости просто перенесена на другой класс в иерархии. Но что если реализовать шаблон singleton для обработки всех или большинства зависимостей в нашем приложении? Таким образом, мы могли бы просто делегировать загрузку зависимостей одному классу или объекту в определенный момент жизненного цикла нашего приложения. Но как это реализовать? Нам понадобится следующее:

  • Метод для регистрации зависимости
  • Метод для получения зависимости по имени
  • Структура для хранения ссылок на каждую зависимость

Применим это на практике и создадим очень наивную реализацию такого синглтона. Пожалуйста, помните, что это академическое упражнение, поэтому мы не рассматриваем проверку ошибок, снятие с регистрации, или другие соображения:

./chapter 2/dependency-injection-6.js

js
const dependencyService = {                         //1
+    dependencies: {},                               //2
+    provide(name, dependency){                      //3
+        this.dependencies[name] = dependency        //4
+        return this;              ;                 //5
+    }
+    inject(name){                                   //6
+        return this.dependencies[name] ?? null;     //7
+    }
+}
+export default dependencyService;
const dependencyService = {                         //1
+    dependencies: {},                               //2
+    provide(name, dependency){                      //3
+        this.dependencies[name] = dependency        //4
+        return this;              ;                 //5
+    }
+    inject(name){                                   //6
+        return this.dependencies[name] ?? null;     //7
+    }
+}
+export default dependencyService;

После этой минимальной реализации рассмотрим каждую строку по строковому комментарию:

  1. Мы создаем простой объектный литерал JavaScript как синглтон.
  2. Объявляем пустой объект для использования в качестве словаря для хранения зависимостей по именам.
  3. Функция provide позволяет нам зарегистрировать зависимость по имени.
  4. Здесь мы просто используем имя в качестве имени поля и присваиваем зависимость, переданную в качестве аргумента (заметьте, мы не проверяем уже существующие имена и т.д.).
  5. Здесь мы возвращаем исходный объект, в основном для удобства, чтобы можно было выстроить цепочку вызовов.
  6. Функция inject принимает имя, зарегистрированное в provide функции.
  7. Мы возвращаем зависимость или null , если она не найдена.

Получив синглтон, мы можем использовать его во всем приложении для распределения зависимостей по мере необходимости. Для этого нам нужен родительский объект, чтобы импортировать их и заполнить сервис. Вот пример того, как это может выглядеть:

./chapter 2/dependency-injection-7.js

js
import dependencyService from "./dependency-injection-6"
+import myDependency1 from "myFile1"
+import myDependency2 from "myFile2"
+import dbManager from "dbManager".
+dependencyService
+     .provide("dependency1", myDependency1)
+     .provide("dependency2", myDependency2)
+     .provide("dbManager", dbManager)
import dependencyService from "./dependency-injection-6"
+import myDependency1 from "myFile1"
+import myDependency2 from "myFile2"
+import dbManager from "dbManager".
+dependencyService
+     .provide("dependency1", myDependency1)
+     .provide("dependency2", myDependency2)
+     .provide("dbManager", dbManager)

Как видно, модуль имеет жестко закодированные зависимости, и его работа заключается в загрузке их в объект dependencyService. Затем зависимой функции или объекту достаточно импортировать сервис и получить нужную зависимость по имени регистрации следующим образом:

js
import dependencyService from "./dependency-injection-6"
+const dbManager = dependencyService.inject("dbManager")
import dependencyService from "./dependency-injection-6"
+const dbManager = dependencyService.inject("dbManager")

Этот подход действительно создает тесную связь между компонентами, но он приведен здесь в качестве справочного материала. Его преимущество заключается в том, что мы можем контролировать все зависимости в одном месте, так что преимущества в обслуживании могут быть значительными.

Выбор имен для методов объекта dependencyService также не случаен: они совпадают с теми, что используются в Vue 3 внутри иерархии компонента. Это очень удобно для реализации некоторых шаблонов проектирования пользовательского интерфейса. Более подробно мы рассмотрим это в главе 4, Композиция пользовательского интерфейса с компонентами и Главе 7, Управление потоком данных.

Как видите, этот шаблон очень важен и реализован в Vue 3 с помощью функций provide/inject. Это отличное дополнение к нашему набору инструментов, но это еще не все. Давайте перейдем к следующему.

Шаблон factory (фабрика)

Шаблон фабрики предоставляет нам способ создания объектов без создания прямых зависимостей. Он работает через функцию, которая, основываясь на входных данных, возвращает инстанцированный объект. Использование такой реализации будет осуществляться через общий или стандартный интерфейс.

Например, рассмотрим два класса: Circle и Square. Оба реализуют один и тот же метод draw(), который рисует фигуру на холсте. Тогда функция фабрики будет работать примерно так:

js
function createShape(type){
+    switch(type) {
+        case "circle": return new Circle();
+        case "square": return new Square();
+    }
+}
+let
+    shape1 = createShape("circle"),
+    shape2 = createShape("квадрат");
+shape1.draw();
+shape2.draw();
function createShape(type){
+    switch(type) {
+        case "circle": return new Circle();
+        case "square": return new Square();
+    }
+}
+let
+    shape1 = createShape("circle"),
+    shape2 = createShape("квадрат");
+shape1.draw();
+shape2.draw();

Этот метод довольно популярен, особенно в сочетании с другими шаблонами, что мы неоднократно увидим в этой книге.

Шаблон Observer (наблюдатель)

Шаблон "наблюдатель" очень полезен и является одной из основ реактивного фреймворка. Он определяет отношения между объектами, в которых один из них наблюдает (субъект) за изменениями или событиями, а другой (другие) уведомляется об этих изменениях (наблюдатели). Наблюдатели также называются слушателями. Вот графическое представление:

Рисунок 2.3 - Субъект выдает событие и оповещает наблюдателей.

Как видно из рисунка, субъект выдает событие для оповещения наблюдателей. Субъект сам определяет, какие события и параметры он будет опубликовывать. Тем временем наблюдатели подписываются на каждое событие, регистрируя функцию у издателя. Именно поэтому данный шаблон часто называют шаблоном pub/sub, и он может иметь несколько вариаций.

При рассмотрении реализации этого шаблона важно обратить внимание на кардинальность публикации: 1 событие на 0..N наблюдателей (функций). Это означает, что субъект должен реализовать, помимо своего основного назначения, функциональность по публикации событий и отслеживанию подписчиков. Поскольку это нарушает один или два принципа проектирования (разделение забот, единая ответственность и т.д.), принято выносить эту функциональность в средний объект. В этом случае предыдущий проект изменяется, добавляя средний слой:

Рисунок 2.4 - Реализация наблюдателя со средним объектом диспетчера.

Этот средний объект, иногда называемый "диспетчером событий", включает в себя базовую функциональность по регистрации наблюдателей, получению событий от субъекта и их отправке наблюдателям. Он также выполняет некоторые действия по очистке, когда наблюдатель перестает наблюдать. Давайте рассмотрим эти понятия на примере простой и наивной реализации диспетчера событий на обычном JavaScript:

./chapter 2/Observer-1.js

js
class ObserverPattern{
+constructor() {
+    this.events = {}                                        //1
+}
+on(event_name, fn = () => {}) {                             //2
+    if(!this.events[event_name]) {
+        this.events[event_name] = []
+    }
+    this.events[event_name].push(fn)                       //3
+}
+emit(event_name, data){                                     //4
+    if(!this.events[event_name]){
+        return
+    }
+    for(let i=0, l=this.events[event_name].length; i<l; i++) {
+        this.events[event_name][i](data)
+    }
+}
+off(event_name, fn){                                        //5
+    let i=this.events[event_name].indexOf(fn);
+    if(i>-1) {
+        this.events[event_name].splice(i, 1);
+    }
+}
+}
class ObserverPattern{
+constructor() {
+    this.events = {}                                        //1
+}
+on(event_name, fn = () => {}) {                             //2
+    if(!this.events[event_name]) {
+        this.events[event_name] = []
+    }
+    this.events[event_name].push(fn)                       //3
+}
+emit(event_name, data){                                     //4
+    if(!this.events[event_name]){
+        return
+    }
+    for(let i=0, l=this.events[event_name].length; i<l; i++) {
+        this.events[event_name][i](data)
+    }
+}
+off(event_name, fn){                                        //5
+    let i=this.events[event_name].indexOf(fn);
+    if(i>-1) {
+        this.events[event_name].splice(i, 1);
+    }
+}
+}

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

  1. В конструкторе мы объявляем объект для использования в качестве внутреннего словаря для событий.
  2. Метод on позволяет наблюдателям зарегистрировать свои функции. В этой строке, если событие не инициализировано, мы создаем пустой массив.
  3. В этой строке мы просто кладем функцию в массив (как я уже говорил, это наивная реализация, так как мы не проверяем, например, дубликаты).
  4. Метод emit позволяет субъекту опубликовать событие по его имени и передать ему некоторые данные. Здесь мы пробегаемся по массиву и выполняем каждую функцию, передавая в качестве параметра полученные данные.
  5. Метод off необходим для того, чтобы снять с регистрации функцию, если она не используется (см. принцип keep it clean, приведенный ранее в этой главе).

Для того чтобы данная реализация работала, каждый наблюдатель и субъект должны ссылаться на одну и ту же реализацию ObserverClass. Самый простой способ обеспечить это - реализовать его через шаблон синглтон. После импорта каждый наблюдатель регистрируется в диспетчере с помощью следующей строки:

js
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.on("event_name", myFunction)
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.on("event_name", myFunction)

После этого субъект испускает событие и передает данные следующими строками:

js
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.emit("event_name", data)
import dispatcher from "ObserverClass.js"    //a singleton
+dispatcher.emit("event_name", data)

И наконец, когда наблюдателю больше не нужно следить за объектом, необходимо очистить ссылку с помощью метода off:

js
dispatcher.off("имя_события", myFunction)
dispatcher.off("имя_события", myFunction)

Существует большое количество крайних случаев и элементов управления, которые мы здесь не рассмотрели, и вместо того, чтобы изобретать велосипед, я предлагаю использовать готовые решения для этих случаев. В нашей книге мы будем использовать одно из них под названием mitt (https://www.npmjs.com/package/mitt). Оно имеет те же методы, что и в нашем примере. Как устанавливать упакованные зависимости, мы рассмотрим в главе 3, Установка рабочего проекта.

Шаблон Command (комманда)

Этот шаблон очень полезен и прост для понимания и реализации. Вместо того чтобы сразу выполнять функцию, основная концепция заключается в создании объекта или структуры с информацией, необходимой для выполнения. Затем этот пакет данных (команда) делегируется другому объекту, который будет выполнять исполнение в соответствии с некоторой логикой его обработки. Например, команды могут быть сериализованы и поставлены в очередь, запланированы, отменены, сгруппированы и преобразованы. Вот графическое представление этого шаблона с необходимыми частями:

Рисунок 2.5 - Графическая реализация командного шаблона

На схеме показано, как клиенты передают свои команды инвокеру. Обычно инвокер реализует некую очередь или массив задач для обработки команд, а затем направляет их выполнение соответствующему приемнику. Если есть какие-либо данные для возврата, он также возвращает их соответствующему клиенту.

Также часто инвокер присоединяет к команде дополнительные данные для отслеживания клиентов и получателей, особенно в случае асинхронного выполнения. Это также обеспечивает единую точку "входа" в приемники и отделяет от них "клиентов".

Снова поработаем над наивной реализацией класса Invoker:

./chapter 2/Command-1.js

js
class CommandInvoker{
+    addCommand(command_data) {                              //1
+          // ... реализация очереди здесь
+    }
+    runCommand(command_data) {                              //2
+         switch(command_data.action) {                      //3
+             case "eat":
+                    // ... вызываем получателя здесь
+                    break;
+             case "code":
+                    // ... вызываем получателя здесь
+                    break;
+             case "repeat":
+                    // ... вызываем получателя здесь
+                    break;
+          }
+     }
+}
class CommandInvoker{
+    addCommand(command_data) {                              //1
+          // ... реализация очереди здесь
+    }
+    runCommand(command_data) {                              //2
+         switch(command_data.action) {                      //3
+             case "eat":
+                    // ... вызываем получателя здесь
+                    break;
+             case "code":
+                    // ... вызываем получателя здесь
+                    break;
+             case "repeat":
+                    // ... вызываем получателя здесь
+                    break;
+          }
+     }
+}

В предыдущем коде мы построчно реализовали пример того, каким должен быть инвокер:

  1. В Invoker раскрывается метод для добавления команд в объект. Это необходимо только в том случае, если команды будут каким-то образом ставиться в очередь, сериализовываться или обрабатываться в соответствии с некоторой логикой.
  2. Эта строка выполняет команду в соответствии с полем action, содержащимся в параметре command_data.
  3. На основании поля действие invoker направляет выполнение в соответствующий приемник.

Реализовать логику маршрутизации выполнения можно разными способами. Важно отметить, что данный шаблон может быть реализован в более широком масштабе в зависимости от контекста. Например, инвокер может находиться даже не в клиентском веб-приложении, а на сервере или на другой машине. Реализацию этого шаблона мы увидим в главе 8, Многопоточность с Web Workers, где мы используем этот шаблон для обработки задач между различными потоками и разгрузки главного потока (в котором работает Vue 3).

Шаблон Proxy

Определение этого шаблона вытекает непосредственно из его названия, поскольку слово "прокси" означает что-то или кого-то, кто действует от имени другого, как если бы это было одно и то же. Довольно многословно, но это поможет вам запомнить его.

Давайте рассмотрим пример, чтобы прояснить, как это работает. Нам понадобятся как минимум три сущности (компонента, объекта и т.д.):

  • Сущность клиент, которой необходимо получить доступ к API целевой сущности
  • А целевая сущность, которая предоставляет некий API
  • Объект прокси, который занимает промежуточное положение и предоставляет тот же API, что и целевой объект, одновременно перехватывая каждое сообщение от клиента и передавая его целевому объекту

Взаимосвязь между этими объектами можно представить графически следующим образом:

Рисунок 2.6 - Прокси-объект раскрывает тот же API, что и целевой.

Ключевым фактором данного шаблона является то, что прокси ведет себя и предоставляет тот же API, что и целевой объект, причем таким образом, что клиент не знает или не должен знать, что он имеет дело с прокси, а не с целевым объектом напрямую. Итак, зачем нам это нужно? Есть много веских причин, например, следующие:

  • Вам необходимо сохранить оригинальный немодифицированный API, но в то же время:
    • Необходимо обрабатывать входные или выходные данные для клиента
    • Необходимо перехватывать каждый вызов API для добавления внутренней функциональности, например, операций обслуживания, повышения производительности, Проверка ошибок, и валидация
    • Цель является дорогим ресурсом, поэтому прокси может реализовать логику для использования его операций (например, кэш)
  • Вам необходимо изменить клиента или цель, но вы не можете изменить API
  • Вам необходимо поддерживать обратную совместимость

Есть и другие причины, с которыми вы можете столкнуться, но я надеюсь, что теперь вы видите, как это может быть полезно. Будучи шаблоном, этот шаблон может быть реализован на различных уровнях, от простого объектного прокси до полноценного приложения или сервера. Он довольно часто используется при частичном обновлении системы или приложения.

На более низком уровне JavaScript даже содержит встроенный конструктор для проксирования объектов, который Vue 3 использует для создания реактивности.

В главе 1, The Vue 3 Framework, мы рассмотрели варианты реактивности с помощью ref(), но в новой версии Vue также появилась другая альтернатива для сложных структур, называемая reactive(). В первом случае используются методы pub/sub(шаблон наблюдателя!), а во втором - нативные обработчики прокси (этот шаблон!). Рассмотрим на примере наивной частичной реализации, как может работать эта нативная реализация.

В этом простом примере мы заставим объект с реактивными свойствами автоматически преобразовывать градусы Цельсия в градусы Фаренгейта и обратно с помощью Proxy объекта:

./chapter 2/proxy-1.js

js
let temperature = { celsius:0, fahrenheit: 32 },                    //1
+    handler = {                                                     //2
+        set(target, key, value){                                    //3
+            target[key] = value;                                 //4
+            switch(key) {
+                case "celsius":
+                    target.fahrenheit = calculateFahrenheit(value); //5
+                    break;
+                case "fahrenheit":
+                    target.celsius = calculateCelsius(value);.
+            }
+        }
+        get(target, key) {
+            return target[key];                                     //6
+        }
+    }
+    degrees = new Proxy(temperature, handler)                       //7
+
+// Вспомогательные функции
+function calculateCelsius(fahrenheit){
+     return (fahrenheit - 32) / 1.8
+}
+function calculateFahrenheit(celsius){
+     return (celsius * 1.8) + 32
+}
+degrees.celsius = 25                                                //8
+console.log(degrees)
+// Выводится в консоль:
+// {celsius:25, fahrenheit:77}                                      //9
let temperature = { celsius:0, fahrenheit: 32 },                    //1
+    handler = {                                                     //2
+        set(target, key, value){                                    //3
+            target[key] = value;                                 //4
+            switch(key) {
+                case "celsius":
+                    target.fahrenheit = calculateFahrenheit(value); //5
+                    break;
+                case "fahrenheit":
+                    target.celsius = calculateCelsius(value);.
+            }
+        }
+        get(target, key) {
+            return target[key];                                     //6
+        }
+    }
+    degrees = new Proxy(temperature, handler)                       //7
+
+// Вспомогательные функции
+function calculateCelsius(fahrenheit){
+     return (fahrenheit - 32) / 1.8
+}
+function calculateFahrenheit(celsius){
+     return (celsius * 1.8) + 32
+}
+degrees.celsius = 25                                                //8
+console.log(degrees)
+// Выводится в консоль:
+// {celsius:25, fahrenheit:77}                                      //9

Давайте рассмотрим код построчно, чтобы увидеть, как это работает:

  1. В этой строке мы объявляем объект temperature, который будет нашей целью для проксирования. Мы инициализируем два его свойства одинаковым преобразованным значением.
  2. Объявляем объект handler, который будет нашим прокси для объекта temperature.
  3. Функция set в прокси-обработчике получает три аргумента: целевой объект, ключ, на который ссылаются, и значение, которое пытаются присвоить. Обратите внимание, что я говорю "попытка", поскольку операция была перехвачена прокси-сервером.
  4. В этой строке мы выполняем присваивание, как и предполагалось, свойству объекта. Здесь мы могли бы выполнить другие преобразования или логику, например, проверку или вызвать событие (снова шаблон Observer!).
  5. Обратите внимание, как мы используем переключатель для фильтрации интересующих нас имен свойств. Когда ключом является celsius, мы вычисляем и присваиваем значение в градусах Фаренгейта. Обратное происходит, когда мы получаем задание для градусов Фаренгейта. Вот здесь-то и проявляется реактивность.
  6. Для функции get, по крайней мере в этом примере, мы просто возвращаем запрошенное значение. В том виде, в котором это реализовано, это было бы то же самое, как если бы мы пропустили функцию getter. Однако именно здесь в качестве примера мы можем оперировать и преобразовывать возвращаемое значение, поскольку эта операция также перехватывается.
  7. И наконец, в строке 7 мы объявляем объект degrees в качестве прокси для temperature с обработчиком.
  8. В этой строке мы проверяем реактивность, присваивая члену объекта degrees значение в Celsius , как это обычно делается для любого другого объекта.
  9. Когда мы выводим объект degrees на консоль, мы замечаем, что свойство fahrenheit автоматически обновилось.

Это довольно ограниченный и простой пример того, как работает и работает конструктор Proxy(). Vue 3 имеет более сложный подход к реактивности и отслеживанию зависимостей, используя шаблоны proxy и observer. Тем не менее, это дает нам хорошее представление о том, какой подход происходит за кулисами, когда мы видим обновление HTML в реальном времени на наших глазах.

Концепция проксирования между клиентом и объектом связана со следующими двумя шаблонами: декоратор и фасад, поскольку они также являются своего рода реализацией прокси. Отличительной особенностью является то, что прокси сохраняет тот же API, что и исходный целевой объект.

Шаблон Decorator (декоратор)

На первый взгляд этот шаблон может показаться очень похожим на шаблон прокси, и это действительно так, однако он добавляет несколько отличительных особенностей, которые выделяют его из общего ряда.

В нем есть те же подвижные части, что и в прокси, то есть клиент, цель и декоратор между ними, который реализует тот же интерфейс, что и цель (да, точно так же, как и в прокси). Однако если в шаблоне Proxy перехваченные вызовы API в основном работают с данными и внутренним обслуживанием, то декоратор расширяет функциональность исходного объекта, делая его более функциональным. Это и есть фактор, который их разделяет.

В примере с прокси можно заметить, что дополнительной функциональностью стала внутренняя реактивность, позволяющая синхронизировать градусы в каждой шкале. Когда вы изменяете одну из них, она внутренне и автоматически обновляет другую. В шаблоне декоратора прокси-объект выполняет дополнительные операции до, во время или после выполнения вызова API к целевому объекту. Как и в шаблоне proxy, все это прозрачно для клиентского объекта.

Например, опираясь на предыдущий код, представим, что теперь мы хотим регистрировать каждый вызов API определенного объекта, сохраняя при этом его функциональность. Графически это будет выглядеть следующим образом:

Рисунок 2.7 - Пример декоратора, дополняющего цель функцией протоколирования.

Здесь то, что сначала было простым прокси, теперь, в результате выполнения скромного вызова логирования, превратилось в декоратор. В коде нам достаточно добавить эту строку перед концом метода set() (при условии, что существует также функция с именем getTimeStamp()):

js
console.log(getTimeStamp());
console.log(getTimeStamp());

Конечно, это простой пример, просто чтобы пояснить суть. В реальном мире декораторы очень полезны для добавления функциональности в приложение без необходимости переписывать логику или значительные части кода. Кроме того, декораторы могут быть штабелируемыми (stackable) или цепляемыми (chainable), что означает, что при необходимости можно создавать "декораторы для декораторов", каждый из которых будет представлять собой один шаг добавления функциональности, сохраняющий тот же API целевого объекта.

И вот так мы начинаем входить в границы шаблона middleware, но в этой книге мы его рассматривать не будем. В любом случае, идея этого шаблона заключается в создании слоев промежуточных функций с определенным API, каждая из которых выполняет одно действие, но с той разницей, что на любом шаге можно принять решение о прерывании операции, и тогда целевой объект может быть вызван, а может и нет. Но это уже другая история... Вернемся к декораторам.

Ранее в этой книге мы уже упоминали, что компоненты Vue 3 не имеют наследования, как обычные классы JavaScript, реализуемые путем расширения друг от друга. Вместо этого мы можем использовать шаблон декораторов в компонентах для добавления функциональности или изменения внешнего вида. Сейчас рассмотрим краткий пример, поскольку более подробно компоненты и проектирование пользовательского интерфейса будут рассмотрены в главе 4, Композиция пользовательского интерфейса с компонентами.

Рассмотрим простейший компонент, отображающий скромный тег h1 с заголовком, который получает на вход следующие данные:

./chapter 2/decorator-1.vue

vue
<script setup>
+    const $props = defineProps(['label'])           //1
+</script>
+<template>
+    <h1>{{$props.label}}</h1>                       //2
+</template>
+<style scoped></style>
<script setup>
+    const $props = defineProps(['label'])           //1
+</script>
+<template>
+    <h1>{{$props.label}}</h1>                       //2
+</template>
+<style scoped></style>

В этом простом компоненте в строке //1 мы объявляем один входной элемент с именем label. Не стоит пока беспокоиться о синтаксисе, поскольку мы подробно рассмотрим это в главе 4, Композиция пользовательского интерфейса с компонентами. В строке //2 мы интерполируем значение непосредственно внутри тегов h1, как и ожидалось.

Таким образом, чтобы создать декоратор для этого компонента, нам необходимо применить следующие простые правила:

  • Он должен действовать от имени компонента (объекта)
  • Он должен использовать тот же API (входы, выходы, вызовы функций и т.д.)
  • Он должен дополнять функциональность или визуальное представление до, после или во время выполнения целевого API

В связи с этим мы можем создать компонент-декоратор, который перехватывает атрибут label, немного изменяет его, а также модифицирует визуальный вид целевого компонента:

./chapter 2/decorator-2.vue

vue
<script setup>
+    import HeaderH1 from "./decorator-1.vue"
+    const $props = defineProps(['label'])                //1
+</script>
+<template>
+    <div style="color: purple !important;">              //2
+         <HeaderH1 :title="$props.label+'!!!'">          //3
+         </HeaderH1>
+    </div>
+</template>
<script setup>
+    import HeaderH1 from "./decorator-1.vue"
+    const $props = defineProps(['label'])                //1
+</script>
+<template>
+    <div style="color: purple !important;">              //2
+         <HeaderH1 :title="$props.label+'!!!'">          //3
+         </HeaderH1>
+    </div>
+</template>

В этом коде в строке //1 видно, что мы сохраняем тот же интерфейс, что и у целевого компонента (который мы импортировали в предыдущей строке), затем в строке //2 мы изменяем (дополняем) атрибут color , а в строке //3 мы также изменяем данные, передаваемые целевому компоненту, добавляя три восклицательных знака. Выполнив эти простые задачи, мы сохранили условия для построения шаблона декоратора, экстраполированного на компоненты Vue 3. Совсем неплохо.

Декораторы очень полезны, но есть еще один прокси-подобный шаблон, который также очень распространен и удобен: шаблон фасада.

Шаблон Façade (фасад)

К настоящему времени вы, возможно, уже видели прогрессивный шаблон в этих, ну, шаблонах. Мы начали с прокси, действующего от имени другого объекта или сущности, дополнили его декораторами, сохранив при этом тот же API, и вот теперь настал черед шаблона façade.

Его задача, помимо функций прокси и декоратора, состоит в том, чтобы упростить API и скрыть за ним большую сложность. Итак, фасад располагается между клиентом и объектом, но теперь объект сложен - это система или даже несколько подсистем. Этот шаблон также используется для изменения API объекта или для ограничения его воздействия на клиента. Взаимодействие можно представить следующим образом:

Рисунок 2.8 - Фасадный объект, упрощающий взаимодействие со сложным API или системой.

Как видите, основное назначение фасада - предложить более простой подход к сложному взаимодействию или API. Мы неоднократно будем использовать этот шаблон в наших примерах для упрощения нативных реализаций в браузере с помощью более удобных для разработчика подходов. Мы будем использовать библиотеки для инкапсуляции использования IndexedDB и создадим собственное упрощенное взаимодействие с веб-рабочими в главе 8, Многопоточность с Web Workers.

Необходимо отметить, что вы уже видели этот шаблон в действии, поскольку он является одной из основополагающих концепций современных технологий. Скрытие сложности за простым интерфейсом (API) встречается повсеместно и является неотъемлемой частью веб-разработки. В конце концов, весь Интернет чрезвычайно сложен, в нем тысячи движущихся частей, а технология, с помощью которой создаются веб-страницы, близка к волшебству. Без этого шаблона мы бы до сих пор программировали с помощью нулей и единиц.

На практике вы будете добавлять уровни упрощения в свои собственные приложения, чтобы снизить сложность. Одним из способов сделать это является использование сторонних библиотек, предоставляющих упрощенный интерфейс. В следующих главах мы будем использовать некоторые из них, например, такие:

  • Axios: для обработки всех асинхронных JavaScript и XML (AJAX) взаимодействий с сервером
  • DexieDB: Для работы с API к IndexedDB (локальной базе данных браузера)
  • Mitt: Для создания конвейеров событий (мы упоминали об этом в шаблоне Observer)
  • Vue 3: Для создания удивительных пользовательских интерфейсов

В целом, для большинства нативных реализаций веб-технологий существуют библиотеки фасадов, которые хорошо протестированы. Разработчики очень хорошо умеют упрощать их и делиться кодом с другими, благодаря движению open source. Тем не менее, используя чужие модули, убедитесь, что они "безопасны". Не изобретайте велосипед и не повторяйтесь Но теперь пора перейти к следующему шаблону в нашем списке.

Шаблон Callback (обратный вызов)

Шаблон обратного вызова прост для понимания. Он применяется в тех случаях, когда необходимо выполнить операцию после завершения синхронной или асинхронной операции. Для этого в вызов функции в качестве одного из параметров включается функция, которая должна быть выполнена по завершении операций. При этом необходимо различать следующие два типа потока кода:

  • Синхронные операции выполняются последовательно друг за другом. Это основной поток кода, сверху вниз.
  • Асинхронные операции выполняются вне обычного потока после их вызова. Их продолжительность неопределена, равно как и успех или неудача.

Именно для асинхронных случаев особенно полезен шаблон callback. Вспомним, например, сетевой вызов. После вызова мы не знаем, сколько времени потребуется для получения ответа от сервера и будет ли он успешным, неудачным или приведет к ошибке. Если бы у нас не было асинхронных операций, наше приложение было бы заморожено, ожидая, пока произойдет разрешение. Это было бы не очень удобно для пользователя, хотя с вычислительной точки зрения это было бы правильно.

Одной из важных особенностей JavaScript является то, что, будучи однопоточными, асинхронные функции не блокируют основной поток, позволяя продолжить выполнение. Это важно, поскольку функции рендеринга браузера работают в одном потоке. Правда, это не бесплатно, так как они потребляют ресурсы, но зато не приводят к зависанию пользовательского интерфейса, по крайней мере, в теории. На практике это будет зависеть от ряда факторов, в значительной степени зависящих от среды браузера и аппаратного обеспечения. Тем не менее, давайте придерживаться теории.

Рассмотрим пример синхронной функции обратного вызова и превратим ее в асинхронную. Пример функции очень прост: мы будем вычислять значение Фибоначчи для заданного числа, используя шаблон обратного вызова. Но сначала напомним формулу вычисления:

js
F(0) = 0
+F(1) = 1
+F(n) = F(n-1)+F(n-2), причем n>=2
F(0) = 0
+F(1) = 1
+F(n) = F(n-1)+F(n-2), причем n>=2

Здесь представлена функция JavaScript, которая применяет формулу и получает обратный вызов для возврата значения. Обратите внимание, что эта функция является синхронной:

./chapter 2/callback-1.js - Синхронный Фибоначчи

js
function FibonacciSync(n, callback){
+     if (n < 2) {
+        callback(n)
+     } else {
+         let pre_1 = 0, pre_2 = 1, value;
+         for(let i=1; i<n; i++){
+            value = pre_1 + pre_2;
+            pre_1 = pre_2;
+            pre_2 = value;
+         }
+         callback(value).
+     }
+}
function FibonacciSync(n, callback){
+     if (n < 2) {
+        callback(n)
+     } else {
+         let pre_1 = 0, pre_2 = 1, value;
+         for(let i=1; i<n; i++){
+            value = pre_1 + pre_2;
+            pre_1 = pre_2;
+            pre_2 = value;
+         }
+         callback(value).
+     }
+}

Заметьте, что вместо того, чтобы вернуть значение с помощью return, мы передаем его в качестве параметра функции callback. Когда полезно использовать такое? Рассмотрим эти простые примеры:

js
FibonacciSync(8, console.log);
+// В консоль будет выведено 21
+FibonacciSync(8, alert)
+// Будет показано окошко с числом 21
FibonacciSync(8, console.log);
+// В консоль будет выведено 21
+FibonacciSync(8, alert)
+// Будет показано окошко с числом 21

Заменив функцию обратного вызова, мы можем существенно изменить представление результата. Однако у функции из примера есть фундаментальный недостаток, влияющий на пользовательский опыт. Будучи синхронной, время вычисления пропорционально переданному параметру: чем больше n, тем больше времени это займет. При достаточно большом числе мы легко можем "подвесить" браузер, но также, гораздо раньше, можем "заморозить" интерфейс. Проверить синхронность выполнения можно с помощью следующего фрагмента:

js
console.log("Before")
+FibonacciSync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// 34
+// After
console.log("Before")
+FibonacciSync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// 34
+// After

Чтобы превратить эту простую функцию в асинхронную, можно просто обернуть логику внутри вызова в setImmediate. Это выведет выполнение из обычного рабочего процесса. Теперь новая функция выглядит следующим образом:

js
function FibonacciAsync(n, callback){
+     setImmediate(()=>{
+         if (n<2){
+              callback(n)
+         } else {
+              let pre_1 = 0, pre_2 = 1,value;
+              for(let i=1; i<n; i++) {
+                  value = pre_1+pre_2;
+                  pre_1 = pre_2;
+                  pre_2 = value;
+              }
+              callback(value);
+         }
+    })
+}
function FibonacciAsync(n, callback){
+     setImmediate(()=>{
+         if (n<2){
+              callback(n)
+         } else {
+              let pre_1 = 0, pre_2 = 1,value;
+              for(let i=1; i<n; i++) {
+                  value = pre_1+pre_2;
+                  pre_1 = pre_2;
+                  pre_2 = value;
+              }
+              callback(value);
+         }
+    })
+}

Как видите, мы используем стрелочную функцию, чтобы завернуть код без каких-либо модификаций. Теперь посмотрите на разницу, когда мы выполним тот же сниппет, что и раньше, с этой функцией:

js
console.log("Before")
+FibonacciAsync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// After
+// 34
console.log("Before")
+FibonacciAsync(9, console.log)
+console.log("After")
+// Будет выведено
+// Before
+// After
+// 34

Как видно из вывода, сниппет выводит After раньше, чем 34. Это происходит потому, что наша асинхронная операция, как и ожидалось, была выведена из обычного потока. При вызове асинхронной функции выполнение не ожидает результата и продолжает выполнять следующую инструкцию. Это может иногда сбивать с толку, но является очень мощным и полезным.

Однако шаблон не предписывает, как обрабатывать ошибки или неудачные операции, как выстраивать цепочку или последовательно выполнять несколько вызовов. Существуют различные способы решения этих проблем, но они не являются частью шаблона. Существует другой способ обработки асинхронных операций, который обеспечивает большую гибкость и контроль: promises (обещания). Мы рассмотрим его далее, и в большинстве случаев вы можете использовать оба шаблона как взаимозаменяемые. Я говорю "в большинстве случаев", а не во всех!

Шаблон Promise (обещаниe)

Шаблон promise предназначен в первую очередь для работы с асинхронными операциями. Как и в случае с обратными вызовами, вызов обещанной функции выводит выполнение из обычного потока, но возвращает специальный объект Promise. Этот объект предоставляет простой API с тремя методами: then, catch и finally:

  • Метод then получает две функции обратного вызова, традиционно называемые resolve и reject. Они используются в асинхронном коде для возврата успешного значения (resolve) или неудачного или отрицательного значения (reject).
  • Метод catch получает параметр error и срабатывает, когда процесс выбрасывает ошибку и выполнение прерывается.
  • Метод finally выполняется в любом случае и получает функцию обратного вызова.

Во время выполнения обещания оно находится в неопределенном состоянии до тех пор, пока не будет разрешено или отклонено. Время ожидания обещания в этом состоянии не ограничено, что делает его особенно полезным для длительных операций, таких как сетевые вызовы и межпроцессные коммуникации (IPC).

Посмотрим, как реализовать предыдущий пример с рядом Фибоначчи с помощьюобещаний:

js
function FibonacciPromise(n) {
+     return new Promise((resolve, reject) => {          //1
+          if (n < 0) {
+              reject()           ;                      //2
+          } else {
+                 if (n < 2) {
+                  resolve(n)                            //3
+                } else {
+                     let pre_1 = 1, pre_2 = 1, value;
+                    for (let i = 2; i < n; i++) {
+                        значение = pre_1 + pre_2;
+                       pre_1 = pre_2;
+                       pre_2 = value;
+                     }
+                   resolve(value);
+                }
+          }
+      })
+}
function FibonacciPromise(n) {
+     return new Promise((resolve, reject) => {          //1
+          if (n < 0) {
+              reject()           ;                      //2
+          } else {
+                 if (n < 2) {
+                  resolve(n)                            //3
+                } else {
+                     let pre_1 = 1, pre_2 = 1, value;
+                    for (let i = 2; i < n; i++) {
+                        значение = pre_1 + pre_2;
+                       pre_1 = pre_2;
+                       pre_2 = value;
+                     }
+                   resolve(value);
+                }
+          }
+      })
+}

На первый взгляд легко заметить, что реализация немного изменилась. В строке //1 мы начинаем с того, что сразу возвращаем объект new Promise(). Этот конструктор получает функцию обратного вызова, которая, в свою очередь, получит два обратных вызова с именами resolve() и reject(). Их мы должны использовать в нашей логике для возврата значения в случае успеха (resolve) или неудачи (reject).

Также обратите внимание, что нам не нужно оборачивать наш код в функцию setImmediate, поскольку обещание по своей природе является асинхронным. Теперь мы проверяем наличие отрицательных чисел и в этом случае отклоняем операцию (строка //2). Другое изменение, которое мы делаем, - это замена callback() на resolve() (//4).

Вызов теперь также изменяется:

js
console.log("Before")
+FibonacciPromise(9).then(
+     value => console.log(value),
+     () => { console.log("Неопределено для отрицательных чисел!") }
+);
+console.log("After")
+// Будет выведено:
+// Before
+// After
+// 34
console.log("Before")
+FibonacciPromise(9).then(
+     value => console.log(value),
+     () => { console.log("Неопределено для отрицательных чисел!") }
+);
+console.log("After")
+// Будет выведено:
+// Before
+// After
+// 34

Как видите, мы выстраиваем цепочку к вызову, методу then, и передаем ему две функции для успеха и неудачи (resolve и reject в нашем коде). Как и раньше, мы получаем тот же самый результат. Теперь это может показаться более многословным (так оно и есть), но преимущества значительно перевешивают дополнительный набор текста. Обещания можно передавать по цепочке, то есть, при успешном выполнении операции можно вернуть новое обещание и таким образом получить последовательную операцию. Вот пример:

js
MyFunction()
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .catch(err=>{...})
MyFunction()
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .then(()=>{ return new Promise(...)}, ()=>{...})
+    .catch(err=>{...})

У конструктора Promise есть и другие методы, например .all, но для более глубокого изучения возможностей и синтаксиса я отсылаю вас к документации.

Тем не менее, получается довольно многословно. К счастью для нас, JavaScript предоставляет нам упрощенный синтаксис для работы с обещаниями, async/await, считая их способом кодирования более "традиционным" способом. Это относится только к вызову обещанных функций и может быть использовано только в функциях.

Для примера представим, что у нас есть три функции, возвращающие обещания, с именами MyFuncA, MyFuncB и MyFuncC (да, я знаю, не самые удачные имена). Каждая из них в случае успеха возвращает одно единственное значение (это условие). Затем они используются внутри MyProcessFunction с новым синтаксисом. Вот объявление:

js
async function myProcessFunction() {                    //1
+    try {                  ;                            //2
+        let     a = await MyFuncA(),                    //3
+                b = await MyFuncB(),
+                c = await MyFuncC()
+        console.log(a + b + c)                          //4
+    } catch {
+        console.log("Ошибка")
+    }
+}
+// Вызов функции в обычном режиме
+MyProcessFunction()                                      //5
async function myProcessFunction() {                    //1
+    try {                  ;                            //2
+        let     a = await MyFuncA(),                    //3
+                b = await MyFuncB(),
+                c = await MyFuncC()
+        console.log(a + b + c)                          //4
+    } catch {
+        console.log("Ошибка")
+    }
+}
+// Вызов функции в обычном режиме
+MyProcessFunction()                                      //5

Начнем с объявления нашей функции с ключевым словом async (строка //1). Это сигнализирует интерпретатору, что мы будем использовать синтаксис await внутри нашей функции. Одно из условий - обернуть код в блок try...catch. Тогда мы сможем использовать ключевое слово await перед вызовом каждой обещанной функции, как в строке //3. К строке //4 мы уверены, что каждая переменная получила свое значение. Безусловно, такой подход более удобен для восприятия.

Исследуем эквивалентности для строки:

js
let a = await MyFuncA()
let a = await MyFuncA()

Это будет соответствовать синтаксису thenable (с использованием .then):

js
let a;
+MyFuncA()
+    .then(result => { a = result; })
let a;
+MyFuncA()
+    .then(result => { a = result; })

Однако проблема с последним синтаксисом заключается в том, что нам необходимо убедиться, что все переменные a, b и c имеют значения, прежде чем мы сможет выполнить строку //4, console.log(a+b+c), что позволяет выстроить цепочку вызовов следующим образом:

js
let a,b,c;
+MyFuncA()
+    .then(result=>{ a=result; return MyFuncB()})
+    .then(result=>{ b=result; return MyFuncC()})
+    .then(result=>{ c=result; console.log(a+b+c)})
let a,b,c;
+MyFuncA()
+    .then(result=>{ a=result; return MyFuncB()})
+    .then(result=>{ b=result; return MyFuncC()})
+    .then(result=>{ c=result; console.log(a+b+c)})

Этот формат сложнее для понимания и, конечно, более многословен. Для таких случаев предпочтительнее использовать синтаксис async/await.

Использование обещаний отлично подходит для обертывания длинных или неопределенных операций и интеграции с другими рассмотренными нами шаблонами (façade, decorator и т.д.). Это важный шаблон, который мы будем широко использовать в наших приложениях.

Подведение итогов

В этой главе мы рассмотрели принципы разработки программного обеспечения и важные шаблоны проектирования, привели примеры на обычном JavaScript и, когда это было уместно, намекнули на реализацию с помощью Vue 3. Эти шаблоны могут быть сложны для восприятия при первом знакомстве с ними, но мы будем использовать их и возвращаться к ним в остальных частях книги, так что эта глава будет работать как справочник. Это позволит вам лучше понять, когда и как применять те или иные шаблоны в зависимости от потребностей вашего приложения.

В следующей главе мы начнем реализовывать проект с нуля и заложим основы для приложений, которые мы будем создавать в остальных частях книги. По мере продвижения вперед мы будем ссылаться на эти шаблоны, чтобы помочь вам закрепить их применение.

Вопросы для проверки

  • В чем разница между принципом и шаблоном проектирования?
  • Почему шаблон singleton так важен?
  • Как можно управлять зависимостями?
  • Какие шаблоны делают возможной реактивность?
  • Взаимосвязаны ли шаблоны между собой? Почему? Можете ли вы привести пример?
  • Что такое асинхронное программирование и почему оно так важно?
  • Можете ли вы придумать примеры использования promised функций?
+ + + + \ No newline at end of file diff --git a/book/ru/index.html b/book/ru/index.html index 55907fa7c..a94b70014 100644 --- a/book/ru/index.html +++ b/book/ru/index.html @@ -3,15 +3,15 @@ - О книге | Vue FAQ + Vue.js 3 Design Patterns and Best Practices | Vue FAQ - + - - + + @@ -26,8 +26,8 @@ -
Skip to content

О книге

Vue.js 3 Design Patterns and Best Practices

Автор: Pablo Garaguso

В книге рассмотрен широкий спектр тем, начиная с самых основ Vue и заканчивая развертыванием конечного продукта.

  • В главе 1, Фреймворк Vue 3, мы познакомимся с ключевыми понятиями Vue и различными вариантами синтаксиса, доступными для написания компонентов.
  • В главе 2, Принципы и паттерны проектирования программного обеспечения, мы подробно рассмотрим важные концептуальные и проверенные паттерны для создания архитектуры нашего кода
  • В главе 3, Установка рабочего проекта, и главе 4, Композиция пользовательского интерфейса с помощью компонентов, мы узнаем, как начать проект Vue и как воплотить дизайн в рабочий код
  • В главе 5, Одностраничные приложения, и главе 6, Прогрессивные веб-приложения, возможно, самых важных главах, мы узнаем, как создавать продвинутые приложения с навигацией и установкой через собственные функции браузера
  • В главе 7, Управление потоком данных, и главе 8, Многопоточность с Web Workers, мы узнаем больше о том, как повысить производительность и управлять потоком информации с помощью хороших практик
  • Глава 9, Тестирование и контроль исходных текстов, представим инструменты для автоматизации программных тестов, обеспечивающих хорошее качество нашего кода
  • Глава 10, Развертывание приложения, дадим представление о шагах и ресурсах, необходимых для публикации и защиты нашего сервера с помощью безопасного протокола
  • Глава 11, Бонусная глава - UX, даст нам взгляд с точки зрения пользователя и общую лексику для сотрудничества с дизайнерами UI/UX.

Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

- +
Skip to content

Vue.js 3 Design Patterns and Best Practices

Автор: Pablo Garaguso

Предисловие

Vue 3 - это последняя и наиболее производительная итерация "прогрессивного фреймворка" для создания реактивных и отзывчивых пользовательских интерфейсов. Сам фреймворк представляет новые концепции и подходы к проектированию паттерны, которые могут быть необычными для других библиотек и фреймворков. Изучение основ фреймворка и понимание принципов проектирования и паттернов из области программной инженерии, поможет вам определить компромиссы каждого подхода и построить надежные приложения.

Книга начинается с базовых концепций, а затем с помощью примеров и сценариев кодирования ведет постепенно к построению более сложных архитектур. Вы начнете с простой страницы и закончите многопоточным приложением, автономным и устанавливаемым Progressive Web Application (PWA). Также рассматривается использование новых инструментов тестирования, доступных для Vue 3.

Помимо демонстрации того, как все делается, эта книга поможет вам научиться как "думать" и "подходить" к решению общих проблем, которые уже нашли свое решение в паттернах проектирования. Это позволит вам сэкономить время и сделать ваше программное обеспечение более приспособленным к будущим изменениям.

Для кого эта книга

Эта книга предназначена для разработчиков Vue, которые заботятся о принципах проектирования фреймворка Vue и использовании часто встречающихся паттернов проектирования при разработке веб-приложений. Вы узнаете, как использовать и настраивать новый бандлер (Vite), Pinia (управление состоянием), Router 4, web workers и другие технологии для создания производительных и надежных приложений.Предварительное знание JavaScirpt и базовые знания Vue будут полезны.

Чтобы получить максимальную пользу от этой книги

Эта книга предполагает, что вы знакомы с веб-технологиями, такими как JavaScript, HTML и технологиями, такими как JavaScript, HTML и CSS. Разработчики, заинтересованные в расширении своего понимания паттернов проектирования и архитектуры получат максимальную пользу от этой книги. Студенты и новички в мире веб-приложений, могут также следовать этой книге, уделяя пристальное внимание примерам кода и используя предоставленные проекты.

Программное/аппаратное обеспечение, рассматриваемое в книгеТребования к операционной системе
Official Vue 3 ecosystem:

• Vue 3 framework
• Pinia
• Vue Router
• Vite
• Vitest
• Vue Testing Tools
Windows, macOS, or Linux
Node.js (any version + v16 LTS)Windows, macOS, or Linux
Web servers: NGINX, ApacheWindows or Linux
Visual Studio CodeWindows, macOS, or Linux
Chrome browserWindows, macOS, or Linux

Особых требований к аппаратному обеспечению современных компьютеров нет, но рекомендуется иметь, по крайней мере, следующее:

  • An Intel or AMD CPU of at least 1 GHz
  • 4 GB of RAM (more is better)
  • At least 10 GB of available storage (for programs and code)

Как правило, если на вашем компьютере может работать современный веб-браузер (Chrome/Chromium, Mozilla Firefox или Microsoft Edge), то он должен отвечать всем требованиям для установки и запуска всех инструментов разработчика, упомянутых в этой книге.

Скачать файлы кода примеров

Файлы кода примеров для этой книги можно загрузить с GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Код в действии

Видеоролики Код в действии для этой книги можно посмотреть на сайте https://packt.link/FtCMS.




Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

+ \ No newline at end of file diff --git a/book/ru/not-implemented.html b/book/ru/not-implemented.html index efdf29a9f..92052e200 100644 --- a/book/ru/not-implemented.html +++ b/book/ru/not-implemented.html @@ -7,10 +7,10 @@ - + - + @@ -26,8 +26,8 @@ - - + + \ No newline at end of file diff --git a/book/ru/summary.html b/book/ru/summary.html new file mode 100644 index 000000000..ca46eee6d --- /dev/null +++ b/book/ru/summary.html @@ -0,0 +1,33 @@ + + + + + + Что включает в себя эта книга | Vue FAQ + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Что включает в себя эта книга

Глава 1, Фреймворк Vue 3

Что представляет собой прогрессивный фреймворк Vue 3? В этой главе представлены наиболее важные аспекты фреймворка и другие ключевые понятия.

Глава 2, Принципы проектирования программного обеспечения и паттерны

Принципы и шаблоны проектирования программного обеспечения являются визитной карточкой хорошей архитектуры программного обеспечения архитектуры. В этой главе рассказывается о них, приводятся примеры для реализации на JavaScript и Vue 3.

Глава 3, Создание рабочего проекта

После изучения необходимых вводных понятий в этой главе создается В этой главе мы создаем рабочий проект, который будет использоваться в качестве базовой основы для будущих проектов. будущих проектов. В ней вы шаг за шагом узнаете, как начать работу над проектом, используя нужные инструменты. как начать проект, используя необходимые инструменты.

Глава 4, Композиция пользовательского интерфейса с помощью компонентов

Эта глава знакомит с концепцией пользовательских интерфейсов и подводит к реализации веб-приложения. к реализации веб-приложения, начиная с концептуального визуального дизайна до разработки соответствующих компонентов.

Глава 5, Одностраничные приложения

Это ключевая глава, в которой представлен маршрутизатор Vue Router для создания одностраничных веб-приложений.

Глава 6, Прогрессивные веб-приложения

В этой главе на основе SPAs создаются PWA, а также представлены инструменты для оценки их готовности. использование инструментов для оценки их готовности и производительности.

Глава 7, Управление потоками данных

Эта глава знакомит с ключевыми концепциями проектирования и управления потоками данных и информации в приложении. потока данных и информации внутри приложения и между компонентами. компонентами. В ней представлена Pinia как официальный фреймворк управления состояниями для Vue 3. как официальный фреймворк управления состоянием для Vue 3.

Глава 8, Многопоточность с помощью веб-рабочих

Эта глава посвящена повышению производительности крупномасштабного приложения с помощью многопоточности с веб-рабочими. В ней также представлены дополнительные паттерны для создания простой в реализации и удобной в обслуживании архитектуры.

Глава 9, Тестирование и контроль исходных текстов

В этой главе мы знакомимся с официальными инструментами тестирования предоставляемыми командой Vue, а также с наиболее распространенной системой контроля версий: системой управления исходными текстами. системой контроля версий: Git. В главе показано, как создавать тестовые примеры для нашего отдельного JavaScript, а также компонентов Vue 3.

Глава 10, Развертывание приложения

В этой главе представлены концепции, необходимые для понимания того, как опубликовать приложение Vue 3 на живом рабочем сервере и как защитить его с помощью Let's Encence. защитить его с помощью сертификата Let's Encrypt.

Глава 11, бонусная глава - UX Patterns

Эта бонусная глава расширяет понятия пользовательского интерфейса и паттернов пользовательского опыта. чтобы обеспечить общий язык между разработчиком и дизайнером. В ней представлены общие шаблоны, предусмотренные стандартом HTML 5, и другие общие элементы.

Приложение: Миграция с Vue 2 на Vue 3

В этом приложении представлено руководство по изменениям и вариантам миграции для опытных разработчиков Vue 2.

+ + + + \ No newline at end of file diff --git a/deployment/ci-cd.html b/deployment/ci-cd.html index f7d5a5b82..ba7730cdb 100644 --- a/deployment/ci-cd.html +++ b/deployment/ci-cd.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

CI/CD

Что такое CI/CD?

CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта.

Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например.

Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после git commit/push изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.

Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis

- + \ No newline at end of file diff --git a/deployment/docker.html b/deployment/docker.html index 55863b1b9..2f157e1b2 100644 --- a/deployment/docker.html +++ b/deployment/docker.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/deployment/github-actions.html b/deployment/github-actions.html index 6665fc28f..009f1acf7 100644 --- a/deployment/github-actions.html +++ b/deployment/github-actions.html @@ -7,10 +7,10 @@ - + - + @@ -335,7 +335,7 @@ cd $backup_dir && rm -rf work logs images; cd $root_backup_dir && dirs_to_be_removed=`ls -dt "$root_backup_dir/"* | tail -n +$backups_remove_count`; rm $dirs_to_be_removed -rf; - + \ No newline at end of file diff --git a/deployment/hosting.html b/deployment/hosting.html index 20070bbb9..b340a9fa0 100644 --- a/deployment/hosting.html +++ b/deployment/hosting.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Хостинг

Где разместить сайт?

После билда фронтенд проекта вы получаете набор html/css/js/jpeg и других статичных файлов, которые надо разместить на вебсервере, чтобы к вашему сайту был доступ.

Варианты размещения с бесплатными планами:

Также многие облачные провайдеры (Amazon, Google, Oracle, Microsoft) предоставляют бесплатные тарифы с возможностью получить виртуальный сервер, на котором можно установить вебсервер (Nginx, Apache) и захостить свой сайт самостоятельно. В этом случае на нем же можно разместить и бэкенд.

Домен

Купить домен сейчас очень просто и недорого (от 200 рублей в год), в связи с чем рекомендуется это сделать. GitHub Pages и другие хостеры позволяют подключить кастомный домен к вашему сайту. Поддомены удобны для организации окружения разработки (environments):

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL сертификаты

Современные браузеры требуют, чтобы сайт был доступен по HTTPS протоколу. Для этого для вашего домена необходим SSL сертификат. Хостинг провайдеры типа Firebase или Github Pages обеспечат вам сертификат сами. Если вы хостите свой сайт самостоятельно на облачном сервере, то можно сгенерировать сертификат с помощью программы CertBot.

- + \ No newline at end of file diff --git a/development/assets.html b/development/assets.html index 45d2b2d81..848151624 100644 --- a/development/assets.html +++ b/development/assets.html @@ -7,10 +7,10 @@ - + - + @@ -259,7 +259,7 @@ // import a root field as named exports - helps with tree-shaking! import { field } from "./example.json"; - + \ No newline at end of file diff --git a/development/building.html b/development/building.html index 9a150ba44..2592322fb 100644 --- a/development/building.html +++ b/development/building.html @@ -7,10 +7,10 @@ - + - + @@ -81,7 +81,7 @@ npx vite-bundle-visualizer -t raw-data
npx vite-bundle-visualizer
 npx vite-bundle-visualizer -t list
 npx vite-bundle-visualizer -t raw-data
- + \ No newline at end of file diff --git a/development/ide.html b/development/ide.html index d0cbdacaf..b49e859e1 100644 --- a/development/ide.html +++ b/development/ide.html @@ -7,10 +7,10 @@ - + - + @@ -523,7 +523,7 @@ "vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, webpack.config.*, windi.config.*" } }
ESlint

Линтер - правая рука кодера. Он проверяет ошибки, форматирует код, делает еще много полезного

В то же время, хорошо настроить ESlint - довольно нетривиальная задача. Множество плагинов к нему, часть устаревшие, многие конфликтуют между собой.

Поэтому для не очень изощренных знатоков ESlint-a самое лучшее воспользоваться готовым решением. Второй человек в экосистеме Vue Antony Fu поделился своим конфигом

Для его установки достаточно добавить @antfu/eslint-config пакет в package.json devDependencies. Если заглянуть внутрь, там будет десятки подобранных пакетов и настроек.

К сожалению, форматирование <style> блока во .vue файлах не работает, поэтому приходится еще и включать Prettier в ручном режиме.

Онлайн песочницы для Vue 3
Еще программы, полезные в веб разработке
  • Postman - запросы к API, создание API
  • Xshell - удобный SSH клиент
  • HeidiSQL - клиент для доступа к SQL базам данных
Какая конфигурация компьютера подходит для фронтенд разработки?

Оперативной памяти минимум 16Гб и хороший (быстрый) SSD диск, всё остальное вторично, включая процессор. Потратьте лучше деньги на качественный второй монитор 22+ дюймов, удобную клавиатуру и мышку.

Для фулстек разработки (и не только) удобно еще иметь мини-ПК, куда переносится база данных, вебсервер и другие [микро]сервисы. Он может работать как сервер, без монитора и клавиатуры.

Также на него можно поставить репозиторий исходного кода. С основной машины подсоединение идет в VS Code через SSH Remote connection. В итоге и бэк, и фронт (Node.js) запускаются на твоем минисервере, и твой ноут больше не греется и не пытается взлететь с помощью бешено вращающихся вентиляторов.

Работать так значительно производительней (MySQL, вебсервера, Docker крутятся на Linux быстрей и надёжней, как и Nodе.js), комфортней и тише. Кулер мини-ПК в штатном режиме включается только на пару секунд при загрузке ОС.

- + \ No newline at end of file diff --git a/development/libraries.html b/development/libraries.html index e9cfb32e9..f510b9f35 100644 --- a/development/libraries.html +++ b/development/libraries.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Подскажите удобную библиотеку

Для работы с датами

moment безвозвратно устарел. Есть day.js и day-fnc.js

Однако в 95% случаев хватает возможностей стандартного JavaScript Intl пакета

Для UI компонентов

Существует достаточно много CSS и UI библиотек

Вот в этой статье есть небольшой обзор их тяжеловесности

Quasar и PrimeVue выглядят солидно.

- + \ No newline at end of file diff --git a/development/misc.html b/development/misc.html index cb0974687..5118dfb01 100644 --- a/development/misc.html +++ b/development/misc.html @@ -7,10 +7,10 @@ - + - + @@ -41,7 +41,7 @@ // is NOT OK b = { x: 2 };

Реализации реактивных переменных в Vue 2 и Vue 3 отличаются. Во Vue 2 была своя (фреймворка) реализация отслеживания изменений. Во Vue 3 для этого используется объект Proxy, введенный в ES6. Из-за поддержки данного функционала на уровне языка (JavaScript engine), соответствующий код фреймворка получается эффективней и проще.

Reactive непосредственно использует Proxy объект.

Ref на объекте использует напрямую Reactive для отслеживания изменения внутри объекта, и создает и хранит массив зависимостей переменной для примитивов и объектов в случае их замены.

Если хотите претенциозной эффективности - используйте на объектах Reactive, на примитивах - Ref. В ином случае можно все делать через Ref.

ShallowRef

Когда у вас массив с большим количеством элементов, но данные внутри элементов массива не меняются, а может меняться только сам массив (добавление элементов, удаление, замена массива) - используйте ShallowRef.

Он работает как Ref, но не отслеживает изменения внутри элементов массива, что дает значительное улучшение производительности.

Миксины

Нужно забыть о них как о страшном сне. Миксины как паттерн множественного наследования являются очень плохой архитектурной практикой и должны быть избегаемы. Во Vue 2 в самом фреймворке не было возможности сделать для компонент общей часть стейта и методов, поэтому использовались миксины. Во Vue 3 появилось Composition API и миксины стали не нужны.

- + \ No newline at end of file diff --git a/development/stores.html b/development/stores.html index b150a1179..4fb576416 100644 --- a/development/stores.html +++ b/development/stores.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

State management во Vue 3

Зачем нужен State management?

Иногда в приложении нужно передать реактивные данные или функцию из одного компонента в другой, и эти компоненты не принадлежат одной иерархии. Механизмы пропсов/ивентов или provide/inject не подходят для этого. Поэтому во Vue 2 появился Vuex - state management библиотека, которая позволяет хранить реактивный стейт и предоставлять доступ к нему отовсюду.

Библиотека управления стейтом на фронтенде обычно называется "стором".

Как можно передать реактивные данные из одного компонента в другой во Vue 3?
  • Если один компонент является прямым потомком другого - пропсы и ивенты
  • Если один компонент непрямой потомок другого - provide/inject или проп/ивент дриллинг (плохая практика)
  • Если они в разных ветках иерархии - стор или Vue 3 ref/reactive

Vue 3 ref/reactive - это когда в отдельном js модуле вы определяете и экспортируете реактивную переменную:

export const userLoggedIn = ref(false);
export const userLoggedIn = ref(false);

После чего она доступна во всём приложении через импорт данного модуля.

Однако, расшаривать просто переменную - архитектурно плохая идея. Обычно вокруг этой переменной есть бизнес логика, которую и надо сделать доступной.

Например, для аутентификации нужен не только сам факт, что пользователь залогинился, но и сопутствующие методы - login(), logout(), register(), isAuthenticated(). Синтез некоего стейта и сопутствующей бизнес логики дал так называемые composable функции во Vue 3.

В некотором смысле - аналог объекта в ООП.

Что такое стор (store) на фронтенде?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Стор (например, Pinia) — это сущность, содержащая состояние и бизнес-логику, которая не привязана к вашему дереву компонентов. Другими словами, здесь находится глобальное состояние. Это что-то вроде компонента, который всегда присутствует, и который каждый может считывать и писать в него.

Официальная документация Pinia

Выглядит как очень неудачное, двусмысленное и запутывающее определение.

С точки зрения разработчика не фронтенда (по сути любой другой язык, кроме JavaScript, плюс частично JavaScript), аналогом конструкции с названиемстор будет база данных - SQL, NoSQL или кэширующий Redis. Там есть аналоги стейта и геттеров (View в SQL БД). Но в 99.99% случаях в базе данных не будет никакой бизнес логики, за исключением ограничений для консистентности данных (например, unique или foreign keys).

С точки зрения разработчика не фронтенда, сторы фронтенда - это просто объекты / stateful сервисы, построенные по шаблону синглтон. Называть их "глобальными сторами" как минимум нелогично.

Скорей всего, это произошло исторически. Сперва был один Vuex, он был один стор и глобален. Потом у него появились модули. Потом у Pinia эти модули стали независимы и расползлись по всему приложению. В итоге, в приложении куча мелких локальных (по области использования) сторов, каждый из которых считает себя глобальным, даже если его использует 2-3 компонента из 1000 на проекте, и даже если в этом сторе 1% - стейта, и 99% - бизнес и сопутствующей логики.

В этом плане использование композабл функций для той же цели (an entity holding state and business logic that isn't bound to your Component tree) - намного более логично. И называть их следует не useAuthStore, а useAuth или useAuthService.

Vuex или Pinia?

Во Vue 3 основной внешней библиотекой управления стейтом стала Pinia. В отличие от Vuex у нее есть поддержка TypeScript, она удобней и, естественно, пользуется преимуществами Vue 3.

Vuex официально устарел (deprecated)

Pinia или Composable functions?

Во Vue 3 появилось нечто, делающее отдельную библиотеку для управления стейтом ненужной. А именно, реактивные типыRef и Reactive, которыми можно пользоваться за пределами компонент. Стало возможным делать свои сторы на основе composable функций и подключать их в любом компоненте.

Основное декларируемое отличие Pinia - интеграция с Vue DevTools, плагины и SSR поддержка. Однако, нужно ли ему то или другое, каждый разработчик решает сам. Работать с composables в DevTools вполне комфортно.

Composable функция, в свою очередь, может иметь как глобальный, так и локальный (переменные объявлены внутри функции) стейты. Это бывает удобно в определенных случаях - можно создать несколько экземпляров composable функций, каждая со своим стейтом. Например, когда у вас на сайте несколько новостных виджетов, различающихся только категорией новостей.

Кроме того, с функциональной точки зрения composable функции имеют полный доступ ко всему Vue Reactivity API, что делает их гибче, чем Pinia.

Composable функции с глобальным стейтом не работают в SSR режиме.

Что касается производительности, то по тестам на изменениях Reactive Pinia примерно в полтора раза медленней Vue 3 Reactive, а на Ref - в 20 раз. Это потому, что Ref (примитивные типы) в Pinia становится частью Reactive.

Также надо помнить, что любая зависимость (в данном случае библиотека Pinia) может принести проблемы, аналогичные с ситуацией "RIP Vuex", когда библиотека умирает, устаревает, перестает поддерживаться или в ней находят уязвимости. Composable функции, в свою очередь, выглядят основательным нововведением во Vue фреймворк.

Как разделять логику между компонентом и composable функциями?

Удобно представлять это как MVC шаблон, где роль View (и частично Controller) выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на композабл функции и их реактивный стейт.

Чтобы понять, что класть в композабл, а что в компонент (который может состоять из нескольких компонент), представьте, что вы меняете компонент на другой - отображающий ваши данные как-то иначе. В идеале, модель (композабл) должен остаться тем же самым, вы переписываете только компонент, в котором логика, ответственная только за отображение.

В то же время, логика (Controller) может делиться между компонентом и композаблом. Например, валидация данных формы может происходить в компоненте (проверка, что поле заполнено), в компоненте с помощью сторонней утилиты (проверка, что пароль - "сложный") и в композабле (проверка, что username - уникален)

- + \ No newline at end of file diff --git a/development/testing.html b/development/testing.html index d57d305c4..be6e9eebc 100644 --- a/development/testing.html +++ b/development/testing.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Тестирование

Нужно ли тестирование на фронтенде?

Тесты бывают нескольких типов, среди них - unit тесты и интеграционные (e2e) теcты

Unit тестированием во Vue занимаются Vitest, Jest

С тестированием на фронте нужно быть аккуратней, так как написание и переписывание тестов зачастую может занять время, сопоставимое с самой разработкой. В то же время, полезность этих тестов будет под большим вопросом. Их целесообразность проявляется на больших проектах с большим количеством разработчиков. Там unit тесты также отнимают время, но снижают вероятность, что кто-то что-то испортит. В то же время на стартапе unit тесты далеко не самый нужный ингридиент для быстрого создания MVP.

Фронтенд разработка в этом аспекте очень сильно отличается от бэкенд разработки, где unit тесты действительно полезны.

Хорошая статья на эту тему - Unit Test Fetish

Что такое e2e тесты?

На фронте, особенно для веб приложения, которое уже в продакшне и должно время от времени обновляться, важны e2e тесты.

e2e (end-to-end) тестирование — это процесс тестирования программного обеспечения, который имитирует реальные действия пользователей на уровне интерфейса.

При этом будет запущен браузер (обычно, в headless режиме - без UI), и он по написанным скриптам будет проверять работу сайта - наличие элементов на странице, возможность логина и т.п.

Основные средства для e2e тестирования - Cypress, WebdriverIO

При CI/CD проекта прогон тестов - один из основных моментов наряду с линтингом и билдом.

- + \ No newline at end of file diff --git a/en/backend/api.html b/en/backend/api.html index 468b4a9fe..53d777f48 100644 --- a/en/backend/api.html +++ b/en/backend/api.html @@ -7,10 +7,10 @@ - + - + @@ -94,7 +94,7 @@ return await http.get("/api/users/user", params); }, };

http.js is a wrapper around requests to the server via your favorite library.

What is the convenience of abstracting the backend communication code from the main application code into a separate service?

You can easily replace axios with fetch or XHR, REST with JSON-RPC or WebSockets. The code in the components does not change and remains simple and explicit.

- + \ No newline at end of file diff --git a/en/backend/auth.html b/en/backend/auth.html index 69fd1e29f..a7509c0e1 100644 --- a/en/backend/auth.html +++ b/en/backend/auth.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Authentication and authorization

What is authentication and authorization

Roughly speaking:

Authentication is when the system verifies that it is John Doe who logged in, for example, by checking his username and password

Authorization - when the system verifies that the user requesting the resource/action has the right to access it. For example, a senior manager has the right to delete an item in the admin, but a simple manager does not.

How to make an authentication system on the site

For SPA the most common way - on JWT tokens. There are many variants of this, depending on the requirements of the security level (John Doe's personal blog with guest comments and online store with deposits and bonuses - two big differences).

JWT is a standard for writing a small amount of information into a string (token) and signing it (cryptography). It is done by the backend. So only the backend can make sure that the token is written by it and has valid information in it.

There is no standard for token authentication as such, there are best practices.

Options:

  1. backend generates token (access token - AT) and puts it in httpOnly cookie. The frontend does not have access to the token, the browser just returns the cookie. This method is undeservedly rarely used, but it is quite reliable. The frontend removes all the hassles of manipulating AT.

Scenario:

  • Front logs in, gets user data from the backend and works with it. When receiving any 401 request, it directs the user to the login form and resets the user data to zero.
  • Back at login creates httpOnly cookie with token with certain lifetime. At each request it checks the token, determines the person to whom this token is issued and his rights, and then decides whether to allow access. If the lifetime of the token has expired, it returns 401.

2 The backend generates an access token (AT) and passes it to the front. The front saves it and sends it back each time. In essence the same as in the first case, plus unnecessary steps and the possibility of losing the token through XSS.

  1. two tokens are used - short-lived access token (AT) and longer-lived refresh token (RT) sent in httpOnly cookie. AT works as in the second case. When its lifetime expires, the backend checks the RT and if it is valid, refreshes the AT. RT expires - the user is sent to re-login.
Where to store access token on the frontend?

In 95% of cases in LocalStorage

What is oAuth and SSO?

oAuth - Login "via Google". Also when, for example, a user has the option on your site to save something to Google Drive. In order to get permission for your site to work with the user's Google Drive account, you ask the user to allow your site to access their account via Google. So we have four parts - Google (the authorization center), the third-party resource (Google Drive), your site, and the user

SSO - single sign-on - a user logs in to a certain company's portal once, and then has transparent access to its different services. For example, login to GMail and access to Google Drive, Google Photo and so on.

Does authentication via JWT give security?

Security is a very complex concept, and JWT authentication is just one of its elements. For critical applications, it is possible to capture the user's browser fingerprint and force the user to re-login as soon as they change. Same with IP. In this way you can fight AT theft. Also set very small AT lifetime if RT is used. But the main security measures are not related to authentication, but to constant monitoring of the system for suspicious actions.

Authorization

If it is necessary to give users different levels of access to site resources, it is common to use either RBAC (Role-based access control) or PBA (Policy-Based Authorization).

In the first case, users are assigned to roles (admin, manager, user) and the level of access is determined by the role.

In the second case, it is possible to set permissions for each user individually for any action in a more granular way.

It should be understood that on the front authorization is done for convenience (the user does not see the sections of the site that are forbidden to him), but the back is responsible for security - he must check each time whether the user has the right to access the requested resource, even if on the front it should not be visible. It is not very difficult to break the front end.

- + \ No newline at end of file diff --git a/en/backend/backend.html b/en/backend/backend.html index b65a04a38..63fda16d5 100644 --- a/en/backend/backend.html +++ b/en/backend/backend.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Options to leverage your backend for frontenders

How to test frontend on backend data?

There are many services that offer their API with different data for testing or full-fledged work

For example, jsonplaceholder.typicode.com.

Google "json placeholder".

Are there any free open APIs with real data?

Plenty. For example, here

Google public api.

You can also poke around relevant sites in DevTools / Network for endpoints with data in a suitable format

How to make your own backend?

If you already know JavaScript, it should not be a problem to install and run Node.js with an HTTP server.

Node.js is not a very popular server for the Internet, but for a small project will do.

In absolute terms, it is easiest to install and start working with Nginx and PHP

Most major cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to run a virtual server. By putting what is required there, you can want both a back end and a front end bundle.

What is BaaS (Backend as a service)?

It is a cloud solution where the backend in the form of a database and its access interface, and possibly the ability to use some logic, is provided by a BaaS provider.

For example, a NoSQL database and access to it is provided by Google using its Firebase service

Alternative with PostgreSQL - Supabase

That is, your frontend will access their specific endpoints and get the services you need - for example, to save and query data in the database.

Both services provide the ability to do authentication on the site. Thus, a front-end developer can write an application using such a service without writing his own backend code and without placing it somewhere on a server on the Internet.

These services have free plans with rather large resources.

Business logic on BaaS

Most BaaS services provide not only CRUD access to their database, but also the ability to write custom logic in the form of Cloud Functions in Firebase, Edge Functions in Supabase, AWS Lambda in Amazon, etc.

These functions are code in some programming language that will be called when a certain backend endpoint is accessed.

In case a frontend developer wants to make a full-fledged application, but doesn't want to bother with a standalone backend, this is a pretty good and very economical solution.

How Edge/Cloud/Lamda features work

It's basically a backend in miniature

Your front end accesses a given endpoint (via the BaaS provider's BaaS service API gateway) - e.g. /api/somefunc

There lies a script written by you in js or other programming language, which is executed, has access to the database and can do other things (load data from the internet for example).

Then the script generates a result and returns it to your front end.

- + \ No newline at end of file diff --git a/en/backend/cors.html b/en/backend/cors.html index 6ec6b8fa4..eb79cfd25 100644 --- a/en/backend/cors.html +++ b/en/backend/cors.html @@ -7,10 +7,10 @@ - + - + @@ -30,7 +30,7 @@ Origin: client-1.com
GET /info HTTP/1.1
 Host: server-site.com
 Origin: client-1.com

If the server at www.server-site.com allows the request source page to access data from the domain, the Access-Control-Allow-Origin line with the name of the declared domain will appear in its response to the request:

Access-Control-Allow-Origin: https://client-1.com
Access-Control-Allow-Origin: https://client-1.com

If the server to which access is requested does not add the specified string to the response, the client browser will return an error code instead of the info file data.

If the server allows pages from any third-party domain to access the resource, the response will contain the "*" mask.

Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *

If the server allows access not to all but a few third-party clients, the server response contains the names of all these domains printed as separate lines or separated by spaces:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com
Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com
Problems with CORS

CORS problems can occur only when a resource is accessed by a browser, not by a separate program like Postman or other backend.

As a temporary solution CORS proxy, which becomes an intermediary between frontend and backend, or browser extensions can help during development.

Vite provides such proxy for development.

- + \ No newline at end of file diff --git a/en/backend/protocols.html b/en/backend/protocols.html index 3be908353..5d0421a72 100644 --- a/en/backend/protocols.html +++ b/en/backend/protocols.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Protocols. To REST or not to REST?

REST, WebSockets, JSON-RPC

For a beginner, of course, it's more convenient to start with REST - requests to the server in any way.

For the more experienced, especially fullstackers, I suggest to take a look at JSON-RPC.

WebSockets is convenient because it gives bidirectional communication (the server can send messages to the client), but requires special software on the backend.

Why JSON-RPC?

After an experience with JSON-RPC, communication with back end is usually never the same again.

It gives order, clarity, rigor and at the same time flexibility. It greatly simplifies and makes code understandable both on the frontend and backend.

A variant of TypeScript implementation of frontend api service on JSON-RPC - here.

When using JSON-RPC, switching to WebSockets or other transport protocols will not cause any difficulties due to the unification of the message format.

How to organize reconnection of WebSocket connection on the front?

You need an Event bus, which will work as a proxy for incoming messages.

You can use mitt.

What is GraphGL?

A complex thing, an attempt to translate SQL query language for client-server queries on the web.

It has a rather specific use, mostly with third-party data providers via APIs.

For your own fullstack application - 99% unnecessary solution.

- + \ No newline at end of file diff --git a/en/deployment/ci-cd.html b/en/deployment/ci-cd.html index 4f9754a00..25bddea11 100644 --- a/en/deployment/ci-cd.html +++ b/en/deployment/ci-cd.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

CI/CD

What is CI/CD?

CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development.

In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example.

CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions.

Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis

- + \ No newline at end of file diff --git a/en/deployment/docker.html b/en/deployment/docker.html index f6289ae59..35a410d1c 100644 --- a/en/deployment/docker.html +++ b/en/deployment/docker.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@ - + \ No newline at end of file diff --git a/en/deployment/github-actions.html b/en/deployment/github-actions.html index e43542324..edb3365ac 100644 --- a/en/deployment/github-actions.html +++ b/en/deployment/github-actions.html @@ -7,10 +7,10 @@ - + - + @@ -334,7 +334,7 @@ cd $backup_dir && rm -rf work logs images; cd $root_backup_dir && dirs_to_be_removed=`ls -dt "$root_backup_dir/"* | tail -n +$backups_remove_count`; rm $dirs_to_be_removed -rf; - + \ No newline at end of file diff --git a/en/deployment/hosting.html b/en/deployment/hosting.html index 32121ac3b..10b4013b1 100644 --- a/en/deployment/hosting.html +++ b/en/deployment/hosting.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Hosting

Where to host a website?

After building a frontend project, you get a set of html/css/js/jpeg and other static files that need to be hosted on some webserver for your website to be online.

Hosting options with free plans:

Also, many cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to get a virtual server on which you can install a webserver (Nginx, Apache) and your website yourself. In this case, the backend can also be placed on it.

Domain

Buying a domain is now very easy and inexpensive (from $1 per year), so it is recommended to do so. GitHub Pages and other hosting providers allow you to connect a custom domain to your site. Subdomains are convenient for organizing development environments:

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL certificates

Modern browsers require a website to be accessible via HTTPS protocol. This requires an SSL certificate for your domain. Hosting providers like Firebase or Github Pages will provide you with the certificate themselves. If you host your site yourself on a cloud server, you can generate the certificate using CertBot software.

- + \ No newline at end of file diff --git a/en/development/assets.html b/en/development/assets.html index 94c3a61c9..da6464d2d 100644 --- a/en/development/assets.html +++ b/en/development/assets.html @@ -7,10 +7,10 @@ - + - + @@ -258,7 +258,7 @@ // import a root field as named exports - helps with tree-shaking! import { field } from "./example.json";
- + \ No newline at end of file diff --git a/en/development/building.html b/en/development/building.html index 6457ac8dc..d1adb62d2 100644 --- a/en/development/building.html +++ b/en/development/building.html @@ -7,10 +7,10 @@ - + - + @@ -80,7 +80,7 @@ npx vite-bundle-visualizer -t raw-data
npx vite-bundle-visualizer
 npx vite-bundle-visualizer -t list
 npx vite-bundle-visualizer -t raw-data
- + \ No newline at end of file diff --git a/en/development/ide.html b/en/development/ide.html index a189b71d4..1ff4f1b9f 100644 --- a/en/development/ide.html +++ b/en/development/ide.html @@ -7,10 +7,10 @@ - + - + @@ -522,7 +522,7 @@ "vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, webpack.config.*, windi.config.*" } }
ESlint

Linter is a coder's right hand. It checks for errors, formats code, and does many other useful things

At the same time, it is quite a nontrivial task to set up ESlint well. There are a lot of plugins for it, some of them are outdated, many of them conflict with each other.

That's why for not very sophisticated ESlint connoisseurs it's best to use a ready-made solution. The second person in Vue ecosystem Antony Fu shared his config.

To install it, just add the @antfu/eslint-config package to package.json devDependencies. If you look inside, there are dozens of picked packages and configurations.

Unfortunately, formatting the <style> block in .vue files doesn't work, so you have to enable Prettier in manual mode as well.

Online sandboxes for Vue 3
More programs useful in web development
  • Postman - API requests, API creation
  • Xshell - handy SSH client
  • HeidiSQL - client for accessing SQL databases
What computer configuration is suitable for frontend development?

At least 16GB RAM and a good (fast) SSD disk, everything else is secondary, including the processor. Spend your money on a quality second 22+ inch monitor, a comfortable keyboard and mouse.

For fullstack development (and not only) it is convenient to have a mini-PC where you can transfer database, webserver and other [micro]services. It can work as a server, without a monitor and keyboard.

You can also put a source code repository on it. From the main machine the connection goes to VS Code via SSH Remote connection. As a result, both back and front end (Node.js) run on your miniserver, and your laptop no longer gets warm and tries to take off with the help of frantically spinning fans.

It is much more productive (MySQL, webservers, Docker run faster and more reliably on Linux, as does Node.js), comfortable and quieter. The cooler of the mini-PC in normal mode is turned on only for a couple of seconds when the OS is booting.

- + \ No newline at end of file diff --git a/en/development/libraries.html b/en/development/libraries.html index 0f5930e46..ecc067ae0 100644 --- a/en/development/libraries.html +++ b/en/development/libraries.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Tell me a handy library

For working with dates

moment is irretrievably obsolete. There's day.js and day-fnc.js.

However, in 95% of cases the capabilities of the standard JavaScript Intl package are sufficient

For UI components

There are quite a few CSS and UI libraries out there

Here in this article is a small overview of their heavyweight nature

Quasar and PrimeVue look solid.

- + \ No newline at end of file diff --git a/en/development/misc.html b/en/development/misc.html index 389d5bc41..7ce27a972 100644 --- a/en/development/misc.html +++ b/en/development/misc.html @@ -7,10 +7,10 @@ - + - + @@ -40,7 +40,7 @@ // is NOT OK b = { x: 2 };

The implementations of reactive variables in Vue 2 and Vue 3 are different. Vue 2 had its own (framework) implementation of change tracking. In Vue 3, the Proxy object introduced in ES6 is used for this purpose. Because of the support for this functionality at the language level (JavaScript engine), the corresponding framework code is more efficient and simpler.

Reactive uses the Proxy object directly.

Ref on an object uses Reactive directly to track changes within the object, and creates and uses an array of variable dependencies for primitives and objects in case they are replaced.

If you want pretentious efficiency, use Reactive on objects and Ref on primitives. Otherwise, you can do everything via Ref.

ShallowRef

When you have an array with a large number of elements, but the data inside the array elements does not change, but only the array itself can change (adding elements, deleting, replacing the array) - use ShallowRef.

It works like Ref but does not track changes inside array elements, which gives a significant performance improvement.

Mixins

We should forget about them like a bad dream. Mixins as a pattern of multiple inheritance is a very bad architectural practice and should be avoided. In Vue 2, the framework itself did not have a way to make the component part of the steit and methods common, so mixins were used. In Vue 3, the Composition API was introduced and mixins were no longer needed.

- + \ No newline at end of file diff --git a/en/development/stores.html b/en/development/stores.html index 3a28fd3dd..c20772cbc 100644 --- a/en/development/stores.html +++ b/en/development/stores.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

State management in Vue 3

Why State management?

Sometimes in an application you need to pass reactive data or a function from one component to another, and these components do not belong to the same hierarchy. Props/invents or provide/inject mechanisms are not suitable for this. That's why Vue 2 introduced Vuex, a state management library that allows you to store a reactive state and provide access to it from anywhere.

A frontend state management library is usually called a "store".

How can I pass reactive data from one component to another in Vue 3?
  • If one component is a direct descendant of another - props and events
  • If one component is an indirect descendant of another - provide/inject or prop/event dribbling (bad practice).
  • If they are in different branches of the hierarchy - store or Vue 3 ref/reactive

Vue 3 ref/reactive is when you define and export a reactive variable in a separate js module:

export const userLoggedIn = ref(false);
export const userLoggedIn = ref(false);

It is then available throughout the application via the import of this module.

However, it is architecturally a bad idea to just share a variable. Usually there is business logic around this variable, which should be made available.

For example, authentication requires not only the fact that the user is logged in, but also the associated methods - login(), logout(), register(), isAuthenticated(). Synthesizing some kind of steit and the accompanying business logic yielded the so-called composable functions in Vue 3.

In some sense, it is an analog of an object in OOP.

What is a store on the frontend?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Store (such as Pinia) is an entity that contains state and business logic that is not bound to your Component tree. In other words, this is where the global state resides. It's sort of like a component that is always present, and that anyone can read and write to.

_ Official Pinia documentation.

Looks like a very unfortunate, ambiguous and confusing definition.

From the perspective of a non-frontend developer (basically any language other than JavaScript, plus partially JavaScript), the analog of a construct called store would be a database - SQL, NoSQL or caching Redis. There are analogs of state and getters (View in SQL database). But in 99.99% of cases, there will be no business logic in the database except for data consistency constraints (e.g., unique or foreign keys).

From a non-frontend developer's perspective, frontend stores are just objects / stateful services built on a singleton pattern. Calling them "global stores" is at least illogical.

It's likely that this happened historically. First there was one Vuex, it was one store and global. Then it had modules. Then Pinia modules became independent and spread all over the application. As a result, the application has a bunch of small local (by area of use) storages, each of which considers itself global, even if it is used by 2-3 components out of 1000 on the project, and even if this storage has 1% of steate and 99% of business and related logic.

In this respect, using composable functions for the same purpose (an entity holding state and business logic that isn't bound to your Component tree) - is much more logical. And they should be called useAuth or useAuthService instead of useAuthStore.

Vuex or Pinia?

In Vue 3, Pinia has become the main external library for managing the stack. Unlike Vuex, it has TypeScript support, is more convenient, and naturally takes advantage of Vue 3.

Vuex is officially deprecated

Pinia or Composables functions?

In Vue 3 there is something that makes a separate library for managing the state unnecessary. Namely, reactive types Ref and Reactive that can be used outside of a component. It became possible to make your own storages on the basis of composable functions and connect them in any component.

The main declared difference of Pinia is integration with Vue DevTools, plugins and SSR support. However, whether he needs one or the other, each developer decides for himself. It is quite comfortable to work with composables in DevTools.

Composable function, in its turn, can have both global and local (variables are declared inside the function) states. This can be useful in certain cases - you can create several instances of composable functions, each with its own state. For example, when you have several news widgets on your site, differing only by news category.

Also, from a functional point of view, composable functions have full access to the entire Vue Reactivity API, which makes them more flexible than Pinia.

Composable functions with global states do not work in SSR mode.

As for performance, according to tests Pinia is about 1.5 times slower on Reactive changes than Vue 3, and 20 times slower on Ref. This is because Ref (primitive types) in Pinia becomes part of Reactive.

You should also keep in mind that any dependency (in this case the Pinia library) can bring problems similar to the "RIP Vuex" situation when the library dies, becomes obsolete, is no longer supported, or vulnerabilities are found in it. Composable features, on the other hand, look like a thorough innovation to the Vue framework.

How to split logic between component and composable functions?

It is convenient to think of it as MVC pattern, where the role of View (and partially Controller) is played by components, which are mainly responsible for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

To understand what to put in a composable and what to put in a component (which may consist of several components), imagine that you change the component to another one - displaying your data in some other way. Ideally, the model (composite) should remain the same, you are only rewriting the component that has logic responsible for displaying it.

At the same time, the logic (Controller) can be shared between the component and the composable. For example, validation of form data can happen in the component (checking that the field is populated), in the component using a third-party utility (checking that the password is "complex"), and in the composable (checking that username is unique)

- + \ No newline at end of file diff --git a/en/development/testing.html b/en/development/testing.html index 1207ce8de..ab25356f4 100644 --- a/en/development/testing.html +++ b/en/development/testing.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Testing

Do I need testing on the frontend?

There are several types of tests, among them are unit tests and integration (e2e) tests

Unit testing in Vue is done by Vitest, Jest.

You should be more careful with front-end testing, as writing and rewriting tests can often take time comparable to the development itself. At the same time, the usefulness of these tests will be highly questionable. Their expediency appears on large projects with a large number of developers. There unit tests also take time but reduce the probability that someone will mess something up. At the same time, unit tests are not the most necessary ingredient for quick MVP creation at a startup.

Frontend development in this aspect is very different from backend development, where unit tests are really useful.

Good article on this topic - Unit Test Fetish

What are e2e tests?

On the front end, especially for a web application that is already in production and needs to be updated from time to time, e2e tests are important.

e2e (end-to-end) testing is a software testing process that simulates real user actions at the interface level.

In this case, a browser will be launched (usually in headless mode - without UI), and it will use the scripts written to check the work of the site - the presence of elements on the page, the possibility of login, etc.

The main tools for e2e testing are Cypress, WebdriverIO.

In CI/CD projects, running tests is one of the main moments along with linting and build.

- + \ No newline at end of file diff --git a/en/frontend/about-frameworks.html b/en/frontend/about-frameworks.html index 542284800..5b0c19363 100644 --- a/en/frontend/about-frameworks.html +++ b/en/frontend/about-frameworks.html @@ -7,10 +7,10 @@ - + - + @@ -40,7 +40,7 @@ // Vue someArr.value.push(newItem.value);

Using ES6 native Proxy object avoids decomposition and creating an intermediate array. Also it should more performant.

- + \ No newline at end of file diff --git a/en/frontend/architecture.html b/en/frontend/architecture.html index 72417dd7c..e9504ee1d 100644 --- a/en/frontend/architecture.html +++ b/en/frontend/architecture.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Frontend application architecture

What is a good web application architecture

There are different theoretical definitions and justifications for this concept, but roughly speaking it is the following.

Let's say you are developing a project, already at the final stage. A customer comes to you and says something like: I want to add a shadow to all buttons, I want to change the UI library, we decided to support multiple languages, we decided to replace this module with another, we need to make more detailed adaptability for different resolutions, we decided to add themes, we are changing the provider of payment processing services, we have an increasing number of users / the site is slowing down / need to speed it up, need to increase the level of security of the site, we took a middle programmer, bring him up to speed quickly, and let him add functionality or fix the b

A good frontend application architecture allows you to accomplish all of this most efficiently with the least amount of effort.

OOP on the frontend

Many people coming from development in object-oriented languages try to use OOP concepts on the frontend and program with classes, inheritance, polymorphism and other things.

This is a mistake. The main computations on the front end are related to UI - displaying data, handling user interaction. Class systems and microservices are simply not needed on them. Of course, you can create a basic button, wrap it in two custom components and consider it inheritance, but you can't do it in code. That's why you have to learn to think in other categories - components, composable functions, js modules. And use your JavaScript power, not trying to stretch it on OOP.

At the same time, a good analogy of an object with a global ("static") and local ("object") state is a composable function. It can be used in certain situations.

Suitable architecture for Vue 3 web application

The most suitable architecture for a Vue 3 application is modular.

Initially, the application is divided into logical modules that are loosely related to each other. For example, for an online store, it can be a product catalog module, a module of a single product, a module of a personal cabinet / user account.

In addition, there is a shell module - what is sometimes called an app shell. A template with a header, footer, side menu and main window. It is wise to put utilities and resources used throughout the application into this module - for example, api, useI18n, BaseButtonandstringHelpers.

Each module has its own components, composables, assets, utils; perhaps api, routes, views, layouts.

Loose coupling allows each module to be developed fairly independently, which greatly increases the likelihood of project success.

Useful tips
Avoid addictions

If there is a possibility not to introduce a new dependency (not to plug in a new npm package) - don't do it. It may save you a bit of time, but a third-party library will sooner or later become obsolete, no longer supported, and may have a vulnerability. Besides, it increases the size of your bundle, which directly affects the performance of your application. Tree shaking is good in advertising, but it doesn't always work in reality.

If you need, for example, the debounce function, don't hurry to plug it together with some library. Google its implementation and copy 15 lines of code and make your own function.


Use wrappers over components of UI libraries and third-party utilities

If you use components of some UI library, don't use them directly - make wrappers for them. For example, BaseButton or BaseInput. This will make styling the components much easier, and will also make it much easier to switch to another library, or replace them with your own components.

The same goes for utilities.


Regular refactoring

Do code refactoring from time to time, moving components and modules to where they should logically be, renaming them, and structuring and improving the code itself. This is good for both the code and your professional growth.


Use CSS3

Try to use pure CSS3 for adaptability. Do not be tied to columnar models of CSS and UI libraries, unless it is a "done and forgotten, let the customer continue to suffer with it" project.

Spend a couple of days to learn Flexbox and you will be able to layout on it faster and better than on any Tailwind.


Use modern standards and language features

For example, HTML5 semantic elements - aside, header, section, article, details, etc.

CSS3 - Flexbox and Grid, Container query


Document the project

Draw use-case and other diagrams, describe the main functionality of the project and important details of its implementation - this will at least raise your level as a software developer.

VitePress is a very handy tool for technical documentation.

- + \ No newline at end of file diff --git a/en/frontend/css-ui-libs.html b/en/frontend/css-ui-libs.html index e91658875..0b6e89b38 100644 --- a/en/frontend/css-ui-libs.html +++ b/en/frontend/css-ui-libs.html @@ -7,10 +7,10 @@ - + - + @@ -32,7 +32,7 @@ <template> <QButton ... /> </template>

and use BaseButton in your code. This way it will be much easier for you to upgrade, replace the library or replace this component with a self-designed one. And even just change the styles of the component.

Layout and adaptability of pages by means of CSS and UI libraries

Using the column system and other functionality of CSS and UI libraries like the popular Tailwind is convenient for small projects and sometimes speeds up layout, but very much worsens the quality of the code as a whole, including its maintainability and extensibility. It's as if the world went back to the days of IE6, when all styles and JavaScript were also located in tag attributes, and the whole evolution of CSS into a clear, convenient, beautiful hierarchical class model was for nothing, just like the division of the web into document (template), presentation layer (CSS styles) and logic (JavaScript).

The web is full of articles why an approach like Tailwind is a bad thing. We can only note that with proper skill, layout on pure CSS3 is also fast and much more convenient and pleasant in terms of DX than through CSS and UI libraries.

Quote

Good developers know the reasons why standards, patterns and good practices have become the way they are.

Bad developers stick to whatever new trend that might save them some learning curve.

- + \ No newline at end of file diff --git a/en/frontend/learning.html b/en/frontend/learning.html index 5df5206d0..9eab5137f 100644 --- a/en/frontend/learning.html +++ b/en/frontend/learning.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Learning Vue

Sources of information on Vue

For some reason, it is believed that there are only two ways to get knowledge on frontend - Vue documentation and tutorial videos from YouTube and all kinds of courses.

But documentation is not a textbook, but a reference book, and it is very difficult to separate grains from chaff on YouTube. I met some useful videos, but all of them were intended for developers who already know Vue quite well and showed some new or non-standard moments.


The main teacher should be a book that teaches, not a reference book.

An excellent Vue tutorial in English is the May 2023 Vue.js 3 Design Patterns and Best Practices. You can register on oReilly and read for 10 days for free. Even download it. In spite of the title, the book teaches programming, and from a fairly basic level.

Code examples from the book are in the public repository and well worth studying.

Vue 2 or Vue 3?

Vue 3.
Composition API.

If you need Vue 2 to support an existing project, you'll know the answer to that question yourself.

The difference between Vue 2 and Vue 3 is big. It's not a case of learning the previous version beforehand to better and more easily understand the next one.

Do I need to know JavaScript beforehand?

Absolutely, at least an intermediate level. If not, I would suggest taking a short javascript course first, so that the person knows about the document object, knows how to handle array methods and is not too afraid of promises. Also, HTML and CSS at least at a basic level.

Here is an easy to read book - "Morgan N. - JavaScript for Kids. A Programming Self-Tutorial - 2016. Before you start learning Vue, it is advisable to understand 70% of the first part as well as paragraphs 10 and 12.


tip

Also an absolutely necessary pre-skill is the ability to google.

Is there a certification for Vue?

Vue.js Certification

Vue Style Guide

Be sure to check out the Vue Style Guide and try to follow its best practices when writing code.

Go back to this source from time to time and improve your code.

ESlint also helps you keep your code in line with best practices.

Do I need a mentor?

A mentor is useful for both a beginner and an experienced developer. You can uselessly kill two days to solve a problem that can be explained in 20 minutes by a more experienced person. And this two-day "experience" will never be useful again.

In companies, this role is usually played by more competent and friendly colleagues.

There are services like Solvery on the Internet that can help in this matter.

I still want video

There are quality ones from Vue Mastery, but most are outdated.

What else to look at besides Vue? React?

You can do React if you have a real option to use that knowledge, but it's much better to expand your developer horizons. Try to write a simple API on the backend. The easiest and most convenient language for this is PHP, but you can also use Node.js or Python. Try JSON-RPC and WebSockets transport protocols. Upload your application to GitHub Pages or another similar service, experiment with GitHub Actions - they help a lot with deploy automation and CI/CD in general. Work with Cloud providers (many offer free resources), set up a virtual server. Register a domain, make a product finished site - even if it's just your resume site or something basic on VitePress (used by this site). Work with FireStore and open APIs for various data. Check out Swagger. Learn SQL, install MySQL and play around with it, or do it on SupaBase. Understanding how data is stored and processed on the backend will help a lot in choosing the right strategies on the frontend.

Study how the modern internet works and what technologies and best practices are prevalent on it now.

- + \ No newline at end of file diff --git a/en/frontend/spa-pwa-ssr-ssg.html b/en/frontend/spa-pwa-ssr-ssg.html index b8234ef9b..4280ac697 100644 --- a/en/frontend/spa-pwa-ssr-ssg.html +++ b/en/frontend/spa-pwa-ssr-ssg.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

SPA, PWA, SSG, SSR and SEO

Web 1.0 -> Web 2.0

First there was static HTML and browsers showed it. A little bit later a little bit of JavaScript was invented to process forms and do a little animation. Then CSS came along and everyone saw that it was beautiful. Then someone proposed the idea of JSON for data format, and then Microsoft gave the world XMLHttpRequest, and JavaScript was allowed to send and receive data from the server.

That's how SPA was born.

SPA

SPA (Single Page Application) works like a regular desktop/mobile application - when first accessing the server, it receives the shell necessary to display the site, and then sends data to/from the server, usually in JSON format. This is much more efficient than the way when with each request from the server came a new HTML page with all the resources.

For the user UX increases significantly.

spa-vs-mpa

PWA

PWA (Progressive Web Application) is another step to improve user experience and make web applications as close as possible to native web applications.

With PWA, two elements are added to the SPA:

  1. Manifest. A text file with the properties of the application. With this, the icon of the web application can be set as well as native applications to the home screen of the smartphone. In addition, when PWA is launched, it may not show browser elements and appear to be a normal application.

  2. Service worker. This is a layer in the browser between the server and the browser itself that allows you to do managed caching. In other words, store the app with all the resources on the smartphone/computer so that when you start it, it will run immediately. If you don't need data from the server, the app can run offline (e.g. Notes).

You can read more about PWA on the website created by the Chrome team - https://web.dev/

Upgrading SPA to PWA is very small in labor cost, but very significant in benefit. Developing SPA and not making it a PWA is like renting a luxury hotel room but sleeping on a mat at its entrance in the corridor because it's too lazy to walk to the bedroom.

PWA -> Workbox and vite-plugin-pwa

Manifest and Service worker are so simple that creating a wrapper over SW - Workbox, and a plugin for Vite - vite-plugin-pwa is not logical. You get several times more code, need to load additional dependencies and understand wrapper configurations. Simple things have been made complex.

It is better to use Manifest and Service worker as they were created originally, and write these two simple files using templates from the specifications.

SSG

SSG (Static Site Generation) is an approach where the content of a website is pre-generated into html files, which are then distributed from the server.

Immediately suitable for indexing by search engines.

SSR

SSR (Server Side Rendering), a way of generating html on the server side, when generation occurs at the moment of request. After the client requests a page, the server executes API requests on its side and then generates the html page. Accordingly, the server needs a Node.js server, which is quite a heavy load on the hardware.

In addition, there are a lot of restrictions when writing code and using certain JavaScript and Vue features. As Google writes regarding SSR - "A rehydration problem: one app for the price of two".

SEO optimization

In order for a search engine to index a page on your site, it must receive HTML with content (text, images, video) when accessing it. With SPA sites, where content is loaded dynamically by JavaScript, this is often not possible.

The most popular and inefficient method to bypass this is to use SSR (SSG is suitable for simple structured sites without backend, like documentation).

Google allows you to see how your site looks/indexed by its crawler, which somehow still works with scripts, so first check if you need to get complicated at all.

If you find problems, you can use dynamic rendering

dynamic-rendering

The point is to handle requests from normal users and search bots differently and give them different pages. For users - SPA, for search bots - pages generated on the fly or in advance. Distribution can be handled by a webserver or an entry point to your site (index.php instead of index.html).

The above picture implies some kind of Prerenderer (which are also available as a third-party service or their own solution), but in most cases it is much easier to generate HTML page for the bot directly.

That is, for example, for a product page in an online store it can be its text description with pictures and customer reviews in any HTML formatting. For this purpose it is enough a script on PHP/Express/Python, etc. in 100-200 lines, which is much less labor-intensive than SSR solutions, and also reduces the requirements in the server "hardware" by orders of magnitude (the output can be cached in a static HTML file).

When the actual content (text, images) of such a page coincides with the content of SPA in the browser, Google does not consider the simplified version for its bot as a deception. This method has been around since before the advent of SSRs. Verified by many years of use.

PageSpeed and other performance tests

PageSpeed and similar tools are very useful in identifying unoptimized places in your web application, but it is not quite right for SPA and PWA.

More precisely, some of its metrics don't take into account UX as a whole. A well-built PWA, when first downloaded and installed, will of course lose by FCP metrics to its SSR counterpart, but after placing all its resources locally on the client's browser, no SSR will come close to it in terms of speed and user comfort, not to mention other features like offline operation and installation as a native application.

SSR can probably be useful for some exceptional cases, but in general it looks like a dead-end branch in frontend development.

- + \ No newline at end of file diff --git a/en/index.html b/en/index.html index 10eca20b8..468b7fa0c 100644 --- a/en/index.html +++ b/en/index.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Vue FAQ

Vue JavaScript framework FAQ

Most frequently asked questions about Vue.js

Vue FAQ
- + \ No newline at end of file diff --git a/en/misc/CHANGELOG.html b/en/misc/CHANGELOG.html index 46a726beb..8f1701302 100644 --- a/en/misc/CHANGELOG.html +++ b/en/misc/CHANGELOG.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Changelog


v1.3 (10-10-2023)

Changed

  • Backend / CORS
  • Frontend / How to learn Vue?


v1.2 (28-09-2023)

New

  • Deployment / Github Actions

Changed

  • Deployment / CI/CD
  • Deployment / Stores - Vuex, Pinia and Composition API
  • Frontend / About frontend frameworks


v1.1 (15-09-2023)

New

  • Development / Stores

Changed

  • Development / Helpful hints.


v1.0 (11-09-2023)

New

  • Initial launch
- + \ No newline at end of file diff --git a/en/misc/cheat-sheets.html b/en/misc/cheat-sheets.html index e087b39c6..7660b5dca 100644 --- a/en/misc/cheat-sheets.html +++ b/en/misc/cheat-sheets.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@ - + \ No newline at end of file diff --git a/en/misc/contribute.html b/en/misc/contribute.html index 4af3b7f28..b1b23ca16 100644 --- a/en/misc/contribute.html +++ b/en/misc/contribute.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Contribute to the development of this FAQ

You can suggest corrections to any or add a new Q/A using the form below.

GitHub way of making changes (fork -> edit -> create PR) is also very welcome.

- + \ No newline at end of file diff --git a/en/misc/glossary.html b/en/misc/glossary.html index ad25a9de3..f4bdb636c 100644 --- a/en/misc/glossary.html +++ b/en/misc/glossary.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Glossary and abbreviations

  • DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc.
  • UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application.
  • UI (user interface) - website/application design from the point of view of visual aesthetics and style.
  • SW (service worker) - Service Worker (PWA element)
  • AT (access token) - JWT authentication token
  • RT (refresh token) - JWT authentication token
- + \ No newline at end of file diff --git a/en/misc/introduction.html b/en/misc/introduction.html index 849617f01..0f1a8d766 100644 --- a/en/misc/introduction.html +++ b/en/misc/introduction.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Introduction

This FAQ (Frequently Asked Questions) is created on the most frequently touched topics in Reddit r/vuejs/ and Telegram chat @vuejs_ru.

The level of questions and answers covers both beginners and experienced frontend developers.

As answers are used both generally recognized, verified and objective information, and subjective opinion of the author.

The increase in complexity does not come from the top down. The first questions and answers describe non-obvious points that may be interesting for experienced programmers.

The main sources of information - official documentation of Vue 3 and Vite, r/vuejs/, @vuejs_ru.

Relevance of the information - 2022-2023 years.


About the author:

Ruslan Makarov - independent consultant, full-stack engineer with 20+ years of experience in SD, AWS Certified Solutions Architect, Sun Certified Java Developer.

- + \ No newline at end of file diff --git a/en/test.html b/en/test.html index d4a711dad..e2d77fd55 100644 --- a/en/test.html +++ b/en/test.html @@ -7,10 +7,10 @@ - + - + @@ -26,7 +26,7 @@
Skip to content

Vue FAQ

Vue JavaScript framework FAQ

Most frequently asked questions about Vue.js

Vue FAQ
- + \ No newline at end of file diff --git a/frontend/about-frameworks.html b/frontend/about-frameworks.html index 20bbbc4cc..fe1e148d2 100644 --- a/frontend/about-frameworks.html +++ b/frontend/about-frameworks.html @@ -7,10 +7,10 @@ - + - + @@ -41,7 +41,7 @@ // Vue someArr.value.push(newItem.value);

Использование нативного ES6 объекта Proxy позволяет избежать декомпозиции и создания промежуточного массива. Также это более производительное решение.

- + \ No newline at end of file diff --git a/frontend/architecture.html b/frontend/architecture.html index cd8127c69..fb17963d7 100644 --- a/frontend/architecture.html +++ b/frontend/architecture.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Архитектура фронтэнд приложений

Что такое хорошая архитектура веб-приложения

Есть разные теоретические определения и обоснования данного понятия, но грубо говоря это следующее.

Допустим ты разрабатываешь проект, уже на финальном этапе. К тебе подходит заказчик и говорит что-то типа: я хочу добавить тень ко всем кнопкам, я хочу изменить UI библиотеку, мы решили поддерживать несколько языков, мы решили заменить вот этот модуль на другой, нужно сделать более детальную адаптивность для разных разрешений, мы решили добавить темы, мы меняем провайдера услуг по обработке платежей, у нас повышается число пользователей / сайт тормозит / надо его ускорить, надо повысить уровень безопасности сайта, мы взяли мидл программиста, введи его в курс дела быстро, и пусть он добавляет функционал или фиксит баги и т.п.

Хорошая архитектура фронтенд приложения позволяет выполнить всё это наиболее эффективно с наименьшими затратами.

ООП на фронтенде

Многие приходя из разработки на объектно-ориентированных языках пытаются использовать концепции ООП и на фронте и программировать с классами, наследованием, полиморфизмом и прочим.

Это ошибка. Основные вычисления на фронте связаны с UI - показ данных, обработка взаимодействия с пользователем. Системы классов и микросервисов на них просто не нужны. Конечно, можно создать базовую кнопку, обернуть ее в два кастомных компонента и считать это наследованием, но в коде этого не получается. Поэтому надо учиться мыслить другими категориями - компоненты, композаблы, js модули. И использовать свою мощь JavaScript-a, а не пытаться натянуть его на ООП.

В то же время неплохой аналогией объекта с глобальным ("статичным") и локальным ("объектным") состоянием является композабл функция. Это можно использовать в определённых ситуациях.

Подходящая архитектура для Vue 3 веб-приложения

Самая удобная архитектура для Vue 3 приложения - модульная.

Изначально, приложение разбивается на логические модули, слабо связанные друг с другом. Например, для онлайн магазина это могут быть модуль каталога товаров, модуль отдельного товара, модуль личного кабинета / аккаунта пользователя.

Кроме того, есть модуль оболочки - то, что иногда называет app shell. Шаблон с хедером, футером, боковым меню и главным окном. В этот модуль целесообразно поместить утилиты и ресурсы, используемые по всему приложению - например, api, useI18n, BaseButton и stringHelpers.

В каждом модуле свои components, composables, assets, utils; возможно, api, routes, views, layouts.

Слабая связанность позволяет разрабатывать каждый модуль достаточно независимо, что значительно повышает вероятность успешности проекта.

Полезные советы
Избегайте зависимостей

Если есть возможность не вводить новую зависимость (не подключать новый npm пакет) - не делайте это. Это может немного сэкономит ваше время, но сторонняя библиотека рано или поздно устареет, перестанет поддерживаться, в ней могут обнаружить уязвимость. Кроме того она увеличивает размер вашего бандла, что напрямую влияет на производительность вашего приложения. Tree shaking хорош в рекламных зазываниях, но работает реально далеко не всегда.

Если вам нужна, например, функция debounce, не торопитесь подключать её вместе с какой-либо библиотекой. Загуглите её реализацию и скопируйте 15 строк кода, сделав свою функцию.


Используйте обертки над компонентами UI библиотек и сторонних утилит

Если вы используете компоненты какой-то UI библиотеки, не используйте их напрямую - сделайте обертки для них. Например, BaseButton или BaseInput. Это намного облегчит стилизацию компонент, а также сильно упростит переход на другую библиотеку, или замену на свои компоненты.

То же самое с утилитами.


Регулярный рефакторинг

Время от времени делайте рефакторинг кода, перемещая компоненты и модули туда, где они должны быть логически, переименовывая их, и структурируя и улучшая сам код. Это полезно и для кода, и для вашего профессионального роста.


Используйте CSS3

Старайтесь использовать для адаптивноcти чистый CSS3. Не привязывайтесь к колоночным моделям CSS и UI библиотек, если только это не проект из разряда: "сделал и забыл, пусть заказчик дальше с ним мучается".

Потратьте пару дней на изучение Флексбокса и вы сможете верстать на нём быстрей и лучше, чем на любом Тайлвинде.


Используйте современные стандарты и возможности языков

Например, семантические элементы HTML5 - aside, header, section, article, details и.т.д.

CSS3 - Flexbox и Grid, Container query


Документируйте проект

Рисуйте use-case и другие диаграммы, описывайте основной функционал проекта и важные детали его реализации - это как минимум повысит ваш уровень как разработчика ПО.

VitePress - очень удобный инструмент для технического документирования.

- + \ No newline at end of file diff --git a/frontend/css-ui-libs.html b/frontend/css-ui-libs.html index 2d0bc0ca1..2f73f203f 100644 --- a/frontend/css-ui-libs.html +++ b/frontend/css-ui-libs.html @@ -7,10 +7,10 @@ - + - + @@ -33,7 +33,7 @@ <template> <QButton ... /> </template>

и используйте в своем коде BaseButton. Таким образом в дальнейшем вам будет намного проще проапгрейдиться, заменить библиотеку или заменить данный компонент на самописный. И даже просто изменить у компонента стили.

Лэйаут и адаптивность страниц средствами CSS и UI библиотек

Использование колоночной системы и иного функционала CSS и UI библиотек типа распространенного Tailwind удобно для небольших проектов и иногда ускоряет верстку, однако очень сильно ухудшает качество кода в целом, включая его поддерживаемость и расширяемость. Как будто мир вновь вернулся во времена IE6, когда все стили и JavaScript также располагались в аттрибутах тэгов, и вся эволюция CSS в понятную, удобную, красивую иерарxичную модель классов была зря, как и разделение веба на документ (шаблон), презентационный слой (CSS стили) и логику (JavaScript).

В интернете полно статей, почему подход подобный Tailwind это плохо. Можно отметить только, что при должном умении верстать на чистом CSS3 также быстро и намного удобней и приятней в плане DX, чем через средства CSS и UI библиотек.

Цитата

Хорошие разработчики знают причины, по которым стандарты, паттерны и хорошие практики стали таковыми.

Плохие разработчики придерживаются любой новой тенденции, которая может сэкономить им немного времени на обучение.

- + \ No newline at end of file diff --git a/frontend/learning.html b/frontend/learning.html index df15c798c..aa4054631 100644 --- a/frontend/learning.html +++ b/frontend/learning.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Изучение Vue

Источники информации по Vue

Почему-то считается, что на фронтенде есть всего два варианта получать знания - документация Vue и обучающие видео с Ютюба и всевозможных курсов.

Но документация это не учебник, а справочник, и отделить зерна от плевел на Ютюбе очень сложно. Я встречал полезные видео, но все они предназначались для уже неплохо знающих Vue разработчиков, и показывали какие-то новые или нестандартные моменты.


Главным учителем должна быть книга, которая именно учит, а не даёт справочную информацию.

Прекрасный учебник по Vue на английском языке - вышедшая в мае 2023 года Vue.js 3 Design Patterns and Best Practices. Можно зарегистрироваться на oReilly и читать 10 дней бесплатно. Даже скачать. Несмотря на название, книга учит именно программированию, причем, довольно с таки начального уровня.

Примеры из книги находятся в открытом доступе и вполне достойны изучения.

На русском, к сожалению, почти ничего нет, но, во-первых, есть Google translate, а во-вторых, стать уверенным разработчиком без хотя бы среднего знания технического английского вряд ли получится.

Так же надо отметить, что документация Vue на русском порой сильно отстает от документации на английском.

Vue 2 или Vue 3?

Vue 3.
Composition API.

Если вам нужен будет Vue 2 для поддержки существующего проекта, то вы сами будете знать ответ на этот вопрос.

Разница между Vue 2 и Vue 3 большая. Это не тот случай, когда надо выучить предварительно предыдущую версию, чтобы лучше и легче понять следующую.

Нужно ли знать JavaScript предварительно?

Обязательно, минимум на среднем уровне. Если этого нет, я бы предложил сперва пройти короткий курс javascript-a, чтобы человек знал об объекте document, умел обращаться с методами массива и не очень боялся промисов. Также, HTML и CSS как минимум на базовом уровне.

Вот легко читаемая книжка - "Морган Н. - JavaScript для детей. Самоучитель по программированию - 2016. Перед началом изучения Vue желательно понимать 70% первой части, а также параграфы 10 и 12.

Также классический ресурс по JavaScript - learn.javascript.ru

70 вопросов по JavaScript для подготовки к собеседованию - отличный тест, проверить себя по знанию языка.


Совет

Также абсолютно необходимый предварительный скилл - умение гуглить.

Есть ли сертификация по Vue?

Vue.js Certification

Vue Style Guide

Обязательно ознакомьтесь с Vue Style Guide и старайтесь придерживаться его лучших практик при написании кода.

Время от времени возвращайтесь к этому источнику и улучшайте свой код.

ESlint также помогает держать свой код в соответствии с лучшими практиками.

Нужен ли ментор?

Ментор полезен и начинающему, и опытному разработчику. Можно бесполезно убить два дня на решение проблемы, которую за 20 минут может объяснить более опытный человек. Причем, этот двухдневный "опыт" больше никогда не пригодится.

В компаниях эту роль обычно выполняют более компетентные доброжелательные коллеги.

В интернете есть сервисы типа Solvery, которые могут помочь в этом вопросе.

Всё равно хочу видео

Есть качественные у Vue Mastery, однако большинство устарели.

Что еще посмотреть кроме Vue? React?

Можно и React, если есть реальный вариант использования этих знаний, однако намного лучше расширить свой кругозор разработчика. Попробуйте написать простой API на бэкенде. Самый легкий и удобный язык для этого - PHP, но можно и на Node.js или Python. Попробуйте транспортные протоколы JSON-RPC и WebSockets. Захостите свое приложение на GitHub Pages или другой аналогичный сервис, поэкспериментируйте с GitHub Actions - они очень помогают с автоматизацией деплоя и CI/CD в целом. Поработайте с Cloud провайдерами (многие предлагают бесплатные ресурсы), настройте виртуальный сервер. Зарегистрируйте домен, сделайте продуктовый законченный сайт - даже если это будет просто ваш сайт-резюме или что-то элементарное на VitePress (используется данным сайтом). Поработайте с FireStore и открытыми API для различных данных. Посмотрите Swagger. Поизучайте SQL, установите MySQL и поиграйте с ним, либо сделайте это на SupaBase. Понимание, как данные хранятся и обрабатываются на бэкенде, сильно поможет в выборе правильных стратегий на фронте.

Изучайте, как работает современный Интернет, и какие технологии и лучшие практики распространены в нем сейчас.

- + \ No newline at end of file diff --git a/frontend/spa-pwa-ssr-ssg.html b/frontend/spa-pwa-ssr-ssg.html index c455ad74d..3a17418f7 100644 --- a/frontend/spa-pwa-ssr-ssg.html +++ b/frontend/spa-pwa-ssr-ssg.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

SPA, PWA, SSG, SSR и SEO

Web 1.0 -> Web 2.0

Сперва был статичный HTML и браузеры показывали его. Чуть позже придумали немножко JavaScript-а, чтобы обрабатывать формочки и делать небольшую анимацию. Потом появился CSS, и все увидели, что это красиво. После кто-то предложил идею JSON для формата данных, а затем Микрософт подарила миру XMLHttpRequest, и JavaScript-у разрешили отправлять и получать данные с сервера.

Так родился SPA.

SPA

SPA (Single Page Application) работает примерно как обычное десктоп/мобильное приложение - при первом обращении на сервер получает програмную оболочку, необходимую для отображения сайта, а затем уже пересылает на/с сервера данные, обычно в JSON формате. Так получается намного эффективней способа, когда с каждым запросом с сервера приходила новая HTML страница с всеми ресурсами.

Для пользователя UX повышается значительно.

spa-vs-mpa

PWA

PWA (Progressive Web Application) - еще один шаг, чтобы улучшить пользовательский опыт и максимально приблизить веб приложения по ощущениям пользователя к нативным.

При PWA к SPA добавляются два элемента:

  1. Манифест. Текстовый файл со свойствами приложения. Благодаря ему иконка веб-приложения может быть установлена также как и у нативных приложений на домашний экран смартфона. Кроме того, при запуске PWA может не показывать элементы браузера и казаться обычным приложением.

  2. Service worker. Это прослойка в браузере между сервером и самим браузером, которая позволяет сделать управляемое кэширование. Другими словами, сохранить приложение со всеми ресурсами на смартфоне/компьютере, чтобы при запуске оно сразу запускалось. Если не нужны данные с сервера, то приложение может работать оффлайн (например, Заметки).

Больше о PWA можно прочесть на сайте, созданном командой Chrome - https://web.dev/

Апгрейд SPA до PWA очень небольшой по трудозатратам, но очень значительный по выгоде. Разрабатывать SPA и не делать его PWA - это как снять люксовый номер в гостинице, но лечь спать на его входе в коридоре на коврике, потому что до спальни лень дойти.

PWA -> Workbox и vite-plugin-pwa

Манифест и Service worker настолько просты, что создание обертки над SW - Workbox, и плагина для Vite vite-plugin-pwa логическому объяснению не поддается. Кода получается в несколько раз больше, нужно грузить дополнительные зависимости и разбираться в конфигурациях оберток. Простое сделали сложным.

Лучше задействовать Манифест и Service worker как они созданы изначально, и написать два этих простых файла по шаблонам из спецификаций.

SSG

SSG (Static Site Generation) — подход, когда содержимое сайта предварительно генерируется в html-файлы, которые потом раздаются с сервера.

Сразу подходит для индексации поисковиками.

SSR

SSR (Server Side Rendering), способ генерации html на стороне сервера, когда генерация происходит в момент обращения. После запроса клиентом странички, сервер на своей стороне выполняет API-запросы, а затем формирует html-страницу. Соответственно, на сервере нужен Node.js сервер, который довольно сильно нагружает "железо".

Кроме того, есть множество ограничений при написании кода и использования тех или иных JavaScript и Vue возможностей. Как пишет Google относительно SSR - "A rehydration problem: one app for the price of two".

SEO оптимизация

Для того, чтобы поисковик мог проиндексировать страницу вашего сайта, при обращении к ней он должен получить HTML с контентом (текст, картинки, видео). Со SPA сайтами, в которых контент подгружается динамически JavaScript-ом, такое часто не получается.

Самым популярным и неэффективным методом для обхода этого является использование SSR (SSG подходит для несложных по структуре сайтов без бэкенда, вроде документаций).

Google позволяет посмотреть, как ваш сайт выглядит/индексируется его кроулером, который как-то всё-таки работает со скриптами, поэтому для начала проверьте, нужно ли вам усложняться вообще.

Если проблемы обнаружились, то можно воспользоваться динамической отрисовкой

dynamic-rendering

Смысл в том, чтобы обрабатывать запросы обычных пользователей и поисковых ботов по-разному и отдавать им разные страницы. Для пользователей - SPA, для поисковиков - сгенеренные налету либо заранее страницы. Распределение может вести вебсервер или точка входа на ваш сайт (index.php вместо index.html).

На картинке выше подразумевается некий Prerenderer (которые тоже есть в качестве стороннего сервиса или своего решения), однако в большинстве случаев намного проще генерить HTML страницу для бота напрямую.

То есть, например, для страницы товара в онлайн магазине это может быть его текстовое описание с картинками и отзывами покупателей в любом HTML форматировании. Для этого достаточно скрипта на PHP/Express/Python и т.д. в 100-200 строк, что намного менее трудозатратней SSR решений, а так же снижает требования в серверному "железу" на порядки (вывод можно закэшировать в статичный HTML файл).

При совпадении фактического контента (текст, картинки) такой страницы с контентом SPA в браузере, Google не рассматривает упрощенную для его бота версию как обман. Данная метода была еще до появления всяких SSR. Проверено многолетним использованием.

PageSpeed и другие тесты производительности

PageSpeed и подобные инструменты очень полезны в выявлении неоптимизированных мест в вашем веб-приложении, однако для SPA и PWA он не совсем верен.

Точней, некоторые его метрики не учитывают UX в целом. Нормально сделанный PWA при самой первой загрузке и установке, конечно, проиграет по FCP метрике аналогу на SSR, но после размещения всех своих ресурсов локально на браузере клиента, никакой SSR и близко не сравнится с ним по скорости работы и комфорту для пользователя, не говоря уже о прочих возможностях типа оффлайн работы и установке как нативного приложения.

SSR может быть, наверное, полезен для каких-то исключительных случаев, но в целом он выглядит тупиковой ветвью во фронтенд разработке.

- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 85c834fe3..f1d7d4da1 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"backend_api.md":"0d5fd0ff","backend_protocols.md":"0cc4b484","backend_backend.md":"cd4af13a","backend_cors.md":"e41540f2","backend_auth.md":"e24d02e6","development_building.md":"655c7971","book_ru_not-implemented.md":"47aa48a7","deployment_docker.md":"e7a454f2","deployment_hosting.md":"a5a8414c","development_assets.md":"1a26ad88","en_index.md":"694fb854","en_misc_changelog.md":"8e99c206","en_misc_cheat-sheets.md":"2f7e08aa","en_misc_contribute.md":"4d8993c9","en_misc_glossary.md":"92f1b346","en_misc_introduction.md":"36fab7ae","en_test.md":"00111351","frontend_about-frameworks.md":"83a19cb6","frontend_architecture.md":"7504ae95","frontend_css-ui-libs.md":"8de6f828","frontend_learning.md":"9eed980a","index.md":"4594568c","misc_changelog.md":"34856e29","deployment_ci-cd.md":"c378a97e","deployment_github-actions.md":"2ac572ba","misc_glossary.md":"efe359e4","misc_introduction.md":"9589e94b","book_ru_index.md":"99eee03a","development_libraries.md":"fd9dc5c7","development_stores.md":"81c5e707","development_testing.md":"d1a478a4","development_ide.md":"e6b23d9d","en_backend_auth.md":"19bc5e2b","en_backend_backend.md":"3daab805","en_backend_cors.md":"52784d51","en_backend_protocols.md":"67330a25","en_deployment_ci-cd.md":"f2ccafcb","en_deployment_docker.md":"d9782a92","en_development_assets.md":"7778ce8a","en_development_building.md":"815b5ec2","en_backend_api.md":"9805d7f4","frontend_spa-pwa-ssr-ssg.md":"dceac47b","en_development_ide.md":"2d80d217","en_development_libraries.md":"b61a8ff0","en_development_misc.md":"4421ea66","en_frontend_learning.md":"54c422a7","en_development_stores.md":"07e18e88","en_development_testing.md":"d1eef49f","en_frontend_about-frameworks.md":"79abd1ac","en_frontend_architecture.md":"05962237","en_frontend_css-ui-libs.md":"5a7d873f","development_misc.md":"3d167aa1","misc_cheat-sheets.md":"c82a4fc8","book_ru_chapter 1_ the vue 3 framework.md":"0b158311","en_deployment_github-actions.md":"5b187627","en_deployment_hosting.md":"d7312fec","misc_contribute.md":"a56224e5","en_frontend_spa-pwa-ssr-ssg.md":"605cd8f8"} +{"backend_cors.md":"e41540f2","backend_protocols.md":"0cc4b484","backend_api.md":"0d5fd0ff","backend_auth.md":"e24d02e6","backend_backend.md":"cd4af13a","book_ru_chapter 1_ the vue 3 framework.md":"0b158311","book_ru_not-implemented.md":"47aa48a7","book_ru_index.md":"a0d63a87","book_ru_summary.md":"6874318f","deployment_ci-cd.md":"c378a97e","book_ru_chapter 2_ software design principles and patterns.md":"a02b71d5","deployment_docker.md":"e7a454f2","deployment_github-actions.md":"2ac572ba","deployment_hosting.md":"a5a8414c","development_misc.md":"3d167aa1","development_libraries.md":"fd9dc5c7","development_testing.md":"d1a478a4","en_backend_api.md":"9805d7f4","en_development_stores.md":"07e18e88","en_development_testing.md":"d1eef49f","en_frontend_about-frameworks.md":"79abd1ac","en_frontend_architecture.md":"05962237","en_frontend_css-ui-libs.md":"5a7d873f","en_frontend_spa-pwa-ssr-ssg.md":"605cd8f8","en_frontend_learning.md":"54c422a7","en_index.md":"694fb854","en_misc_changelog.md":"8e99c206","en_misc_contribute.md":"4d8993c9","en_misc_introduction.md":"36fab7ae","en_misc_cheat-sheets.md":"2f7e08aa","en_test.md":"00111351","en_misc_glossary.md":"92f1b346","frontend_about-frameworks.md":"83a19cb6","frontend_architecture.md":"7504ae95","frontend_css-ui-libs.md":"8de6f828","frontend_spa-pwa-ssr-ssg.md":"dceac47b","index.md":"4594568c","frontend_learning.md":"9eed980a","misc_changelog.md":"34856e29","misc_cheat-sheets.md":"c82a4fc8","misc_contribute.md":"a56224e5","misc_glossary.md":"efe359e4","misc_introduction.md":"9589e94b","en_backend_auth.md":"19bc5e2b","en_backend_cors.md":"52784d51","development_assets.md":"1a26ad88","en_backend_backend.md":"3daab805","en_backend_protocols.md":"67330a25","en_deployment_hosting.md":"d7312fec","en_deployment_docker.md":"d9782a92","en_deployment_ci-cd.md":"f2ccafcb","en_development_ide.md":"2d80d217","development_building.md":"655c7971","development_ide.md":"e6b23d9d","en_development_libraries.md":"b61a8ff0","en_development_assets.md":"7778ce8a","en_deployment_github-actions.md":"5b187627","en_development_misc.md":"4421ea66","development_stores.md":"81c5e707","en_development_building.md":"815b5ec2"} diff --git a/index.html b/index.html index 33407948a..3007547dc 100644 --- a/index.html +++ b/index.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Vue FAQ

Vue JavaScript framework FAQ

Наиболее часто задаваемые вопросы по Vue.js

Vue FAQ
- + \ No newline at end of file diff --git a/misc/CHANGELOG.html b/misc/CHANGELOG.html index 6b90c36bd..de94cdf76 100644 --- a/misc/CHANGELOG.html +++ b/misc/CHANGELOG.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

История изменений


v1.3 (10-10-2023)

Изменено

  • Общение с бэкендом / CORS
  • Фронтенд / Как изучать Vue?


v1.2 (27-09-2023)

Новое

  • Деплой на сервере / Github Actions

Изменено

  • Деплой на сервере / CI/CD
  • Разработка / Сторы - Vuex, Pinia и Composition API
  • Фронтенд / О фронтенд фреймворках
  • Несущественные изменения и исправление ошибок в разных разделах


v1.1 (15-09-2023)

Новое

  • Разработка / Сторы

Изменено

  • Разработка / Полезные советы


v1.0 (11-09-2023)

Новое

  • Начальный запуск
- + \ No newline at end of file diff --git a/misc/cheat-sheets.html b/misc/cheat-sheets.html index eed704743..0fa084a72 100644 --- a/misc/cheat-sheets.html +++ b/misc/cheat-sheets.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content
- + \ No newline at end of file diff --git a/misc/contribute.html b/misc/contribute.html index f95b27588..ffc81ba20 100644 --- a/misc/contribute.html +++ b/misc/contribute.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Внесите лепту в развитие данного FAQ

Вы можете предложить корректировку любого или добавление нового вопроса-ответа используя форму ниже.

GitHub way внесения изменений (fork -> edit -> create PR) также всячески приветствуется.

- + \ No newline at end of file diff --git a/misc/glossary.html b/misc/glossary.html index 44bd90db3..f6209ea3e 100644 --- a/misc/glossary.html +++ b/misc/glossary.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Глоссарий и сокращения

  • DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п.
  • UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением.
  • UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля
  • SW (service worker) - сервис воркер (элемент PWA)
  • AT (access token) - токен при JWT аутентификации
  • RT (refresh token) - токен при JWT аутентификации
- + \ No newline at end of file diff --git a/misc/introduction.html b/misc/introduction.html index 42830382e..f99d32539 100644 --- a/misc/introduction.html +++ b/misc/introduction.html @@ -7,10 +7,10 @@ - + - + @@ -27,7 +27,7 @@
Skip to content

Предисловие

Данный FAQ (Frequently Asked Questions - Часто задаваемые вопросы) создан по наиболее часто затрагиваемым темам в Reddit r/vuejs/ и Телеграм чате @vuejs_ru

Уровень вопросов и ответов охватывает как начинающих так и опытных фронтэнд разработчиков.

В качестве ответов используется как общепризнанная, проверенная и объективная информация, так и субъективное мнение составителя.

Повышение сложности не идет сверху вниз. И в первых вопросах-ответах описываются неочевидные моменты, могущие быть интересными для опытных программистов.

Основные источники информации - официальная документация Vue 3 и Vite, r/vuejs/, @vuejs_ru

Актуальность информации - 2022-2023 года.

- + \ No newline at end of file