Давайте вторую базу данных с именем "animals", а также реплики для обоих баз данных. Для этого нам нужно изменить конфигурацию config/database.yml
из 2-уровневой в 3-уровневую.
При использовании нескольких баз данных есть ряд важных настроек.
Во-вторых, имя пользователя для пишущей базы и реплики должно быть различным, и права пользователя реплики базы данных должны быть установлены только для чтения, но не для записи.
Теперь, когда у нас есть новая база данных, давайте настроим модель соединения. Чтобы использовать новую базу данных, нам нужно создать новый абстрактный класс и соединить с базами данных животных.
-
class AnimalsRecord < ApplicationRecord
+При использовании нескольких баз данных есть ряд важных настроек.
Во-первых, имя базы данных для primary
и primary_replica
должно быть тем же самым, так как они содержат те же самые данные. То же самое для animals
и animals_replica
.
Во-вторых, имя пользователя для пишущей базы и реплики должно быть различным, и права пользователя реплики базы данных должны быть установлены только для чтения, но не для записи.
При использовании реплики базы данных нужно добавить запись replica: true
для реплики в config/database.yml
. Это нужно, потому что в противном случае Rails не сможет узнать, какая из них реплика, а какая пишущая. Rails не будет запускать определенные задачи, такие как миграции, на репликах.
Наконец, для новой пишущей базы данных необходимо установить в ключе migrations_paths
директорию, в которой вы будете хранить миграции для этой базы данных. Мы рассмотрим migrations_paths
позже в этом руководстве.
Вы также можете настроить файл дампа схемы, установив schema_dump
на имя файла пользовательской схемы или полностью пропустить дамп схемы, установив schema_dump: false
.
Теперь, когда у нас есть новая база данных, давайте настроим модель соединения.
Основную реплику базы данных можно настроить в ApplicationRecord
следующим образом:
+
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
- connects_to database: { writing: :animals, reading: :animals_replica }
+ connects_to database: { writing: :primary, reading: :primary_replica }
end
-Затем нужно обновить ApplicationRecord
, чтобы он знал о нашей реплике.
-
class ApplicationRecord < ActiveRecord::Base
- self.abstract_class = true
+При использовании по-другому названного класса в вашем приложении необходимо вместо этого установить primary_abstract_class
, таким образом Rails будет знать, с каким классом должен делиться соединением ActiveRecord::Base
.
+
class PrimaryApplicationRecord < ActiveRecord::Base
+ primary_abstract_class
connects_to database: { writing: :primary, reading: :primary_replica }
end
-При использовании по-другому названного класса в вашем приложении необходимо вместо этого установить primary_abstract_class
, таким образом Rails будет знать, с каким классом должен делиться соединением ActiveRecord::Base
.
-
class PrimaryApplicationRecord < ActiveRecord::Base
- self.primary_abstract_class = true
+В этом случае классы, которые подключаются к primary
/primary_replica
, могут наследоваться от вашего основного абстрактного класса, так же как стандартные приложения Rails делают это с помощью ApplicationRecord
.
+
class Person < PrimaryApplicationRecord
+end
+
+
+С другой стороны, нам нужно настроить наши модели, сохраняемые в базе данных "animals":
+
class AnimalsRecord < ApplicationRecord
+ self.abstract_class = true
+
+ connects_to database: { writing: :animals, reading: :animals_replica }
end
-Классы, соединяющиеся к primary/primary_replica могут наследоваться от вашего основного абстрактного класса, как в стандартных приложениях Rails:
-
class Person < ApplicationRecord
+Эти модели должны наследоваться от этого общего абстрактного класса:
+
class Car < AnimalsRecord
+ # Автоматически общается с базой данных animals.
end
@@ -276,36 +284,38 @@
-Важно, что нужно соединяться с базой данных в единственной модели, а затем наследоваться от этой модели, а не соединять несколько отдельных моделей с той же самой базой данных. У клиентов базы данных есть ограничение на количество доступных открытых соединений, и, если вы сделаете так, это умножит количество соединений, так как Rails использует имя класса модели в качестве имени спецификации соединения.
Теперь, когда у нас есть database.yml
, и настроена новая модель, пришло время создать базы данных. Rails 6.0 поставляется со всеми задачами rails, нужными для использования нескольких баз данных в Rails.
Можно запустить bin/rails -T
для просмотра всех заданий, которые можно выполнить. Вы должны увидеть следующее:
-
$ bin/rails -T
-rails db:create # Creates the database from DATABASE_URL or config/database.yml for the ...
-rails db:create:animals # Create animals database for current environment
-rails db:create:primary # Create primary database for current environment
-rails db:drop # Drops the database from DATABASE_URL or config/database.yml for the cu...
-rails db:drop:animals # Drop animals database for current environment
-rails db:drop:primary # Drop primary database for current environment
-rails db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)
-rails db:migrate:animals # Migrate animals database for current environment
-rails db:migrate:primary # Migrate primary database for current environment
-rails db:migrate:status # Display status of migrations
-rails db:migrate:status:animals # Display status of migrations for animals database
-rails db:migrate:status:primary # Display status of migrations for primary database
-rails db:reset # Drops and recreates all databases from their schema for the current environment and loads the seeds
-rails db:reset:animals # Drops and recreates the animals database from its schema for the current environment and loads the seeds
-rails db:reset:primary # Drops and recreates the primary database from its schema for the current environment and loads the seeds
-rails db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n)
-rails db:rollback:animals # Rollback animals database for current environment (specify steps w/ STEP=n)
-rails db:rollback:primary # Rollback primary database for current environment (specify steps w/ STEP=n)
-rails db:schema:dump # Creates a database schema file (either db/schema.rb or db/structure.sql ...
-rails db:schema:dump:animals # Creates a database schema file (either db/schema.rb or db/structure.sql ...
-rails db:schema:dump:primary # Creates a db/schema.rb file that is portable against any DB supported ...
-rails db:schema:load # Loads a database schema file (either db/schema.rb or db/structure.sql ...
-rails db:schema:load:animals # Loads a database schema file (either db/schema.rb or db/structure.sql ...
-rails db:schema:load:primary # Loads a database schema file (either db/schema.rb or db/structure.sql ...
-rails db:setup # Creates all databases, loads all schemas, and initializes with the seed data (use db:reset to also drop all databases first)
-rails db:setup:animals # Creates the animals database, loads the schema, and initializes with the seed data (use db:reset:animals to also drop the database first)
-rails db:setup:primary # Creates the primary database, loads the schema, and initializes with the seed data (use db:reset:primary to also drop the database first)
-
+
Важно, что нужно соединяться с базой данных в единственной модели, а затем наследоваться от этой модели, а не соединять несколько отдельных моделей с той же самой базой данных. У клиентов базы данных есть ограничение на количество доступных открытых соединений, и, если вы сделаете так, это умножит количество соединений, так как Rails использует имя класса модели в качестве имени спецификации соединения.
Теперь, когда у нас есть config/database.yml
, и настроена новая модель, пришло время создать базы данных. Rails поставляется со всеми командами, нужными для использования нескольких баз данных.
Можно запустить bin/rails --help
для просмотра всех заданий, которые можно выполнить. Вы должны увидеть следующее:
+
$ bin/rails --help
+...
+db:create # Create the database from DATABASE_URL or config/database.yml for the ...
+db:create:animals # Create animals database for current environment
+db:create:primary # Create primary database for current environment
+db:drop # Drop the database from DATABASE_URL or config/database.yml for the cu...
+db:drop:animals # Drop animals database for current environment
+db:drop:primary # Drop primary database for current environment
+db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)
+db:migrate:animals # Migrate animals database for current environment
+db:migrate:primary # Migrate primary database for current environment
+db:migrate:status # Display status of migrations
+db:migrate:status:animals # Display status of migrations for animals database
+db:migrate:status:primary # Display status of migrations for primary database
+db:reset # Drop and recreates all databases from their schema for the current environment and loads the seeds
+db:reset:animals # Drop and recreates the animals database from its schema for the current environment and loads the seeds
+db:reset:primary # Drop and recreates the primary database from its schema for the current environment and loads the seeds
+db:rollback # Roll the schema back to the previous version (specify steps w/ STEP=n)
+db:rollback:animals # Rollback animals database for current environment (specify steps w/ STEP=n)
+db:rollback:primary # Rollback primary database for current environment (specify steps w/ STEP=n)
+db:schema:dump # Create a database schema file (either db/schema.rb or db/structure.sql ...
+db:schema:dump:animals # Create a database schema file (either db/schema.rb or db/structure.sql ...
+db:schema:dump:primary # Create a db/schema.rb file that is portable against any DB supported ...
+db:schema:load # Load a database schema file (either db/schema.rb or db/structure.sql ...
+db:schema:load:animals # Load a database schema file (either db/schema.rb or db/structure.sql ...
+db:schema:load:primary # Load a database schema file (either db/schema.rb or db/structure.sql ...
+db:setup # Create all databases, loads all schemas, and initializes with the seed data (use db:reset to also drop all databases first)
+db:setup:animals # Create the animals database, loads the schema, and initializes with the seed data (use db:reset:animals to also drop the database first)
+db:setup:primary # Create the primary database, loads the schema, and initializes with the seed data (use db:reset:primary to also drop the database first)
+...
+
Запуск команды bin/rails db:create
создаст и основную базу, и базу животных. Отметьте, что нет команды для создания пользователей базы данных, и вам нужно это сделать вручную для поддержки пользователей только для чтения в репликах. Если нужно создать базу животных, можно выполнить bin/rails db:create:animals
.
Если вы хотите соединиться с внешней базой данных без каких-либо задач управления базой данных, таких как управление схемой, миграции, сиды, и т.д., можно установить для базы данных конфигурационную настройку database_tasks: false
. По умолчанию она установлена как true.
production:
@@ -326,7 +336,7 @@
-
Будет создан класс с именем базы данных плюс Record
. В данном примере база данных Animals
, поэтому получаем AnimalsRecord
:
+
Будет создан класс с camelized именем базы данных плюс Record
. В данном примере база данных animals
, поэтому получаем AnimalsRecord
:
class AnimalsRecord < ApplicationRecord
self.abstract_class = true
@@ -339,12 +349,12 @@
-
Note: Так как Rails не знает, какая база данных является репликой для пишущей базы, необходимо это добавить в абстрактный класс по завершении.
Rails сгенерирует новый класс единожды. Он не будет переписан новыми скаффолдами или удален при удалении скаффолда.
Если у вас уже есть абстрактный класс, и его имя отличается от AnimalsRecord
, можно передать опцию --parent
для обозначения, что нужен иной абстрактный класс:
+
Так как Rails не знает, какая база данных является репликой для пишущей базы, необходимо это добавить в абстрактный класс по завершении.
Rails сгенерирует AnimalsRecord
единожды. Он не будет переписан новыми скаффолдами или удален при удалении скаффолда.
Если у вас уже есть абстрактный класс, и его имя отличается от AnimalsRecord
, можно передать опцию --parent
для обозначения, что нужен иной абстрактный класс:
$ bin/rails generate scaffold Dog name:string --database animals --parent Animals::Record
-
Это пропустит генерацию AnimalsRecord
, так как вы обозначили Rails, что хотите использовать другой родительский класс.
Наконец, чтобы использовать реплику только для чтения, нужно активировать промежуточную программу для автоматического переключения.
Автоматическое переключение позволяет приложению переключаться с пишущей базы на реплику или с реплики на пишущую, основываясь на методе HTTP, и того, была ли недавно запись запрашивающим пользователем.
Если приложение получает запрос POST, PUT, DELETE или PATCH, приложение автоматически будет писать в пишущую базу данных. За указанное время после записи, приложение будет читать из основной базы. Для запроса GET или HEAD приложение будет читать из реплики, если нет недавней записи.
Чтобы активировать промежуточную программу автоматического переключения соединений, можно запустить генератор автоматического переключения:
-
$ bin/rails g active_record:multi_db
+Это пропустит генерацию AnimalsRecord
, так как вы обозначили Rails, что хотите использовать другой родительский класс.
Наконец, чтобы использовать реплику только для чтения, нужно активировать промежуточную программу для автоматического переключения.
Автоматическое переключение позволяет приложению переключаться с пишущей базы на реплику или с реплики на пишущую, основываясь на методе HTTP, и того, была ли недавно запись запрашивающим пользователем.
Если приложение получает запрос POST, PUT, DELETE или PATCH, приложение автоматически будет писать в пишущую базу данных. Если запрос не относится к одному из перечисленных методов, но приложение недавно совершало запись, то дополнительно будет использована база данных для записи. Все остальные запросы будут использовать базу данных-реплику.
Чтобы активировать промежуточную программу автоматического переключения соединений, можно запустить генератор автоматического переключения:
+
$ bin/rails g active_record:multi_db
А затем раскомментируйте следующие строчки.
@@ -356,8 +366,27 @@
@@ -369,13 +398,13 @@ Имеется ряд случаев, когда хочется, чтобы приложение соединялось с пишущей базой или репликой, и автоматического переключения не достаточно. Например, вы знаете, что для определенного запроса нужно всегда отправлять запрос к реплике, даже если это в запросе POST.
Для этого Rails предоставляет метод connected_to
, который переключит на нужное вам соединение.
ActiveRecord::Base.connected_to(role: :reading) do
- # весь код в этом блоке будет соединен с ролью reading
+ # Весь код в этом блоке будет соединен с ролью reading.
end
"role" в вызове connected_to
ищет соединения, связанные с обработчиком этого соединения (или роли). Обработчик соединения reading
содержит все соединения, связанные с помощью connects_to
с именем роли reading
.
Отметьте, что connected_to
с ролью будет искать существующее соединение и переключать с помощью указанного имени соединения. Это означает, что, если вы передали неизвестную роль, наподобие connected_to(role: :nonexistent)
, то получите ошибку, сообщающую ActiveRecord::ConnectionNotEstablished (No connection pool with 'AnimalsBase' found for the 'nonexistent' role.)
Если хотите, чтобы Rails убедился, что любые выполняемые запросы только читают, передайте prevent_writes: true
. Это только предотвратит запросы, выглядящие как запись, от отправления в базу данных. Вы также должны настроить свою реплику базы данных запускаться в режиме только для чтения.
ActiveRecord::Base.connected_to(role: :reading, prevent_writes: true) do
- # Rails проверит каждый запрос, чтобы убедиться, что он читает
+ # Rails проверит каждый запрос, чтобы убедиться, что он читает.
end
@@ -391,46 +420,65 @@
Затем модели соединяются с помощью ключа shards
в API connects_to
:
class ApplicationRecord < ActiveRecord::Base
+ primary_abstract_class
+
+ connects_to database: { writing: :primary, reading: :primary_replica }
+end
+
+class ShardRecord < ApplicationRecord
self.abstract_class = true
connects_to shards: {
- default: { writing: :primary, reading: :primary_replica },
- shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica }
+ shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica },
+ shard_two: { writing: :primary_shard_two, reading: :primary_shard_two_replica }
}
end
-
Затем в моделях можно вручную переключать соединения с помощью API connected_to
. При использования шардинга должны быть переданы обе role
и shard
:
+
Если вы используете шардинг, убедитесь, что параметры migrations_paths
и schema_dump
остаются одинаковыми для всех шардов. При генерации миграции вы можете передать опцию --database
и использовать одно из имен шардов. Поскольку все они указывают на один и тот же путь, не имеет значения, какой из них вы выберете.
+
$ bin/rails g scaffold Dog name:string --database primary_shard_one
+
+
+
Затем в моделях можно вручную переключать шарды с помощью API connected_to
. При использования шардинга должны быть переданы обе role
и shard
:
ActiveRecord::Base.connected_to(role: :writing, shard: :default) do
- @id = Person.create! # Создаст запись в shard default
+ @id = Person.create! # Создаст запись в шард с именем ":default".
end
ActiveRecord::Base.connected_to(role: :writing, shard: :shard_one) do
Person.find(@id) # Не найдет запись, не существует, так как было создано
- # в shard default
+ # в шарде с именем ":default".
end
API горизонтального шардинга также поддерживает чтение из реплик. Можно переключить роли и шард с помощью API connected_to
.
ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do
- Person.first # Ищет запись в реплике shard one
+ Person.first # Ищет запись в реплике shard one.
end
Приложения могут автоматически переключать шарды для запроса с помощью предоставленной промежуточной программы.
Промежуточная программа ShardSelector
предоставляет фреймворк для автоматического переключения шардов. Rails предоставляет базовый фреймворк для определения, на какой шард переключиться, и позволяет по необходимости писать в приложениях пользовательские стратегии для переключения.
ShardSelector
принимает ряд опций (в настоящее время поддерживается только lock
), которые могут быть использованы промежуточной программой для изменения поведения. lock
по умолчанию true, и запретит запросу переключать шарды пока внутри блока. Если lock
false, то переключение шарда будет разрешено.
Для шардинга, основанного на tenant, lock
должен всегда быть true для предотвращения кода приложения от ошибочного переключения между tenant.
Тот же генератор, что и для выбора базы данных, может быть использован для генерации файла для автоматического переключения шарда:
-
$ bin/rails g active_record:multi_db
+ $ bin/rails g active_record:multi_db
-
Затем в файле раскомментируйте следующее:
+
Затем в сгенерированном config/initializers/multi_db.rb
раскомментируйте следующее:
Rails.application.configure do
config.active_record.shard_selector = { lock: true }
config.active_record.shard_resolver = ->(request) { Tenant.find_by!(host: request.host).shard }
@@ -445,25 +493,28 @@ 8. Гранулированное переключение соединения с базой данных
В Rails 6.1 возможно переключать соединения для одной базы данных вместо глобального для всех баз данных.
С гранулированным переключением соединения с базой данных, любой абстрактный класс будет способен переключать соединения, не затрагивая другие соединения. Это полезно для переключения запросов AnimalsRecord
на чтение из реплики, в то время как запросы ApplicationRecord
идут в основную базу.
+
Начиная с Rails 6.1, возможно переключать соединения для одной базы данных вместо глобального для всех баз данных.
С гранулированным переключением соединения с базой данных, любой абстрактный класс будет способен переключать соединения, не затрагивая другие соединения. Это полезно для переключения запросов AnimalsRecord
на чтение из реплики, в то время как запросы ApplicationRecord
идут в основную базу.
AnimalsRecord.connected_to(role: :reading) do
- Dog.first # Читает из animals_replica
- Person.first # Читает из primary
+ Dog.first # Читает из animals_replica.
+ Person.first # Читает из primary.
end
Также возможно гранулировано менять соединения для шардов.
AnimalsRecord.connected_to(role: :reading, shard: :shard_one) do
- Dog.first # Прочитает из shard_one_replica. Если не существует соединения
- # для shard_one_replica, будет вызвана ошибка ConnectionNotEstablished
- Person.first # Прочитает из основной пишущей базы
+ # Прочитает из shard_one_replica. Если не существует соединения для shard_one_replica,
+ # будет вызвана ошибка ConnectionNotEstablished.
+ Dog.first
+
+ # Прочитает из основной пишущей базы.
+ Person.first
end
Чтоб переключить только основной кластер базы данных, используйте ApplicationRecord
:
ApplicationRecord.connected_to(role: :reading, shard: :shard_one) do
- Person.first # Читает из primary_shard_one_replica
- Dog.first # Читает из animals_primary
+ Person.first # Читает из primary_shard_one_replica.
+ Dog.first # Читает из animals_primary.
end
@@ -496,9 +547,10 @@
8.2. Кэширование схемы
Если вы хотите загрузить кэш схемы для каждой базы данных, вам нужно установить schema_cache_path
в каждой конфигурации базы данных и установить config.active_record.lazily_load_schema_cache = true
в конфигурации приложения. Отметьте, что это лениво загрузит кэш при установлении соединений с базами данных.
Rails также не поддерживает автоматическую нагрузочную балансировку реплик. Это очень зависит от вашей инфраструктуры. В будущем может быть будет реализована базовая, примитивная нагрузочная балансировка, но для масштабирования приложения должно быть что-то, что управляет вашим приложением вне Rails.
+
Есть ряд важных вещей, которые нужно знать об этой опции:
- Может быть влияние на производительность, сейчас будут выполняться два или более запросов (в зависимости от связи) вместо соединения. Если выборка для
humans
возвратит большое количество ID, в выборку для treats
может быть послано слишком много ID.
+ - Поскольку мы больше не выполняем соединения, запросы с сортировкой или лимитом теперь сортируются в памяти, так как упорядочивание из одной таблицы не может быть применено к другой таблице.
+
- Эта настройка должна быть добавлена ко всем связям, где вы хотите отключить соединение. Rails не может угадать это, так как загрузка связей ленивая, и чтобы загрузить
treats
in @dog.treats
Rails уже нужно знать, какой SQL должен быть сгенерирован.
+
Если вы хотите загрузить кэш схемы для каждой базы данных, вам нужно установить schema_cache_path
в каждой конфигурации базы данных и установить config.active_record.lazily_load_schema_cache = true
в конфигурации приложения. Отметьте, что это лениво загрузит кэш при установлении соединений с базами данных.
Rails не поддерживает автоматическую нагрузочную балансировку реплик. Это очень зависит от вашей инфраструктуры. В будущем может быть будет реализована базовая, примитивная нагрузочная балансировка, но для масштабирования приложения должно быть что-то, что управляет вашим приложением вне Rails.
diff --git a/assets/.sprockets-manifest-2d3b1b2579920b4ddbf3dce3090f11a5.json b/assets/.sprockets-manifest-7cda431b0fa27692c551bf9b1cd8799a.json
similarity index 83%
rename from assets/.sprockets-manifest-2d3b1b2579920b4ddbf3dce3090f11a5.json
rename to assets/.sprockets-manifest-7cda431b0fa27692c551bf9b1cd8799a.json
index 8bd8ed6..e5b6c33 100644
--- a/assets/.sprockets-manifest-2d3b1b2579920b4ddbf3dce3090f11a5.json
+++ b/assets/.sprockets-manifest-7cda431b0fa27692c551bf9b1cd8799a.json
@@ -1 +1 @@
-{"files":{"manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js":{"logical_path":"manifest.js","mtime":"2024-06-08T18:55:32+03:00","size":3,"digest":"6a3cf5192354f71615ac51034b3e97c20eda99643fcaf5bbe6d41ad59bd12167","integrity":"sha256-ajz1GSNU9xYVrFEDSz6Xwg7amWQ/yvW75tQa1ZvRIWc="},"4_0_release_notes/rails4_features-5fcf9ff91508738a246a33c1865362c473c5c326109c7f0d3181064f4a094bd6.png":{"logical_path":"4_0_release_notes/rails4_features.png","mtime":"2024-06-08T18:55:32+03:00","size":65840,"digest":"45df3a9e54be99a6ca84766357fb209b9791c41dcedbdf9c075ce37e24c8b2bf","integrity":"sha256-Rd86nlS+mabKhHZjV/sgm5eRxB3O29+cB1zjfiTIsr8="},"active_record_querying/bookstore_models-199956343e0509fc4c7f8382d6fd257a032b0e398da86cdec0bd37987153681d.png":{"logical_path":"active_record_querying/bookstore_models.png","mtime":"2024-06-08T18:55:32+03:00","size":29780,"digest":"da64ec4f98840d1f2244c9baae3f195bd070f468028970b9c21e540a549e8e85","integrity":"sha256-2mTsT5iEDR8iRMm6rj8ZW9Bw9GgCiXC5wh5UClSejoU="},"association_basics/belongs_to-df76734b189960ffcc658e600a816364e36345f12ad95568577152b2a0e616d4.png":{"logical_path":"association_basics/belongs_to.png","mtime":"2024-06-08T18:55:32+03:00","size":21431,"digest":"2effe9e134a078cbf07e61167b86d9496e3fe099e07efc87b8efde04e8989ba4","integrity":"sha256-Lv/p4TSgeMvwfmEWe4bZSW4/4JngfvyHuO/eBOiYm6Q="},"association_basics/habtm-561e5db1b2463863573e41c54c33a4f23b1f7dcb2830c64dc0eb121d15b0b3ec.png":{"logical_path":"association_basics/habtm.png","mtime":"2024-06-08T18:55:32+03:00","size":45968,"digest":"4f165bf95491de3edd4d19072618320e2d726e121386872d05933c785417666e","integrity":"sha256-TxZb+VSR3j7dTRkHJhgyDi1ybhIThoctBZM8eFQXZm4="},"association_basics/has_many-8b67077983ad33c144a0cf2816b641dfd2f1d246be5bd64ca1f7f8a9bf1b9dc1.png":{"logical_path":"association_basics/has_many.png","mtime":"2024-06-08T18:55:32+03:00","size":23833,"digest":"e7841d845983c8fbbd594103f24255dedcd9f1baee5f34a46907ab4e5ec96ad6","integrity":"sha256-54QdhFmDyPu9WUED8kJV3tzZ8bruXzSkaQerTl7JatY="},"association_basics/has_many_through-b8b306c6e3fec380ae60261a3db7ec58a7e50750539433c3993e528c111ec332.png":{"logical_path":"association_basics/has_many_through.png","mtime":"2024-06-08T18:55:32+03:00","size":75349,"digest":"a719dd48cbaa85f305110fbc7aa6e55545e5bbd88ae7a2b922cde22aad144e6e","integrity":"sha256-pxndSMuqhfMFEQ+8eqblVUXlu9iK56K5Is3iKq0UTm4="},"association_basics/has_one-599d92df13b624943d4da29db45549fadcc420bb287a6fd361022d20b4112c98.png":{"logical_path":"association_basics/has_one.png","mtime":"2024-06-08T18:55:32+03:00","size":27470,"digest":"ef318cfadca7d938d6e3d4db2c4d59a992ece1a60a25449eb954b15a9f5e1616","integrity":"sha256-7zGM+tyn2TjW49TbLE1ZqZLs4aYKJUSeuVSxWp9eFhY="},"association_basics/has_one_through-d9cad54a85e7e2e2e334541326ad33c37f2bf84e3e30b8aa80b6e029f889c82a.png":{"logical_path":"association_basics/has_one_through.png","mtime":"2024-06-08T18:55:32+03:00","size":68831,"digest":"4a8a83c0759839bace017f73655e7b9b67f4adf387ca9c4519ceb2e769c8941c","integrity":"sha256-SoqDwHWYObrOAX9zZV57m2f0rfOHypxFGc6y52nIlBw="},"association_basics/polymorphic-a4deb1783f2e5373c0465329e9d3576a7f5f55afd69093f16b3cf6f1629d1cb0.png":{"logical_path":"association_basics/polymorphic.png","mtime":"2024-06-08T18:55:32+03:00","size":62751,"digest":"3bfc9733727731c4fcde9d24743af9e93d4ee97f30bfec93fd5d5d32c664c9c6","integrity":"sha256-O/yXM3J3McT83p0kdDr56T1O6X8wv+yT/V1dMsZkycY="},"docs_preview/annotation-6d979adf84853aa242512d229dfc4c8ee9fc6be7545442c3ec33fbb15d894fda.png":{"logical_path":"docs_preview/annotation.png","mtime":"2024-06-08T18:55:32+03:00","size":9693,"digest":"9b7a5ea53bfcf91d07f3a4b136303c2aff24d468ef69c046ef3cdb2b6a78309c","integrity":"sha256-m3pepTv8+R0H86SxNjA8Kv8k1GjvacBG7zzbK2p4MJw="},"docs_preview/status_checks-582b51790b7a229b6a6c4fd63d8009e093caa40fb7c00dd6e97cf3d56b21e8e1.png":{"logical_path":"docs_preview/status_checks.png","mtime":"2024-06-08T18:55:32+03:00","size":45216,"digest":"a21127a428b8b61fb10b728cedf561ef69023382309b92beb3c039a66c350715","integrity":"sha256-ohEnpCi4th+xC3KM7fVh72kCM4Iwm5K+s8A5pmw1BxU="},"dynamic_method_class_eval-1e35052369fa0d155b591269e91a7812ed1135ffa8fadd66071ec0fd43956797.png":{"logical_path":"dynamic_method_class_eval.png","mtime":"2024-06-08T18:55:32+03:00","size":30728,"digest":"90fb6bbaab36bd7ed9503faf16c5d1f02d290d7fe9008acba29176e41c64ed06","integrity":"sha256-kPtruqs2vX7ZUD+vFsXR8C0pDX/pAIrLopF25Bxk7QY="},"getting_started/article_with_comments-7e5d8551c9ac02f2d28992374b44445c847727aa8d5be1e26dd2db3bded2bc4e.png":{"logical_path":"getting_started/article_with_comments.png","mtime":"2024-06-08T18:55:32+03:00","size":26814,"digest":"6f31d3c50f1a8a14e2b1016d9e7ab9f3e0a59e276e66bd3c5d1c207c2779e89e","integrity":"sha256-bzHTxQ8aihTisQFtnnq58+ClniduZr08XRwgfCd56J4="},"getting_started/challenge-f112fb88a11ab2263c2f7a017e2cbeba089f799477c33d5a09c968bcc90fd62b.png":{"logical_path":"getting_started/challenge.png","mtime":"2024-06-08T18:55:32+03:00","size":20347,"digest":"f22220a92bfb0b4a15afa34a66f34c9e055023e586876dd3529c043515cd08eb","integrity":"sha256-8iIgqSv7C0oVr6NKZvNMngVQI+WGh23TUpwENRXNCOs="},"getting_started/rails_welcome-15373024c21047e1628acfdbd4203cf98396e3fffdaa72d345a871feb66cfbbf.png":{"logical_path":"getting_started/rails_welcome.png","mtime":"2024-06-08T18:55:32+03:00","size":42246,"digest":"1dbfbbbbcfd59cf719343f49ec2ea637c0e08806dcfc7a97c2061d4b8b482b06","integrity":"sha256-Hb+7u8/VnPcZND9J7C6mN8DgiAbc/HqXwgYdS4tIKwY="},"github-7cc23602a5ac2465f14c19492358a5a67dc24636761cc723e4d621cea0c09225.png":{"logical_path":"github.png","mtime":"2024-06-08T18:55:32+03:00","size":16868,"digest":"cb6843f5a5c77d9226a1fdeeb1994398099eb548a5dab628e3ea272acdc830a5","integrity":"sha256-y2hD9aXHfZImof3usZlDmAmetUil2rYo4+onKs3IMKU="},"i18n/demo_html_safe-47afb910043f21996f5abc5f5f3814f26935d560ff365f79311fffba55b2b2fb.png":{"logical_path":"i18n/demo_html_safe.png","mtime":"2024-06-08T18:55:32+03:00","size":9860,"digest":"f4497a049cbaee51d73497f2c6e4ba57512e73c876195faf684b4fc76ad9f83d","integrity":"sha256-9El6BJy67lHXNJfyxuS6V1Euc8h2GV+vaEtPx2rZ+D0="},"i18n/demo_localized_pirate-225ed1f7671118d9d29e97f28ba9f34195ad53606b24cbfae406ec5eacb93dd2.png":{"logical_path":"i18n/demo_localized_pirate.png","mtime":"2024-06-08T18:55:32+03:00","size":11214,"digest":"3630593e1895149d94916564593ec2eeda51ea984f3b99129a1a819964555ea1","integrity":"sha256-NjBZPhiVFJ2UkWVkWT7C7tpR6phPO5kSmhqBmWRVXqE="},"i18n/demo_translated_en-83de4d3d7ffa1d79d26279adede1173ffcf24ea8341645ff30467ea500ee3364.png":{"logical_path":"i18n/demo_translated_en.png","mtime":"2024-06-08T18:55:32+03:00","size":9069,"digest":"e3a4c72fee5e7486bd83049dd8b593d7a5f652ccdd80de487acfa42aaa707ee8","integrity":"sha256-46THL+5edIa9gwSd2LWT16X2UszdgN5Ies+kKqpwfug="},"i18n/demo_translated_pirate-0f6e2f38fcaf255732c1c3a66277a0c5f74a8e3698082d8ea7ed0d5b4036b08b.png":{"logical_path":"i18n/demo_translated_pirate.png","mtime":"2024-06-08T18:55:32+03:00","size":9974,"digest":"e8ae39329898d8e869944e583ee103c06e00a499c4bd3d0d5ce085b2ded54430","integrity":"sha256-6K45MpiY2OhplE5YPuEDwG4ApJnEvT0NXOCFst7VRDA="},"i18n/demo_translation_missing-49aed4aac1ba76039482397578da7c985479fa1ace51061113a8f244cb193020.png":{"logical_path":"i18n/demo_translation_missing.png","mtime":"2024-06-08T18:55:32+03:00","size":9984,"digest":"7061bfc17a998f05f1580a0afc542ea77f92c017fb8e431207f603d52092c2f0","integrity":"sha256-cGG/wXqZjwXxWAoK/FQup3+SwBf7jkMSB/YD1SCSwvA="},"i18n/demo_untranslated-6c47b4850770520293deaf7fcc55005ec56bf6c5e0664490cddd33c654944739.png":{"logical_path":"i18n/demo_untranslated.png","mtime":"2024-06-08T18:55:32+03:00","size":8985,"digest":"49db80ee41e79a8eceb0c21145f471a21e53d7722dce1c8041f001b9cda499f9","integrity":"sha256-SduA7kHnmo7OsMIRRfRxoh5T13ItzhyAQfABuc2kmfk="},"partners/mkdev/ageev-9da7e9087fe79fb08b100a582f86612af09f9da7e4bd4fca0efc2ac65078571c.png":{"logical_path":"partners/mkdev/ageev.png","mtime":"2024-06-08T18:55:32+03:00","size":18288,"digest":"53992f3082a6333f1bba0ecf35c05d6154a90f17c0075084dc3e9d75e24162e0","integrity":"sha256-U5kvMIKmMz8bug7PNcBdYVSpDxfAB1CE3D6ddeJBYuA="},"partners/mkdev/banner0519-9493099d0eae9452a4c066bf982a54f2f66f48cbf4903b86fcfaa173311f1236.png":{"logical_path":"partners/mkdev/banner0519.png","mtime":"2024-06-08T18:55:32+03:00","size":13590,"digest":"38de6f53a05a5b81416dcb2d2f76de3eebe5b074f58263052f23457bcdebd10a","integrity":"sha256-ON5vU6BaW4FBbcstL3bePuvlsHT1gmMFLyNFe83r0Qo="},"partners/mkdev/banner120619-f9f88b8893ddf6e162602829979d53fc70285bb19ff27f5a78675ecad9abf730.png":{"logical_path":"partners/mkdev/banner120619.png","mtime":"2024-06-08T18:55:32+03:00","size":29489,"digest":"330954c92e5fecf6940d82a44bc654c1e8080eb7c972772ce9a925b7e0840291","integrity":"sha256-MwlUyS5f7PaUDYKkS8ZUwegIDrfJcncs6aklt+CEApE="},"partners/mkdev/blackfriday-1b9089ad7c6daa786747fce9db5f7c80ef6decca784f8bb220917d99e86f9b87.png":{"logical_path":"partners/mkdev/blackfriday.png","mtime":"2024-06-08T18:55:32+03:00","size":42386,"digest":"56a691602c07e4edad0c4a769eb0b0d04e1c688a7f20858c3b20283cee46b009","integrity":"sha256-VqaRYCwH5O2tDEp2nrCw0E4caIp/IIWMOyAoPO5GsAk="},"partners/mkdev/expertise-2-279e8f4581f18ff36d03806d297e951a2f6767c5a057c47c11b86b0e43eb7219.png":{"logical_path":"partners/mkdev/expertise-2.png","mtime":"2024-06-08T18:55:32+03:00","size":21416,"digest":"ce09203cc4e9cbbebe785ec88269ccd1ee93c196780694539cb60aa9fbd27d03","integrity":"sha256-zgkgPMTpy76+eF7IgmnM0e6TwZZ4BpRTnLYKqfvSfQM="},"partners/mkdev/expertise-351760e00367868c8691a7702fa5873513b14a73626f2f8c429448ecf1ccf11b.png":{"logical_path":"partners/mkdev/expertise.png","mtime":"2024-06-08T18:55:32+03:00","size":84006,"digest":"8a071ee73f1802802d47c731db218aa7e47c56248ed1c6fbab2e9091e354af04","integrity":"sha256-igce5z8YAoAtR8cx2yGKp+R8ViSO0cb7qy6QkeNUrwQ="},"partners/mkdev/mekhonoshin-e9b9e90e61c366299c1c1f842c2c6f16a27680928b470c8096c4c239022f5acb.png":{"logical_path":"partners/mkdev/mekhonoshin.png","mtime":"2024-06-08T18:55:32+03:00","size":17034,"digest":"3b31e95fa3bc6c3819826397dc57218aff2ee196fefe8e8a5cac6c986f8cd0d4","integrity":"sha256-OzHpX6O8bDgZgmOX3Fchiv8u4Zb+/o6KXKxsmG+M0NQ="},"partners/mkdev/ror-451dc815a8014e7a17e2647e55ec092e926dc5ffe9aa78759ee765faed292609.png":{"logical_path":"partners/mkdev/ror.png","mtime":"2024-06-08T18:55:32+03:00","size":9516,"digest":"47ac6bdf04a25c9b38275071181307f587363dd005f6f99ba2676128f252dd7a","integrity":"sha256-R6xr3wSiXJs4J1BxGBMH9Yc2PdAF9vmbomdhKPJS3Xo="},"partners/mkdev/shepelev-882504f1486849531587dae4c2c69487e50c3c385cd6fd6fb5d4a4d2a3ea6eef.png":{"logical_path":"partners/mkdev/shepelev.png","mtime":"2024-06-08T18:55:32+03:00","size":14566,"digest":"cc1ddcd29061e39eb8e6da946ab87284e26b441c7937ad28c1bea2f8a2e4f6e1","integrity":"sha256-zB3c0pBh45645tqUarhyhOJrRBx5N60owb6i+KLk9uE="},"partners/mkdev/takarlikov-9df87fae3200fcc7aed8fcf899369e26ae06e7a3e8bb1e8e91d7726990972a7d.png":{"logical_path":"partners/mkdev/takarlikov.png","mtime":"2024-06-08T18:55:32+03:00","size":18660,"digest":"4d1c91ff995f312a97da34d79f929d4da390901d6ad5838f9a68f62a29ba0894","integrity":"sha256-TRyR/5lfMSqX2jTXn5KdTaOQkB1q1YOPmmj2Kim6CJQ="},"partners/railsclub2016-50311f1afe89a78ea763669687e1585398e34f1dfe4c6d8749e95e5b64a292ae.png":{"logical_path":"partners/railsclub2016.png","mtime":"2024-06-08T18:55:32+03:00","size":8730,"digest":"a332d4af3a32f1c02506f837a1b48c52458ff602c674efc25140e3d3b9650c17","integrity":"sha256-ozLUrzoy8cAlBvg3obSMUkWP9gLGdO/CUUDj07llDBc="},"partners/rubyconf2016-4804204872bfe004a71a6e639693f49359a80fac66e4e2e0246c9092943026e1.png":{"logical_path":"partners/rubyconf2016.png","mtime":"2024-06-08T18:55:32+03:00","size":32642,"digest":"7fac85c3eaf5caf5f57940774e2f4aa0ba167f61cbeede55e9287119e8a044c7","integrity":"sha256-f6yFw+r1yvX1eUB3Ti9KoLoWf2HL7t5V6ShxGeigRMc="},"partners/rubyconf2017-4ccbdfc9741e8cb01fef6071f765e10171527c6dcb309b2130f82d5d83c71abf.png":{"logical_path":"partners/rubyconf2017.png","mtime":"2024-06-08T18:55:32+03:00","size":26732,"digest":"11efe6d7a17db3a5cd4c7a4151131ffa85689b10d31387dbe2c4b5a544c97d61","integrity":"sha256-Ee/m16F9s6XNTHpBURMf+oVomxDTE4fb4sS1pUTJfWE="},"partners/spherecon2017-d14fd400acedfbc26648f3afe5c8beb8804cda4f10e968f9269890d9517a7684.jpg":{"logical_path":"partners/spherecon2017.jpg","mtime":"2024-06-08T18:55:32+03:00","size":105188,"digest":"71e9483a98dff8798b88d464b8bfabaa539a7373e1a2aabb93a60ebc86a46f0d","integrity":"sha256-celIOpjf+HmLiNRkuL+rqlOac3Phoqq7k6YOvIakbw0="},"pdficon-7c31e5c1d5f7d3e8938fea0182959ef48dcc2c9c4e40c8a7912c7e033f04e5f3.png":{"logical_path":"pdficon.png","mtime":"2024-06-08T18:55:32+03:00","size":1397,"digest":"f755e8f306b39714f4efa5d7928e1a54b29571e78af77c96c95f950528468cb4","integrity":"sha256-91Xo8wazlxT076XXko4aVLKVceeK93yWyV+VBShGjLQ="},"rails-cd95a25e70dfe61add5a96e11d3fee0f29e9ba2b05099723d57bba7dfa725c8a.png":{"logical_path":"rails.png","mtime":"2024-06-08T18:55:32+03:00","size":6646,"digest":"322506f9917889126e81df2833a6eecdf2e394658d53dad347e9882dd4dbf28e","integrity":"sha256-MiUG+ZF4iRJugd8oM6buzfLjlGWNU9rTR+mILdTb8o4="},"rusrails-54a1a180f3e4a1e24dae01860cd57bd558fbea67d1f55280272e85a09f294c06.png":{"logical_path":"rusrails.png","mtime":"2024-06-08T18:55:32+03:00","size":4588,"digest":"3a40876ce46d08d466ccd82a63b46d181c829b9ac863ff753173a3f0db15a6d5","integrity":"sha256-OkCHbORtCNRmzNgqY7RtGByCm5rIY/91MXOj8NsVptU="},"security/csrf-4a84f41dd2f0432834e10f7227f0fb7086f4f4488568883e94778a8563b00888.png":{"logical_path":"security/csrf.png","mtime":"2024-06-08T18:55:32+03:00","size":32179,"digest":"7948560793297c5c624228b16de6f634e8d788cd4d0fd41524daa58f8afd7a01","integrity":"sha256-eUhWB5MpfFxiQiixbeb2NOjXiM1ND9QVJNqlj4r9egE="},"security/session_fixation-c6e104b81c6c3d376ad6b14ab777ec8abb53199bc0c31c653d5825bc1f8da9df.png":{"logical_path":"security/session_fixation.png","mtime":"2024-06-08T18:55:32+03:00","size":37819,"digest":"abc9c76fbf1579dc6c018fd8009781386856bf929df69860f18d6e3e67cd871d","integrity":"sha256-q8nHb78VedxsAY/YAJeBOGhWv5Kd9phg8Y1uPmfNhx0="},"tab_grey-718dc05cb75fad4a00d17800ab81a53a6ea13c13e5af30bbfadd74c904351e0c.gif":{"logical_path":"tab_grey.gif","mtime":"2024-06-08T18:55:32+03:00","size":4924,"digest":"d6c6c6d6171c9e11011ed763c29af10ea3e0888e069edae1ef4c5430eb155fdf","integrity":"sha256-1sbG1hccnhEBHtdjwprxDqPgiI4Gntrh70xUMOsVX98="},"tab_info-30838425e4f419c0f6ca37dd3d9ee734d1490bea82f872c5815b46d0f602c973.gif":{"logical_path":"tab_info.gif","mtime":"2024-06-08T18:55:32+03:00","size":4762,"digest":"31d527dc8b8bb0237f8b7b789c0789584ebb81c9f7206f3dcdb89e466362e863","integrity":"sha256-MdUn3IuLsCN/i3t4nAeJWE67gcn3IG89zbieRmNi6GM="},"tab_note-ac4f8650369366d8208180dd77d818c7d747a8c780320c3c568d95789a243e2b.gif":{"logical_path":"tab_note.gif","mtime":"2024-06-08T18:55:32+03:00","size":4807,"digest":"b5aa9533414ac43e98a64134345750ad73f8f65c9668d49a2213ced5443820b3","integrity":"sha256-taqVM0FKxD6YpkE0NFdQrXP49lyWaNSaIhPO1UQ4ILM="},"tab_red-ec2e40047d5e8798e91ee6d28cd58eec85aa94297976fabadf48e3377281b75c.gif":{"logical_path":"tab_red.gif","mtime":"2024-06-08T18:55:32+03:00","size":4753,"digest":"649b059be226a5d79c8460903880c9f0a6ab6146dbcd472b35bb73de8903c143","integrity":"sha256-ZJsFm+ImpdechGCQOIDJ8KarYUbbzUcrNbtz3okDwUM="},"twitter-50e0e767c8793dec313a7dc5cfbcfe2067e3e89ea6ec64784eb7c6640f578758.png":{"logical_path":"twitter.png","mtime":"2024-06-08T18:55:32+03:00","size":17548,"digest":"241515185a67986d51d7a6e5b9a08c066290bc97ed3038375e5b41cdd867d5c8","integrity":"sha256-JBUVGFpnmG1R16bluaCMBmKQvJftMDg3XltBzdhn1cg="},"application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js":{"logical_path":"application.js","mtime":"2024-06-08T18:55:32+03:00","size":378179,"digest":"7ada6cbd2b8bf4dcc28343d0a2d1b42cc0000e4bd7e03191832f1f97d9cd4ec9","integrity":"sha256-etpsvSuL9NzCg0PQotG0LMAADkvX4DGRgy8fl9nNTsk="},"layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js":{"logical_path":"layout.js","mtime":"2024-06-08T18:55:32+03:00","size":862,"digest":"ea31f883d602665a2a51117e7e2c90f90f7c937ec19f5049d8bba1b7e73ed574","integrity":"sha256-6jH4g9YCZloqURF+fiyQ+Q98k37Bn1BJ2Luht+c+1XQ="},"app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css":{"logical_path":"app.css","mtime":"2024-06-08T18:55:32+03:00","size":843,"digest":"9001c842e13ca2ab2973027165043c149c811ba4abe736f334bc7952ae8890e3","integrity":"sha256-kAHIQuE8oqspcwJxZQQ8FJyBG6Sr5zbzNLx5Uq6IkOM="},"application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css":{"logical_path":"application.css","mtime":"2024-06-08T18:55:32+03:00","size":352928,"digest":"b048a46c60c512b73e292a1bb8dbbbdaee3d30da0fe127261dda39a401f2a4e6","integrity":"sha256-sEikbGDFErc+KSobuNu72u49MNoP4ScmHdo5pAHypOY="},"bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css":{"logical_path":"bootstrap_and_overrides.css","mtime":"2024-06-08T18:55:32+03:00","size":343913,"digest":"ce1f7912d022746fcd64d5dbca8f75f7da7e410f565c17eb5f5b89a41d6624f0","integrity":"sha256-zh95EtAidG/NZNXbyo9199p+QQ9WXBfrX1uJpB1mJPA="},"layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css":{"logical_path":"layout.css","mtime":"2024-06-08T18:55:32+03:00","size":2936,"digest":"7edcdb25fb7f8116e950776e0f2524afa5b35b186acf50da0dcad5ce2b7d649a","integrity":"sha256-ftzbJft/gRbpUHduDyUkr6WzWxhqz1DaDcrVzit9ZJo="},"pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css":{"logical_path":"pages.css","mtime":"2024-06-08T18:55:32+03:00","size":1592,"digest":"3890e3ee471703c067b9087db07b3a2531e13c3687cc1092ff823d693b19f1d6","integrity":"sha256-OJDj7kcXA8BnuQh9sHs6JTHhPDaHzBCS/4I9aTsZ8dY="},"search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css":{"logical_path":"search.css","mtime":"2024-06-08T18:55:32+03:00","size":299,"digest":"dbab1107e31bf20a92faaff18c4f9dda618abd4ade2e8a01339c0a99487e6e31","integrity":"sha256-26sRB+Mb8gqS+q/xjE+d2mGKvUreLooBM5wKmUh+bjE="},"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js":{"logical_path":"actiontext.js","mtime":"2024-06-08T18:55:32+03:00","size":30457,"digest":"bcc99d511868dd8b36e6a36485cfcb08299e8d5ed60749987b16486bc7d9fec4","integrity":"sha256-vMmdURho3Ys25qNkhc/LCCmejV7WB0mYexZIa8fZ/sQ="},"trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js":{"logical_path":"trix.js","mtime":"2024-06-08T18:55:32+03:00","size":230043,"digest":"88088eca6500fc4cc5977dd8b216a6efa077f51abd3e6fc5de3f38e3c036e6e1","integrity":"sha256-iAiOymUA/EzFl33Ysham76B39Rq9Pm/F3j8448A25uE="},"trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css":{"logical_path":"trix.css","mtime":"2024-06-08T18:55:32+03:00","size":16020,"digest":"f96f8d0938c5575b8ede0747009dad85620c459aa498f816d2874b269fcd2d08","integrity":"sha256-+W+NCTjFV1uO3gdHAJ2thWIMRZqkmPgW0odLJp/NLQg="},"glyphicons-halflings-80dfe6854eab05fef99752d65528b45078554ce65a627dd140d535da5509cbc8.png":{"logical_path":"glyphicons-halflings.png","mtime":"2024-06-08T18:55:32+03:00","size":12799,"digest":"d99e3fa32c641032f08149914b28c2dc6acf2ec62f70987f2259eabbfa7fc0de","integrity":"sha256-2Z4/oyxkEDLwgUmRSyjC3GrPLsYvcJh/Ilnqu/p/wN4="},"glyphicons-halflings-white-0f383ca656fb92a3438f873049f4c292f09f463a873b6e214a4ccce6d2fc0165.png":{"logical_path":"glyphicons-halflings-white.png","mtime":"2024-06-08T18:55:32+03:00","size":8777,"digest":"f0e0d95a9c8abcdfabf46348e2d4285829bb0491f5f6af0e05af52bffb6324c4","integrity":"sha256-8ODZWpyKvN+r9GNI4tQoWCm7BJH19q8OBa9Sv/tjJMQ="},"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js":{"logical_path":"activestorage.js","mtime":"2024-06-08T18:55:32+03:00","size":29045,"digest":"718a3b7737430511519d7175a20269953d97a1252acb0c17e9f7ffe5cac4f4a7","integrity":"sha256-cYo7dzdDBRFRnXF1ogJplT2XoSUqywwX6ff/5crE9Kc="},"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js":{"logical_path":"activestorage.esm.js","mtime":"2024-06-08T18:55:32+03:00","size":26992,"digest":"a10bcef9e766c86260e93966fa6f2fe5efb8b03c744634d8bf0b835eca5414ca","integrity":"sha256-oQvO+edmyGJg6Tlm+m8v5e+4sDx0RjTYvwuDXspUFMo="},"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js":{"logical_path":"actioncable.js","mtime":"2024-06-08T18:55:32+03:00","size":15699,"digest":"6b2fe44d9e4546fcc6b92f0a37b61d6b555020041ede1dd603c007b1c0904ec1","integrity":"sha256-ay/kTZ5FRvzGuS8KN7Yda1VQIAQe3h3WA8AHscCQTsE="},"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js":{"logical_path":"actioncable.esm.js","mtime":"2024-06-08T18:55:32+03:00","size":14080,"digest":"a9e53dfa810276aa0aee8791a910c4878d48b75093398f3d6d822db41b428b7b","integrity":"sha256-qeU9+oECdqoK7oeRqRDEh41It1CTOY89bYIttBtCi3s="}},"assets":{"manifest.js":"manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js","4_0_release_notes/rails4_features.png":"4_0_release_notes/rails4_features-5fcf9ff91508738a246a33c1865362c473c5c326109c7f0d3181064f4a094bd6.png","active_record_querying/bookstore_models.png":"active_record_querying/bookstore_models-199956343e0509fc4c7f8382d6fd257a032b0e398da86cdec0bd37987153681d.png","association_basics/belongs_to.png":"association_basics/belongs_to-df76734b189960ffcc658e600a816364e36345f12ad95568577152b2a0e616d4.png","association_basics/habtm.png":"association_basics/habtm-561e5db1b2463863573e41c54c33a4f23b1f7dcb2830c64dc0eb121d15b0b3ec.png","association_basics/has_many.png":"association_basics/has_many-8b67077983ad33c144a0cf2816b641dfd2f1d246be5bd64ca1f7f8a9bf1b9dc1.png","association_basics/has_many_through.png":"association_basics/has_many_through-b8b306c6e3fec380ae60261a3db7ec58a7e50750539433c3993e528c111ec332.png","association_basics/has_one.png":"association_basics/has_one-599d92df13b624943d4da29db45549fadcc420bb287a6fd361022d20b4112c98.png","association_basics/has_one_through.png":"association_basics/has_one_through-d9cad54a85e7e2e2e334541326ad33c37f2bf84e3e30b8aa80b6e029f889c82a.png","association_basics/polymorphic.png":"association_basics/polymorphic-a4deb1783f2e5373c0465329e9d3576a7f5f55afd69093f16b3cf6f1629d1cb0.png","docs_preview/annotation.png":"docs_preview/annotation-6d979adf84853aa242512d229dfc4c8ee9fc6be7545442c3ec33fbb15d894fda.png","docs_preview/status_checks.png":"docs_preview/status_checks-582b51790b7a229b6a6c4fd63d8009e093caa40fb7c00dd6e97cf3d56b21e8e1.png","dynamic_method_class_eval.png":"dynamic_method_class_eval-1e35052369fa0d155b591269e91a7812ed1135ffa8fadd66071ec0fd43956797.png","getting_started/article_with_comments.png":"getting_started/article_with_comments-7e5d8551c9ac02f2d28992374b44445c847727aa8d5be1e26dd2db3bded2bc4e.png","getting_started/challenge.png":"getting_started/challenge-f112fb88a11ab2263c2f7a017e2cbeba089f799477c33d5a09c968bcc90fd62b.png","getting_started/rails_welcome.png":"getting_started/rails_welcome-15373024c21047e1628acfdbd4203cf98396e3fffdaa72d345a871feb66cfbbf.png","github.png":"github-7cc23602a5ac2465f14c19492358a5a67dc24636761cc723e4d621cea0c09225.png","i18n/demo_html_safe.png":"i18n/demo_html_safe-47afb910043f21996f5abc5f5f3814f26935d560ff365f79311fffba55b2b2fb.png","i18n/demo_localized_pirate.png":"i18n/demo_localized_pirate-225ed1f7671118d9d29e97f28ba9f34195ad53606b24cbfae406ec5eacb93dd2.png","i18n/demo_translated_en.png":"i18n/demo_translated_en-83de4d3d7ffa1d79d26279adede1173ffcf24ea8341645ff30467ea500ee3364.png","i18n/demo_translated_pirate.png":"i18n/demo_translated_pirate-0f6e2f38fcaf255732c1c3a66277a0c5f74a8e3698082d8ea7ed0d5b4036b08b.png","i18n/demo_translation_missing.png":"i18n/demo_translation_missing-49aed4aac1ba76039482397578da7c985479fa1ace51061113a8f244cb193020.png","i18n/demo_untranslated.png":"i18n/demo_untranslated-6c47b4850770520293deaf7fcc55005ec56bf6c5e0664490cddd33c654944739.png","partners/mkdev/ageev.png":"partners/mkdev/ageev-9da7e9087fe79fb08b100a582f86612af09f9da7e4bd4fca0efc2ac65078571c.png","partners/mkdev/banner0519.png":"partners/mkdev/banner0519-9493099d0eae9452a4c066bf982a54f2f66f48cbf4903b86fcfaa173311f1236.png","partners/mkdev/banner120619.png":"partners/mkdev/banner120619-f9f88b8893ddf6e162602829979d53fc70285bb19ff27f5a78675ecad9abf730.png","partners/mkdev/blackfriday.png":"partners/mkdev/blackfriday-1b9089ad7c6daa786747fce9db5f7c80ef6decca784f8bb220917d99e86f9b87.png","partners/mkdev/expertise-2.png":"partners/mkdev/expertise-2-279e8f4581f18ff36d03806d297e951a2f6767c5a057c47c11b86b0e43eb7219.png","partners/mkdev/expertise.png":"partners/mkdev/expertise-351760e00367868c8691a7702fa5873513b14a73626f2f8c429448ecf1ccf11b.png","partners/mkdev/mekhonoshin.png":"partners/mkdev/mekhonoshin-e9b9e90e61c366299c1c1f842c2c6f16a27680928b470c8096c4c239022f5acb.png","partners/mkdev/ror.png":"partners/mkdev/ror-451dc815a8014e7a17e2647e55ec092e926dc5ffe9aa78759ee765faed292609.png","partners/mkdev/shepelev.png":"partners/mkdev/shepelev-882504f1486849531587dae4c2c69487e50c3c385cd6fd6fb5d4a4d2a3ea6eef.png","partners/mkdev/takarlikov.png":"partners/mkdev/takarlikov-9df87fae3200fcc7aed8fcf899369e26ae06e7a3e8bb1e8e91d7726990972a7d.png","partners/railsclub2016.png":"partners/railsclub2016-50311f1afe89a78ea763669687e1585398e34f1dfe4c6d8749e95e5b64a292ae.png","partners/rubyconf2016.png":"partners/rubyconf2016-4804204872bfe004a71a6e639693f49359a80fac66e4e2e0246c9092943026e1.png","partners/rubyconf2017.png":"partners/rubyconf2017-4ccbdfc9741e8cb01fef6071f765e10171527c6dcb309b2130f82d5d83c71abf.png","partners/spherecon2017.jpg":"partners/spherecon2017-d14fd400acedfbc26648f3afe5c8beb8804cda4f10e968f9269890d9517a7684.jpg","pdficon.png":"pdficon-7c31e5c1d5f7d3e8938fea0182959ef48dcc2c9c4e40c8a7912c7e033f04e5f3.png","rails.png":"rails-cd95a25e70dfe61add5a96e11d3fee0f29e9ba2b05099723d57bba7dfa725c8a.png","rusrails.png":"rusrails-54a1a180f3e4a1e24dae01860cd57bd558fbea67d1f55280272e85a09f294c06.png","security/csrf.png":"security/csrf-4a84f41dd2f0432834e10f7227f0fb7086f4f4488568883e94778a8563b00888.png","security/session_fixation.png":"security/session_fixation-c6e104b81c6c3d376ad6b14ab777ec8abb53199bc0c31c653d5825bc1f8da9df.png","tab_grey.gif":"tab_grey-718dc05cb75fad4a00d17800ab81a53a6ea13c13e5af30bbfadd74c904351e0c.gif","tab_info.gif":"tab_info-30838425e4f419c0f6ca37dd3d9ee734d1490bea82f872c5815b46d0f602c973.gif","tab_note.gif":"tab_note-ac4f8650369366d8208180dd77d818c7d747a8c780320c3c568d95789a243e2b.gif","tab_red.gif":"tab_red-ec2e40047d5e8798e91ee6d28cd58eec85aa94297976fabadf48e3377281b75c.gif","twitter.png":"twitter-50e0e767c8793dec313a7dc5cfbcfe2067e3e89ea6ec64784eb7c6640f578758.png","application.js":"application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js","layout.js":"layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js","app.css":"app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css","application.css":"application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css","bootstrap_and_overrides.css":"bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css","layout.css":"layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css","pages.css":"pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css","search.css":"search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css","actiontext.js":"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js","trix.js":"trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js","trix.css":"trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css","glyphicons-halflings.png":"glyphicons-halflings-80dfe6854eab05fef99752d65528b45078554ce65a627dd140d535da5509cbc8.png","glyphicons-halflings-white.png":"glyphicons-halflings-white-0f383ca656fb92a3438f873049f4c292f09f463a873b6e214a4ccce6d2fc0165.png","activestorage.js":"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js","activestorage.esm.js":"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js","actioncable.js":"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js","actioncable.esm.js":"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js"}}
\ No newline at end of file
+{"files":{"manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js":{"logical_path":"manifest.js","mtime":"2024-06-10T19:15:28+03:00","size":3,"digest":"6a3cf5192354f71615ac51034b3e97c20eda99643fcaf5bbe6d41ad59bd12167","integrity":"sha256-ajz1GSNU9xYVrFEDSz6Xwg7amWQ/yvW75tQa1ZvRIWc="},"4_0_release_notes/rails4_features-5fcf9ff91508738a246a33c1865362c473c5c326109c7f0d3181064f4a094bd6.png":{"logical_path":"4_0_release_notes/rails4_features.png","mtime":"2024-06-10T19:15:28+03:00","size":65840,"digest":"45df3a9e54be99a6ca84766357fb209b9791c41dcedbdf9c075ce37e24c8b2bf","integrity":"sha256-Rd86nlS+mabKhHZjV/sgm5eRxB3O29+cB1zjfiTIsr8="},"active_record_querying/bookstore_models-199956343e0509fc4c7f8382d6fd257a032b0e398da86cdec0bd37987153681d.png":{"logical_path":"active_record_querying/bookstore_models.png","mtime":"2024-06-10T19:15:28+03:00","size":29780,"digest":"da64ec4f98840d1f2244c9baae3f195bd070f468028970b9c21e540a549e8e85","integrity":"sha256-2mTsT5iEDR8iRMm6rj8ZW9Bw9GgCiXC5wh5UClSejoU="},"association_basics/belongs_to-df76734b189960ffcc658e600a816364e36345f12ad95568577152b2a0e616d4.png":{"logical_path":"association_basics/belongs_to.png","mtime":"2024-06-10T19:15:28+03:00","size":21431,"digest":"2effe9e134a078cbf07e61167b86d9496e3fe099e07efc87b8efde04e8989ba4","integrity":"sha256-Lv/p4TSgeMvwfmEWe4bZSW4/4JngfvyHuO/eBOiYm6Q="},"association_basics/habtm-561e5db1b2463863573e41c54c33a4f23b1f7dcb2830c64dc0eb121d15b0b3ec.png":{"logical_path":"association_basics/habtm.png","mtime":"2024-06-10T19:15:28+03:00","size":45968,"digest":"4f165bf95491de3edd4d19072618320e2d726e121386872d05933c785417666e","integrity":"sha256-TxZb+VSR3j7dTRkHJhgyDi1ybhIThoctBZM8eFQXZm4="},"association_basics/has_many-8b67077983ad33c144a0cf2816b641dfd2f1d246be5bd64ca1f7f8a9bf1b9dc1.png":{"logical_path":"association_basics/has_many.png","mtime":"2024-06-10T19:15:28+03:00","size":23833,"digest":"e7841d845983c8fbbd594103f24255dedcd9f1baee5f34a46907ab4e5ec96ad6","integrity":"sha256-54QdhFmDyPu9WUED8kJV3tzZ8bruXzSkaQerTl7JatY="},"association_basics/has_many_through-b8b306c6e3fec380ae60261a3db7ec58a7e50750539433c3993e528c111ec332.png":{"logical_path":"association_basics/has_many_through.png","mtime":"2024-06-10T19:15:28+03:00","size":75349,"digest":"a719dd48cbaa85f305110fbc7aa6e55545e5bbd88ae7a2b922cde22aad144e6e","integrity":"sha256-pxndSMuqhfMFEQ+8eqblVUXlu9iK56K5Is3iKq0UTm4="},"association_basics/has_one-599d92df13b624943d4da29db45549fadcc420bb287a6fd361022d20b4112c98.png":{"logical_path":"association_basics/has_one.png","mtime":"2024-06-10T19:15:28+03:00","size":27470,"digest":"ef318cfadca7d938d6e3d4db2c4d59a992ece1a60a25449eb954b15a9f5e1616","integrity":"sha256-7zGM+tyn2TjW49TbLE1ZqZLs4aYKJUSeuVSxWp9eFhY="},"association_basics/has_one_through-d9cad54a85e7e2e2e334541326ad33c37f2bf84e3e30b8aa80b6e029f889c82a.png":{"logical_path":"association_basics/has_one_through.png","mtime":"2024-06-10T19:15:28+03:00","size":68831,"digest":"4a8a83c0759839bace017f73655e7b9b67f4adf387ca9c4519ceb2e769c8941c","integrity":"sha256-SoqDwHWYObrOAX9zZV57m2f0rfOHypxFGc6y52nIlBw="},"association_basics/polymorphic-a4deb1783f2e5373c0465329e9d3576a7f5f55afd69093f16b3cf6f1629d1cb0.png":{"logical_path":"association_basics/polymorphic.png","mtime":"2024-06-10T19:15:28+03:00","size":62751,"digest":"3bfc9733727731c4fcde9d24743af9e93d4ee97f30bfec93fd5d5d32c664c9c6","integrity":"sha256-O/yXM3J3McT83p0kdDr56T1O6X8wv+yT/V1dMsZkycY="},"docs_preview/annotation-6d979adf84853aa242512d229dfc4c8ee9fc6be7545442c3ec33fbb15d894fda.png":{"logical_path":"docs_preview/annotation.png","mtime":"2024-06-10T19:15:28+03:00","size":9693,"digest":"9b7a5ea53bfcf91d07f3a4b136303c2aff24d468ef69c046ef3cdb2b6a78309c","integrity":"sha256-m3pepTv8+R0H86SxNjA8Kv8k1GjvacBG7zzbK2p4MJw="},"docs_preview/status_checks-582b51790b7a229b6a6c4fd63d8009e093caa40fb7c00dd6e97cf3d56b21e8e1.png":{"logical_path":"docs_preview/status_checks.png","mtime":"2024-06-10T19:15:28+03:00","size":45216,"digest":"a21127a428b8b61fb10b728cedf561ef69023382309b92beb3c039a66c350715","integrity":"sha256-ohEnpCi4th+xC3KM7fVh72kCM4Iwm5K+s8A5pmw1BxU="},"dynamic_method_class_eval-1e35052369fa0d155b591269e91a7812ed1135ffa8fadd66071ec0fd43956797.png":{"logical_path":"dynamic_method_class_eval.png","mtime":"2024-06-10T19:15:28+03:00","size":30728,"digest":"90fb6bbaab36bd7ed9503faf16c5d1f02d290d7fe9008acba29176e41c64ed06","integrity":"sha256-kPtruqs2vX7ZUD+vFsXR8C0pDX/pAIrLopF25Bxk7QY="},"getting_started/article_with_comments-7e5d8551c9ac02f2d28992374b44445c847727aa8d5be1e26dd2db3bded2bc4e.png":{"logical_path":"getting_started/article_with_comments.png","mtime":"2024-06-10T19:15:28+03:00","size":26814,"digest":"6f31d3c50f1a8a14e2b1016d9e7ab9f3e0a59e276e66bd3c5d1c207c2779e89e","integrity":"sha256-bzHTxQ8aihTisQFtnnq58+ClniduZr08XRwgfCd56J4="},"getting_started/challenge-f112fb88a11ab2263c2f7a017e2cbeba089f799477c33d5a09c968bcc90fd62b.png":{"logical_path":"getting_started/challenge.png","mtime":"2024-06-10T19:15:28+03:00","size":20347,"digest":"f22220a92bfb0b4a15afa34a66f34c9e055023e586876dd3529c043515cd08eb","integrity":"sha256-8iIgqSv7C0oVr6NKZvNMngVQI+WGh23TUpwENRXNCOs="},"getting_started/rails_welcome-15373024c21047e1628acfdbd4203cf98396e3fffdaa72d345a871feb66cfbbf.png":{"logical_path":"getting_started/rails_welcome.png","mtime":"2024-06-10T19:15:28+03:00","size":42246,"digest":"1dbfbbbbcfd59cf719343f49ec2ea637c0e08806dcfc7a97c2061d4b8b482b06","integrity":"sha256-Hb+7u8/VnPcZND9J7C6mN8DgiAbc/HqXwgYdS4tIKwY="},"github-7cc23602a5ac2465f14c19492358a5a67dc24636761cc723e4d621cea0c09225.png":{"logical_path":"github.png","mtime":"2024-06-10T19:15:28+03:00","size":16868,"digest":"cb6843f5a5c77d9226a1fdeeb1994398099eb548a5dab628e3ea272acdc830a5","integrity":"sha256-y2hD9aXHfZImof3usZlDmAmetUil2rYo4+onKs3IMKU="},"i18n/demo_html_safe-47afb910043f21996f5abc5f5f3814f26935d560ff365f79311fffba55b2b2fb.png":{"logical_path":"i18n/demo_html_safe.png","mtime":"2024-06-10T19:15:28+03:00","size":9860,"digest":"f4497a049cbaee51d73497f2c6e4ba57512e73c876195faf684b4fc76ad9f83d","integrity":"sha256-9El6BJy67lHXNJfyxuS6V1Euc8h2GV+vaEtPx2rZ+D0="},"i18n/demo_localized_pirate-225ed1f7671118d9d29e97f28ba9f34195ad53606b24cbfae406ec5eacb93dd2.png":{"logical_path":"i18n/demo_localized_pirate.png","mtime":"2024-06-10T19:15:28+03:00","size":11214,"digest":"3630593e1895149d94916564593ec2eeda51ea984f3b99129a1a819964555ea1","integrity":"sha256-NjBZPhiVFJ2UkWVkWT7C7tpR6phPO5kSmhqBmWRVXqE="},"i18n/demo_translated_en-83de4d3d7ffa1d79d26279adede1173ffcf24ea8341645ff30467ea500ee3364.png":{"logical_path":"i18n/demo_translated_en.png","mtime":"2024-06-10T19:15:28+03:00","size":9069,"digest":"e3a4c72fee5e7486bd83049dd8b593d7a5f652ccdd80de487acfa42aaa707ee8","integrity":"sha256-46THL+5edIa9gwSd2LWT16X2UszdgN5Ies+kKqpwfug="},"i18n/demo_translated_pirate-0f6e2f38fcaf255732c1c3a66277a0c5f74a8e3698082d8ea7ed0d5b4036b08b.png":{"logical_path":"i18n/demo_translated_pirate.png","mtime":"2024-06-10T19:15:28+03:00","size":9974,"digest":"e8ae39329898d8e869944e583ee103c06e00a499c4bd3d0d5ce085b2ded54430","integrity":"sha256-6K45MpiY2OhplE5YPuEDwG4ApJnEvT0NXOCFst7VRDA="},"i18n/demo_translation_missing-49aed4aac1ba76039482397578da7c985479fa1ace51061113a8f244cb193020.png":{"logical_path":"i18n/demo_translation_missing.png","mtime":"2024-06-10T19:15:28+03:00","size":9984,"digest":"7061bfc17a998f05f1580a0afc542ea77f92c017fb8e431207f603d52092c2f0","integrity":"sha256-cGG/wXqZjwXxWAoK/FQup3+SwBf7jkMSB/YD1SCSwvA="},"i18n/demo_untranslated-6c47b4850770520293deaf7fcc55005ec56bf6c5e0664490cddd33c654944739.png":{"logical_path":"i18n/demo_untranslated.png","mtime":"2024-06-10T19:15:28+03:00","size":8985,"digest":"49db80ee41e79a8eceb0c21145f471a21e53d7722dce1c8041f001b9cda499f9","integrity":"sha256-SduA7kHnmo7OsMIRRfRxoh5T13ItzhyAQfABuc2kmfk="},"partners/mkdev/ageev-9da7e9087fe79fb08b100a582f86612af09f9da7e4bd4fca0efc2ac65078571c.png":{"logical_path":"partners/mkdev/ageev.png","mtime":"2024-06-10T19:15:28+03:00","size":18288,"digest":"53992f3082a6333f1bba0ecf35c05d6154a90f17c0075084dc3e9d75e24162e0","integrity":"sha256-U5kvMIKmMz8bug7PNcBdYVSpDxfAB1CE3D6ddeJBYuA="},"partners/mkdev/banner0519-9493099d0eae9452a4c066bf982a54f2f66f48cbf4903b86fcfaa173311f1236.png":{"logical_path":"partners/mkdev/banner0519.png","mtime":"2024-06-10T19:15:28+03:00","size":13590,"digest":"38de6f53a05a5b81416dcb2d2f76de3eebe5b074f58263052f23457bcdebd10a","integrity":"sha256-ON5vU6BaW4FBbcstL3bePuvlsHT1gmMFLyNFe83r0Qo="},"partners/mkdev/banner120619-f9f88b8893ddf6e162602829979d53fc70285bb19ff27f5a78675ecad9abf730.png":{"logical_path":"partners/mkdev/banner120619.png","mtime":"2024-06-10T19:15:28+03:00","size":29489,"digest":"330954c92e5fecf6940d82a44bc654c1e8080eb7c972772ce9a925b7e0840291","integrity":"sha256-MwlUyS5f7PaUDYKkS8ZUwegIDrfJcncs6aklt+CEApE="},"partners/mkdev/blackfriday-1b9089ad7c6daa786747fce9db5f7c80ef6decca784f8bb220917d99e86f9b87.png":{"logical_path":"partners/mkdev/blackfriday.png","mtime":"2024-06-10T19:15:28+03:00","size":42386,"digest":"56a691602c07e4edad0c4a769eb0b0d04e1c688a7f20858c3b20283cee46b009","integrity":"sha256-VqaRYCwH5O2tDEp2nrCw0E4caIp/IIWMOyAoPO5GsAk="},"partners/mkdev/expertise-2-279e8f4581f18ff36d03806d297e951a2f6767c5a057c47c11b86b0e43eb7219.png":{"logical_path":"partners/mkdev/expertise-2.png","mtime":"2024-06-10T19:15:28+03:00","size":21416,"digest":"ce09203cc4e9cbbebe785ec88269ccd1ee93c196780694539cb60aa9fbd27d03","integrity":"sha256-zgkgPMTpy76+eF7IgmnM0e6TwZZ4BpRTnLYKqfvSfQM="},"partners/mkdev/expertise-351760e00367868c8691a7702fa5873513b14a73626f2f8c429448ecf1ccf11b.png":{"logical_path":"partners/mkdev/expertise.png","mtime":"2024-06-10T19:15:28+03:00","size":84006,"digest":"8a071ee73f1802802d47c731db218aa7e47c56248ed1c6fbab2e9091e354af04","integrity":"sha256-igce5z8YAoAtR8cx2yGKp+R8ViSO0cb7qy6QkeNUrwQ="},"partners/mkdev/mekhonoshin-e9b9e90e61c366299c1c1f842c2c6f16a27680928b470c8096c4c239022f5acb.png":{"logical_path":"partners/mkdev/mekhonoshin.png","mtime":"2024-06-10T19:15:28+03:00","size":17034,"digest":"3b31e95fa3bc6c3819826397dc57218aff2ee196fefe8e8a5cac6c986f8cd0d4","integrity":"sha256-OzHpX6O8bDgZgmOX3Fchiv8u4Zb+/o6KXKxsmG+M0NQ="},"partners/mkdev/ror-451dc815a8014e7a17e2647e55ec092e926dc5ffe9aa78759ee765faed292609.png":{"logical_path":"partners/mkdev/ror.png","mtime":"2024-06-10T19:15:28+03:00","size":9516,"digest":"47ac6bdf04a25c9b38275071181307f587363dd005f6f99ba2676128f252dd7a","integrity":"sha256-R6xr3wSiXJs4J1BxGBMH9Yc2PdAF9vmbomdhKPJS3Xo="},"partners/mkdev/shepelev-882504f1486849531587dae4c2c69487e50c3c385cd6fd6fb5d4a4d2a3ea6eef.png":{"logical_path":"partners/mkdev/shepelev.png","mtime":"2024-06-10T19:15:28+03:00","size":14566,"digest":"cc1ddcd29061e39eb8e6da946ab87284e26b441c7937ad28c1bea2f8a2e4f6e1","integrity":"sha256-zB3c0pBh45645tqUarhyhOJrRBx5N60owb6i+KLk9uE="},"partners/mkdev/takarlikov-9df87fae3200fcc7aed8fcf899369e26ae06e7a3e8bb1e8e91d7726990972a7d.png":{"logical_path":"partners/mkdev/takarlikov.png","mtime":"2024-06-10T19:15:28+03:00","size":18660,"digest":"4d1c91ff995f312a97da34d79f929d4da390901d6ad5838f9a68f62a29ba0894","integrity":"sha256-TRyR/5lfMSqX2jTXn5KdTaOQkB1q1YOPmmj2Kim6CJQ="},"partners/railsclub2016-50311f1afe89a78ea763669687e1585398e34f1dfe4c6d8749e95e5b64a292ae.png":{"logical_path":"partners/railsclub2016.png","mtime":"2024-06-10T19:15:28+03:00","size":8730,"digest":"a332d4af3a32f1c02506f837a1b48c52458ff602c674efc25140e3d3b9650c17","integrity":"sha256-ozLUrzoy8cAlBvg3obSMUkWP9gLGdO/CUUDj07llDBc="},"partners/rubyconf2016-4804204872bfe004a71a6e639693f49359a80fac66e4e2e0246c9092943026e1.png":{"logical_path":"partners/rubyconf2016.png","mtime":"2024-06-10T19:15:28+03:00","size":32642,"digest":"7fac85c3eaf5caf5f57940774e2f4aa0ba167f61cbeede55e9287119e8a044c7","integrity":"sha256-f6yFw+r1yvX1eUB3Ti9KoLoWf2HL7t5V6ShxGeigRMc="},"partners/rubyconf2017-4ccbdfc9741e8cb01fef6071f765e10171527c6dcb309b2130f82d5d83c71abf.png":{"logical_path":"partners/rubyconf2017.png","mtime":"2024-06-10T19:15:28+03:00","size":26732,"digest":"11efe6d7a17db3a5cd4c7a4151131ffa85689b10d31387dbe2c4b5a544c97d61","integrity":"sha256-Ee/m16F9s6XNTHpBURMf+oVomxDTE4fb4sS1pUTJfWE="},"partners/spherecon2017-d14fd400acedfbc26648f3afe5c8beb8804cda4f10e968f9269890d9517a7684.jpg":{"logical_path":"partners/spherecon2017.jpg","mtime":"2024-06-10T19:15:28+03:00","size":105188,"digest":"71e9483a98dff8798b88d464b8bfabaa539a7373e1a2aabb93a60ebc86a46f0d","integrity":"sha256-celIOpjf+HmLiNRkuL+rqlOac3Phoqq7k6YOvIakbw0="},"pdficon-7c31e5c1d5f7d3e8938fea0182959ef48dcc2c9c4e40c8a7912c7e033f04e5f3.png":{"logical_path":"pdficon.png","mtime":"2024-06-10T19:15:28+03:00","size":1397,"digest":"f755e8f306b39714f4efa5d7928e1a54b29571e78af77c96c95f950528468cb4","integrity":"sha256-91Xo8wazlxT076XXko4aVLKVceeK93yWyV+VBShGjLQ="},"rails-cd95a25e70dfe61add5a96e11d3fee0f29e9ba2b05099723d57bba7dfa725c8a.png":{"logical_path":"rails.png","mtime":"2024-06-10T19:15:28+03:00","size":6646,"digest":"322506f9917889126e81df2833a6eecdf2e394658d53dad347e9882dd4dbf28e","integrity":"sha256-MiUG+ZF4iRJugd8oM6buzfLjlGWNU9rTR+mILdTb8o4="},"rusrails-54a1a180f3e4a1e24dae01860cd57bd558fbea67d1f55280272e85a09f294c06.png":{"logical_path":"rusrails.png","mtime":"2024-06-10T19:15:28+03:00","size":4588,"digest":"3a40876ce46d08d466ccd82a63b46d181c829b9ac863ff753173a3f0db15a6d5","integrity":"sha256-OkCHbORtCNRmzNgqY7RtGByCm5rIY/91MXOj8NsVptU="},"security/csrf-4a84f41dd2f0432834e10f7227f0fb7086f4f4488568883e94778a8563b00888.png":{"logical_path":"security/csrf.png","mtime":"2024-06-10T19:15:28+03:00","size":32179,"digest":"7948560793297c5c624228b16de6f634e8d788cd4d0fd41524daa58f8afd7a01","integrity":"sha256-eUhWB5MpfFxiQiixbeb2NOjXiM1ND9QVJNqlj4r9egE="},"security/session_fixation-c6e104b81c6c3d376ad6b14ab777ec8abb53199bc0c31c653d5825bc1f8da9df.png":{"logical_path":"security/session_fixation.png","mtime":"2024-06-10T19:15:28+03:00","size":37819,"digest":"abc9c76fbf1579dc6c018fd8009781386856bf929df69860f18d6e3e67cd871d","integrity":"sha256-q8nHb78VedxsAY/YAJeBOGhWv5Kd9phg8Y1uPmfNhx0="},"tab_grey-718dc05cb75fad4a00d17800ab81a53a6ea13c13e5af30bbfadd74c904351e0c.gif":{"logical_path":"tab_grey.gif","mtime":"2024-06-10T19:15:28+03:00","size":4924,"digest":"d6c6c6d6171c9e11011ed763c29af10ea3e0888e069edae1ef4c5430eb155fdf","integrity":"sha256-1sbG1hccnhEBHtdjwprxDqPgiI4Gntrh70xUMOsVX98="},"tab_info-30838425e4f419c0f6ca37dd3d9ee734d1490bea82f872c5815b46d0f602c973.gif":{"logical_path":"tab_info.gif","mtime":"2024-06-10T19:15:28+03:00","size":4762,"digest":"31d527dc8b8bb0237f8b7b789c0789584ebb81c9f7206f3dcdb89e466362e863","integrity":"sha256-MdUn3IuLsCN/i3t4nAeJWE67gcn3IG89zbieRmNi6GM="},"tab_note-ac4f8650369366d8208180dd77d818c7d747a8c780320c3c568d95789a243e2b.gif":{"logical_path":"tab_note.gif","mtime":"2024-06-10T19:15:28+03:00","size":4807,"digest":"b5aa9533414ac43e98a64134345750ad73f8f65c9668d49a2213ced5443820b3","integrity":"sha256-taqVM0FKxD6YpkE0NFdQrXP49lyWaNSaIhPO1UQ4ILM="},"tab_red-ec2e40047d5e8798e91ee6d28cd58eec85aa94297976fabadf48e3377281b75c.gif":{"logical_path":"tab_red.gif","mtime":"2024-06-10T19:15:28+03:00","size":4753,"digest":"649b059be226a5d79c8460903880c9f0a6ab6146dbcd472b35bb73de8903c143","integrity":"sha256-ZJsFm+ImpdechGCQOIDJ8KarYUbbzUcrNbtz3okDwUM="},"twitter-50e0e767c8793dec313a7dc5cfbcfe2067e3e89ea6ec64784eb7c6640f578758.png":{"logical_path":"twitter.png","mtime":"2024-06-10T19:15:28+03:00","size":17548,"digest":"241515185a67986d51d7a6e5b9a08c066290bc97ed3038375e5b41cdd867d5c8","integrity":"sha256-JBUVGFpnmG1R16bluaCMBmKQvJftMDg3XltBzdhn1cg="},"application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js":{"logical_path":"application.js","mtime":"2024-06-10T19:15:28+03:00","size":378179,"digest":"7ada6cbd2b8bf4dcc28343d0a2d1b42cc0000e4bd7e03191832f1f97d9cd4ec9","integrity":"sha256-etpsvSuL9NzCg0PQotG0LMAADkvX4DGRgy8fl9nNTsk="},"layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js":{"logical_path":"layout.js","mtime":"2024-06-10T19:15:28+03:00","size":862,"digest":"ea31f883d602665a2a51117e7e2c90f90f7c937ec19f5049d8bba1b7e73ed574","integrity":"sha256-6jH4g9YCZloqURF+fiyQ+Q98k37Bn1BJ2Luht+c+1XQ="},"app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css":{"logical_path":"app.css","mtime":"2024-06-10T19:15:28+03:00","size":843,"digest":"9001c842e13ca2ab2973027165043c149c811ba4abe736f334bc7952ae8890e3","integrity":"sha256-kAHIQuE8oqspcwJxZQQ8FJyBG6Sr5zbzNLx5Uq6IkOM="},"application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css":{"logical_path":"application.css","mtime":"2024-06-10T19:15:28+03:00","size":352928,"digest":"b048a46c60c512b73e292a1bb8dbbbdaee3d30da0fe127261dda39a401f2a4e6","integrity":"sha256-sEikbGDFErc+KSobuNu72u49MNoP4ScmHdo5pAHypOY="},"bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css":{"logical_path":"bootstrap_and_overrides.css","mtime":"2024-06-10T19:15:28+03:00","size":343913,"digest":"ce1f7912d022746fcd64d5dbca8f75f7da7e410f565c17eb5f5b89a41d6624f0","integrity":"sha256-zh95EtAidG/NZNXbyo9199p+QQ9WXBfrX1uJpB1mJPA="},"layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css":{"logical_path":"layout.css","mtime":"2024-06-10T19:15:28+03:00","size":2936,"digest":"7edcdb25fb7f8116e950776e0f2524afa5b35b186acf50da0dcad5ce2b7d649a","integrity":"sha256-ftzbJft/gRbpUHduDyUkr6WzWxhqz1DaDcrVzit9ZJo="},"pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css":{"logical_path":"pages.css","mtime":"2024-06-10T19:15:28+03:00","size":1592,"digest":"3890e3ee471703c067b9087db07b3a2531e13c3687cc1092ff823d693b19f1d6","integrity":"sha256-OJDj7kcXA8BnuQh9sHs6JTHhPDaHzBCS/4I9aTsZ8dY="},"search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css":{"logical_path":"search.css","mtime":"2024-06-10T19:15:28+03:00","size":299,"digest":"dbab1107e31bf20a92faaff18c4f9dda618abd4ade2e8a01339c0a99487e6e31","integrity":"sha256-26sRB+Mb8gqS+q/xjE+d2mGKvUreLooBM5wKmUh+bjE="},"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js":{"logical_path":"actiontext.js","mtime":"2024-06-10T19:15:28+03:00","size":30457,"digest":"bcc99d511868dd8b36e6a36485cfcb08299e8d5ed60749987b16486bc7d9fec4","integrity":"sha256-vMmdURho3Ys25qNkhc/LCCmejV7WB0mYexZIa8fZ/sQ="},"trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js":{"logical_path":"trix.js","mtime":"2024-06-10T19:15:28+03:00","size":230043,"digest":"88088eca6500fc4cc5977dd8b216a6efa077f51abd3e6fc5de3f38e3c036e6e1","integrity":"sha256-iAiOymUA/EzFl33Ysham76B39Rq9Pm/F3j8448A25uE="},"trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css":{"logical_path":"trix.css","mtime":"2024-06-10T19:15:28+03:00","size":16020,"digest":"f96f8d0938c5575b8ede0747009dad85620c459aa498f816d2874b269fcd2d08","integrity":"sha256-+W+NCTjFV1uO3gdHAJ2thWIMRZqkmPgW0odLJp/NLQg="},"glyphicons-halflings-80dfe6854eab05fef99752d65528b45078554ce65a627dd140d535da5509cbc8.png":{"logical_path":"glyphicons-halflings.png","mtime":"2024-06-10T19:15:28+03:00","size":12799,"digest":"d99e3fa32c641032f08149914b28c2dc6acf2ec62f70987f2259eabbfa7fc0de","integrity":"sha256-2Z4/oyxkEDLwgUmRSyjC3GrPLsYvcJh/Ilnqu/p/wN4="},"glyphicons-halflings-white-0f383ca656fb92a3438f873049f4c292f09f463a873b6e214a4ccce6d2fc0165.png":{"logical_path":"glyphicons-halflings-white.png","mtime":"2024-06-10T19:15:28+03:00","size":8777,"digest":"f0e0d95a9c8abcdfabf46348e2d4285829bb0491f5f6af0e05af52bffb6324c4","integrity":"sha256-8ODZWpyKvN+r9GNI4tQoWCm7BJH19q8OBa9Sv/tjJMQ="},"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js":{"logical_path":"activestorage.js","mtime":"2024-06-10T19:15:28+03:00","size":29045,"digest":"718a3b7737430511519d7175a20269953d97a1252acb0c17e9f7ffe5cac4f4a7","integrity":"sha256-cYo7dzdDBRFRnXF1ogJplT2XoSUqywwX6ff/5crE9Kc="},"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js":{"logical_path":"activestorage.esm.js","mtime":"2024-06-10T19:15:28+03:00","size":26992,"digest":"a10bcef9e766c86260e93966fa6f2fe5efb8b03c744634d8bf0b835eca5414ca","integrity":"sha256-oQvO+edmyGJg6Tlm+m8v5e+4sDx0RjTYvwuDXspUFMo="},"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js":{"logical_path":"actioncable.js","mtime":"2024-06-10T19:15:28+03:00","size":15699,"digest":"6b2fe44d9e4546fcc6b92f0a37b61d6b555020041ede1dd603c007b1c0904ec1","integrity":"sha256-ay/kTZ5FRvzGuS8KN7Yda1VQIAQe3h3WA8AHscCQTsE="},"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js":{"logical_path":"actioncable.esm.js","mtime":"2024-06-10T19:15:28+03:00","size":14080,"digest":"a9e53dfa810276aa0aee8791a910c4878d48b75093398f3d6d822db41b428b7b","integrity":"sha256-qeU9+oECdqoK7oeRqRDEh41It1CTOY89bYIttBtCi3s="}},"assets":{"manifest.js":"manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js","4_0_release_notes/rails4_features.png":"4_0_release_notes/rails4_features-5fcf9ff91508738a246a33c1865362c473c5c326109c7f0d3181064f4a094bd6.png","active_record_querying/bookstore_models.png":"active_record_querying/bookstore_models-199956343e0509fc4c7f8382d6fd257a032b0e398da86cdec0bd37987153681d.png","association_basics/belongs_to.png":"association_basics/belongs_to-df76734b189960ffcc658e600a816364e36345f12ad95568577152b2a0e616d4.png","association_basics/habtm.png":"association_basics/habtm-561e5db1b2463863573e41c54c33a4f23b1f7dcb2830c64dc0eb121d15b0b3ec.png","association_basics/has_many.png":"association_basics/has_many-8b67077983ad33c144a0cf2816b641dfd2f1d246be5bd64ca1f7f8a9bf1b9dc1.png","association_basics/has_many_through.png":"association_basics/has_many_through-b8b306c6e3fec380ae60261a3db7ec58a7e50750539433c3993e528c111ec332.png","association_basics/has_one.png":"association_basics/has_one-599d92df13b624943d4da29db45549fadcc420bb287a6fd361022d20b4112c98.png","association_basics/has_one_through.png":"association_basics/has_one_through-d9cad54a85e7e2e2e334541326ad33c37f2bf84e3e30b8aa80b6e029f889c82a.png","association_basics/polymorphic.png":"association_basics/polymorphic-a4deb1783f2e5373c0465329e9d3576a7f5f55afd69093f16b3cf6f1629d1cb0.png","docs_preview/annotation.png":"docs_preview/annotation-6d979adf84853aa242512d229dfc4c8ee9fc6be7545442c3ec33fbb15d894fda.png","docs_preview/status_checks.png":"docs_preview/status_checks-582b51790b7a229b6a6c4fd63d8009e093caa40fb7c00dd6e97cf3d56b21e8e1.png","dynamic_method_class_eval.png":"dynamic_method_class_eval-1e35052369fa0d155b591269e91a7812ed1135ffa8fadd66071ec0fd43956797.png","getting_started/article_with_comments.png":"getting_started/article_with_comments-7e5d8551c9ac02f2d28992374b44445c847727aa8d5be1e26dd2db3bded2bc4e.png","getting_started/challenge.png":"getting_started/challenge-f112fb88a11ab2263c2f7a017e2cbeba089f799477c33d5a09c968bcc90fd62b.png","getting_started/rails_welcome.png":"getting_started/rails_welcome-15373024c21047e1628acfdbd4203cf98396e3fffdaa72d345a871feb66cfbbf.png","github.png":"github-7cc23602a5ac2465f14c19492358a5a67dc24636761cc723e4d621cea0c09225.png","i18n/demo_html_safe.png":"i18n/demo_html_safe-47afb910043f21996f5abc5f5f3814f26935d560ff365f79311fffba55b2b2fb.png","i18n/demo_localized_pirate.png":"i18n/demo_localized_pirate-225ed1f7671118d9d29e97f28ba9f34195ad53606b24cbfae406ec5eacb93dd2.png","i18n/demo_translated_en.png":"i18n/demo_translated_en-83de4d3d7ffa1d79d26279adede1173ffcf24ea8341645ff30467ea500ee3364.png","i18n/demo_translated_pirate.png":"i18n/demo_translated_pirate-0f6e2f38fcaf255732c1c3a66277a0c5f74a8e3698082d8ea7ed0d5b4036b08b.png","i18n/demo_translation_missing.png":"i18n/demo_translation_missing-49aed4aac1ba76039482397578da7c985479fa1ace51061113a8f244cb193020.png","i18n/demo_untranslated.png":"i18n/demo_untranslated-6c47b4850770520293deaf7fcc55005ec56bf6c5e0664490cddd33c654944739.png","partners/mkdev/ageev.png":"partners/mkdev/ageev-9da7e9087fe79fb08b100a582f86612af09f9da7e4bd4fca0efc2ac65078571c.png","partners/mkdev/banner0519.png":"partners/mkdev/banner0519-9493099d0eae9452a4c066bf982a54f2f66f48cbf4903b86fcfaa173311f1236.png","partners/mkdev/banner120619.png":"partners/mkdev/banner120619-f9f88b8893ddf6e162602829979d53fc70285bb19ff27f5a78675ecad9abf730.png","partners/mkdev/blackfriday.png":"partners/mkdev/blackfriday-1b9089ad7c6daa786747fce9db5f7c80ef6decca784f8bb220917d99e86f9b87.png","partners/mkdev/expertise-2.png":"partners/mkdev/expertise-2-279e8f4581f18ff36d03806d297e951a2f6767c5a057c47c11b86b0e43eb7219.png","partners/mkdev/expertise.png":"partners/mkdev/expertise-351760e00367868c8691a7702fa5873513b14a73626f2f8c429448ecf1ccf11b.png","partners/mkdev/mekhonoshin.png":"partners/mkdev/mekhonoshin-e9b9e90e61c366299c1c1f842c2c6f16a27680928b470c8096c4c239022f5acb.png","partners/mkdev/ror.png":"partners/mkdev/ror-451dc815a8014e7a17e2647e55ec092e926dc5ffe9aa78759ee765faed292609.png","partners/mkdev/shepelev.png":"partners/mkdev/shepelev-882504f1486849531587dae4c2c69487e50c3c385cd6fd6fb5d4a4d2a3ea6eef.png","partners/mkdev/takarlikov.png":"partners/mkdev/takarlikov-9df87fae3200fcc7aed8fcf899369e26ae06e7a3e8bb1e8e91d7726990972a7d.png","partners/railsclub2016.png":"partners/railsclub2016-50311f1afe89a78ea763669687e1585398e34f1dfe4c6d8749e95e5b64a292ae.png","partners/rubyconf2016.png":"partners/rubyconf2016-4804204872bfe004a71a6e639693f49359a80fac66e4e2e0246c9092943026e1.png","partners/rubyconf2017.png":"partners/rubyconf2017-4ccbdfc9741e8cb01fef6071f765e10171527c6dcb309b2130f82d5d83c71abf.png","partners/spherecon2017.jpg":"partners/spherecon2017-d14fd400acedfbc26648f3afe5c8beb8804cda4f10e968f9269890d9517a7684.jpg","pdficon.png":"pdficon-7c31e5c1d5f7d3e8938fea0182959ef48dcc2c9c4e40c8a7912c7e033f04e5f3.png","rails.png":"rails-cd95a25e70dfe61add5a96e11d3fee0f29e9ba2b05099723d57bba7dfa725c8a.png","rusrails.png":"rusrails-54a1a180f3e4a1e24dae01860cd57bd558fbea67d1f55280272e85a09f294c06.png","security/csrf.png":"security/csrf-4a84f41dd2f0432834e10f7227f0fb7086f4f4488568883e94778a8563b00888.png","security/session_fixation.png":"security/session_fixation-c6e104b81c6c3d376ad6b14ab777ec8abb53199bc0c31c653d5825bc1f8da9df.png","tab_grey.gif":"tab_grey-718dc05cb75fad4a00d17800ab81a53a6ea13c13e5af30bbfadd74c904351e0c.gif","tab_info.gif":"tab_info-30838425e4f419c0f6ca37dd3d9ee734d1490bea82f872c5815b46d0f602c973.gif","tab_note.gif":"tab_note-ac4f8650369366d8208180dd77d818c7d747a8c780320c3c568d95789a243e2b.gif","tab_red.gif":"tab_red-ec2e40047d5e8798e91ee6d28cd58eec85aa94297976fabadf48e3377281b75c.gif","twitter.png":"twitter-50e0e767c8793dec313a7dc5cfbcfe2067e3e89ea6ec64784eb7c6640f578758.png","application.js":"application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js","layout.js":"layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js","app.css":"app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css","application.css":"application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css","bootstrap_and_overrides.css":"bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css","layout.css":"layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css","pages.css":"pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css","search.css":"search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css","actiontext.js":"actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js","trix.js":"trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js","trix.css":"trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css","glyphicons-halflings.png":"glyphicons-halflings-80dfe6854eab05fef99752d65528b45078554ce65a627dd140d535da5509cbc8.png","glyphicons-halflings-white.png":"glyphicons-halflings-white-0f383ca656fb92a3438f873049f4c292f09f463a873b6e214a4ccce6d2fc0165.png","activestorage.js":"activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js","activestorage.esm.js":"activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js","actioncable.js":"actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js","actioncable.esm.js":"actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js"}}
\ No newline at end of file
diff --git a/assets/actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js.gz b/assets/actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js.gz
index d7b0bb6..09d8ad8 100644
Binary files a/assets/actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js.gz and b/assets/actioncable-5433453f9b6619a9de91aaab2d7fc7ff183e5260c0107cbc9a1aa0c838d9a74e.js.gz differ
diff --git a/assets/actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js.gz b/assets/actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js.gz
index 6e7f98f..21e8065 100644
Binary files a/assets/actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js.gz and b/assets/actioncable.esm-e01089c3ec4fe7817fa9abcad06cab6bdc387f95f0ca6aab4bf7ba7537f70690.js.gz differ
diff --git a/assets/actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js.gz b/assets/actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js.gz
index e3cde16..311bab5 100644
Binary files a/assets/actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js.gz and b/assets/actiontext-28c61f5197c204db043317a8f8826a87ab31495b741f854d307ca36122deefce.js.gz differ
diff --git a/assets/activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js.gz b/assets/activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js.gz
index daf2d6a..65c2b0d 100644
Binary files a/assets/activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js.gz and b/assets/activestorage-3ab61e47dd4ee2d79db525ade1dca2ede0ea2b7371fe587e408ee37b7ade265d.js.gz differ
diff --git a/assets/activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js.gz b/assets/activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js.gz
index 8a48bba..6ed0dd0 100644
Binary files a/assets/activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js.gz and b/assets/activestorage.esm-01f58a45d77495cdfbdfcc872902a430426c4391634ec9c3da5f69fbf8418492.js.gz differ
diff --git a/assets/app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css.gz b/assets/app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css.gz
index 7e7fdbd..379236f 100644
Binary files a/assets/app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css.gz and b/assets/app-04cb8914b96de6a5b4fea29d4d52c3f24358ed6ae192b06ca896efc78bc23f0e.css.gz differ
diff --git a/assets/application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js.gz b/assets/application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js.gz
index 565f837..bcc7a90 100644
Binary files a/assets/application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js.gz and b/assets/application-8ee447905888b153d8458707061a14b1f15f69b6733e871a3ad91d80ae89e87b.js.gz differ
diff --git a/assets/application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css.gz b/assets/application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css.gz
index 8227fa0..a29d51a 100644
Binary files a/assets/application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css.gz and b/assets/application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css.gz differ
diff --git a/assets/bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css.gz b/assets/bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css.gz
index 8b40194..be1e89f 100644
Binary files a/assets/bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css.gz and b/assets/bootstrap_and_overrides-97e2e6b2914f7da31b55d1dd4f1ac2bfea2cfb3800214f1fc1bb271d0bdf93f1.css.gz differ
diff --git a/assets/layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js.gz b/assets/layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js.gz
index d65ad49..55d2a8a 100644
Binary files a/assets/layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js.gz and b/assets/layout-b3b24a134b4e13172ded351cf72e4b92773de8777dbb40b7df326580f9623f99.js.gz differ
diff --git a/assets/layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css.gz b/assets/layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css.gz
index 4b8ca17..6e7ab74 100644
Binary files a/assets/layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css.gz and b/assets/layout-d9d46e028dcb031d1ecb0725914f203843949d3545b00627c84e9ce0f296782d.css.gz differ
diff --git a/assets/manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js.gz b/assets/manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js.gz
index 7b56ecc..6732230 100644
Binary files a/assets/manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js.gz and b/assets/manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js.gz differ
diff --git a/assets/pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css.gz b/assets/pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css.gz
index f8ec8b8..08ff318 100644
Binary files a/assets/pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css.gz and b/assets/pages-83bc36d523afa3c798a2e904b254131d48924bde9c9bebd63ba414188a3fdc9c.css.gz differ
diff --git a/assets/search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css.gz b/assets/search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css.gz
index 7189f1c..f8d28e3 100644
Binary files a/assets/search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css.gz and b/assets/search-4567e198cfe77c40c5c184d1ce313b505995a82a5df043e9e7b9575212ab5560.css.gz differ
diff --git a/assets/trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css.gz b/assets/trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css.gz
index abfca17..7d0b948 100644
Binary files a/assets/trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css.gz and b/assets/trix-4e57e9c023438a5c7149651eb98fd76e386baf845f9beb46a2c2dbb6cad38d30.css.gz differ
diff --git a/assets/trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js.gz b/assets/trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js.gz
index 5725d58..5680e64 100644
Binary files a/assets/trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js.gz and b/assets/trix-df2bf484e34719e3b4933ba6bc3139eb1e7ad4fbbedb13bbd04be4d80b42664a.js.gz differ