railties 8.1.0.beta1 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -1
  3. data/lib/rails/application/bootstrap.rb +1 -1
  4. data/lib/rails/application/configuration.rb +5 -9
  5. data/lib/rails/code_statistics.rb +4 -1
  6. data/lib/rails/commands/app/update_command.rb +1 -0
  7. data/lib/rails/gem_version.rb +1 -1
  8. data/lib/rails/generators/app_base.rb +12 -0
  9. data/lib/rails/generators/rails/app/app_generator.rb +6 -5
  10. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +5 -3
  11. data/lib/rails/generators/rails/app/templates/Gemfile.tt +3 -1
  12. data/lib/rails/generators/rails/app/templates/config/ci.rb.tt +4 -0
  13. data/lib/rails/generators/rails/app/templates/config/deploy.yml.tt +16 -11
  14. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +3 -0
  15. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +2 -14
  16. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_8_1.rb.tt +8 -0
  17. data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +7 -3
  18. data/lib/rails/generators/rails/app/templates/kamal-secrets.tt +1 -1
  19. data/lib/rails/generators/rails/app/templates/public/400.html +25 -4
  20. data/lib/rails/generators/rails/app/templates/public/404.html +25 -4
  21. data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +25 -4
  22. data/lib/rails/generators/rails/app/templates/public/422.html +25 -4
  23. data/lib/rails/generators/rails/app/templates/public/500.html +25 -4
  24. data/lib/rails/generators/rails/authentication/authentication_generator.rb +0 -9
  25. data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.html.erb.tt +3 -1
  26. data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.text.erb.tt +3 -1
  27. data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +1 -1
  28. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +1 -1
  29. data/lib/rails/generators/rails/plugin/plugin_generator.rb +1 -0
  30. data/lib/rails/generators/rails/plugin/templates/Rakefile.tt +0 -4
  31. data/lib/rails/generators/test_unit/authentication/authentication_generator.rb +12 -0
  32. data/lib/rails/generators/{rails → test_unit}/authentication/templates/test/test_helpers/session_test_helper.rb.tt +6 -2
  33. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +4 -2
  34. data/lib/rails/info_controller.rb +2 -2
  35. data/lib/rails/tasks/statistics.rake +3 -21
  36. data/lib/rails/tasks.rb +1 -3
  37. data/lib/rails/templates/rails/mailers/email.html.erb +1 -1
  38. data/lib/rails/templates/rails/welcome/index.html.erb +2 -2
  39. metadata +12 -13
  40. data/lib/rails/console/methods.rb +0 -7
  41. /data/lib/rails/generators/{rails → test_unit}/authentication/templates/test/mailers/previews/passwords_mailer_preview.rb.tt +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f96d0bd7304aebd3f5b4067354bd24c00ad034b34b03454275124bda2ef80371
4
- data.tar.gz: 2d8e046700f53160f821f70ceb11f6cf8799fc9654ba8f4b73d283240d8f7259
3
+ metadata.gz: ad8da0555d797f82b2d0201539e2b87d71a4a034693160ce5f1a695bb2fba206
4
+ data.tar.gz: 7141209b64c173556b4e68710077f2020a0e4d1f78849f189b618ae5aadf0323
5
5
  SHA512:
6
- metadata.gz: 031c43f3c487649f1d6a83622afd3d438aa437e259864372c685b5e720b8b636cecbf7bf083afb58219b20120059c85ebf9bdfdb756afdbd59e713d7443a6f98
7
- data.tar.gz: 0d2eb2b9519a859362aa6eda717ba8b0a9ef54fa975824f76c295f84e1750d2c30a3d5b9b0983e075c8bf1b89a2d80c6c3b469952920bd5537ed728d4b140e62
6
+ metadata.gz: eb16ac913da82747b4d06e8c7578ccc830219010f1ef5846305f2f6640a84f08df45f191f76899b6449d7dd85903a7e89f236b33cb8c83daef7f46863f86cf6f
7
+ data.tar.gz: badbe8ab05d917deed317baf5d1b8adbb339c95ed6bd0ea01f13c6d61ff41d270e49b27624d0d27f94625bb26466f141506638b44c6e2936b5b99d281f748fb5
data/CHANGELOG.md CHANGED
@@ -1,4 +1,59 @@
1
- ## Rails 8.1.0.beta1 (September 04, 2025) ##
1
+ ## Rails 8.1.0 (October 22, 2025) ##
2
+
3
+ * Suggest `bin/rails action_text:install` from Action Dispatch error page
4
+
5
+ *Sean Doyle*
6
+
7
+ * Remove deprecated `STATS_DIRECTORIES`.
8
+
9
+ *Rafael Mendonça França*
10
+
11
+ * Remove deprecated `bin/rake stats` command.
12
+
13
+ *Rafael Mendonça França*
14
+
15
+ * Remove deprecated `rails/console/methods.rb` file.
16
+
17
+ *Rafael Mendonça França*
18
+
19
+ * Don't generate system tests by default.
20
+
21
+ Rails scaffold generator will no longer generate system tests by default. To enable this pass `--system-tests=true` or generate them with `bin/rails generate system_test name_of_test`.
22
+
23
+ *Eileen M. Uchitelle*
24
+
25
+ * Optionally skip bundler-audit.
26
+
27
+ Skips adding the `bin/bundler-audit` & `config/bundler-audit.yml` if the gem is not installed when `bin/rails app:update` runs.
28
+
29
+ Passes an option to `--skip-bundler-audit` when new apps are generated & adds that same option to the `--minimal` generator flag.
30
+
31
+ *Jill Klang*
32
+
33
+ * Show engine routes in `/rails/info/routes` as well.
34
+
35
+ *Petrik de Heus*
36
+
37
+ * Exclude `asset_path` configuration from Kamal `deploy.yml` for API applications.
38
+
39
+ API applications don't serve assets, so the `asset_path` configuration in `deploy.yml`
40
+ is not needed and can cause 404 errors on in-flight requests. The asset_path is now
41
+ only included for regular Rails applications that serve assets.
42
+
43
+ *Saiqul Haq*
44
+
45
+ * Reverted the incorrect default `config.public_file_server.headers` config.
46
+
47
+ If you created a new application using Rails `8.1.0.beta1`, make sure to regenerate
48
+ `config/environments/production.rb`, or to manually edit the `config.public_file_server.headers`
49
+ configuration to just be:
50
+
51
+ ```ruby
52
+ # Cache assets for far-future expiry since they are all digest stamped.
53
+ config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" }
54
+ ```
55
+
56
+ *Jean Boussier*
2
57
 
3
58
  * Add command `rails credentials:fetch PATH` to get the value of a credential from the credentials file.
4
59
 
@@ -73,7 +73,7 @@ module Rails
73
73
 
74
74
  initializer :initialize_event_reporter, group: :all do
75
75
  Rails.event.raise_on_error = config.consider_all_requests_local
76
- Rails.event.debug_mode = config.consider_all_requests_local
76
+ Rails.event.debug_mode = Rails.env.development?
77
77
  end
78
78
 
79
79
  # Initialize cache early in the stack so railties can make use of it.
@@ -117,10 +117,6 @@ module Rails
117
117
  action_controller.forgery_protection_origin_check = true
118
118
  end
119
119
 
120
- if respond_to?(:active_support)
121
- active_support.to_time_preserves_timezone = :offset
122
- end
123
-
124
120
  if respond_to?(:active_record)
125
121
  active_record.belongs_to_required_by_default = true
126
122
  end
@@ -267,7 +263,7 @@ module Rails
267
263
  end
268
264
 
269
265
  if respond_to?(:action_controller)
270
- action_controller.raise_on_open_redirects = true
266
+ action_controller.action_on_open_redirect = :raise
271
267
  action_controller.wrap_parameters_by_default = true
272
268
  end
273
269
  when "7.1"
@@ -339,10 +335,6 @@ module Rails
339
335
  when "8.0"
340
336
  load_defaults "7.2"
341
337
 
342
- if respond_to?(:active_support)
343
- active_support.to_time_preserves_timezone = :zone
344
- end
345
-
346
338
  if respond_to?(:action_dispatch)
347
339
  action_dispatch.strict_freshness = true
348
340
  end
@@ -365,6 +357,10 @@ module Rails
365
357
  active_record.raise_on_missing_required_finder_order_columns = true
366
358
  end
367
359
 
360
+ if respond_to?(:active_support)
361
+ active_support.escape_js_separators_in_json = false
362
+ end
363
+
368
364
  if respond_to?(:action_view)
369
365
  action_view.render_tracker = :ruby
370
366
  end
@@ -42,8 +42,11 @@ module Rails
42
42
 
43
43
  HEADERS = { lines: " Lines", code_lines: " LOC", classes: "Classes", methods: "Methods" }
44
44
 
45
+ PATTERN = /^(?!\.).*?\.(rb|js|ts|css|scss|coffee|rake|erb)$/
46
+
45
47
  class_attribute :directories, default: DIRECTORIES
46
48
  class_attribute :test_types, default: TEST_TYPES
49
+ class_attribute :pattern, default: PATTERN
47
50
 
48
51
  # Add directories to the output of the <tt>bin/rails stats</tt> command.
49
52
  #
@@ -81,7 +84,7 @@ module Rails
81
84
  Hash[@pairs.map { |pair| [pair.first, calculate_directory_statistics(pair.last)] }]
82
85
  end
83
86
 
84
- def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|css|scss|coffee|rake|erb)$/)
87
+ def calculate_directory_statistics(directory, pattern = self.class.pattern)
85
88
  stats = Rails::CodeStatisticsCalculator.new
86
89
 
87
90
  Dir.foreach(directory) do |file_name|
@@ -73,6 +73,7 @@ module Rails
73
73
  skip_action_text: !defined?(ActionText::Engine),
74
74
  skip_action_cable: !defined?(ActionCable::Engine),
75
75
  skip_brakeman: skip_gem?("brakeman"),
76
+ skip_bundler_audit: skip_gem?("bundler-audit"),
76
77
  skip_rubocop: skip_gem?("rubocop"),
77
78
  skip_thruster: skip_gem?("thruster"),
78
79
  skip_test: !defined?(Rails::TestUnitRailtie),
@@ -10,7 +10,7 @@ module Rails
10
10
  MAJOR = 8
11
11
  MINOR = 1
12
12
  TINY = 0
13
- PRE = "beta1"
13
+ PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -106,6 +106,9 @@ module Rails
106
106
  class_option :skip_brakeman, type: :boolean, default: nil,
107
107
  desc: "Skip brakeman setup"
108
108
 
109
+ class_option :skip_bundler_audit, type: :boolean, default: nil,
110
+ desc: "Skip bundler-audit setup"
111
+
109
112
  class_option :skip_ci, type: :boolean, default: nil,
110
113
  desc: "Skip GitHub CI files"
111
114
 
@@ -400,6 +403,10 @@ module Rails
400
403
  options[:skip_brakeman]
401
404
  end
402
405
 
406
+ def skip_bundler_audit?
407
+ options[:skip_bundler_audit]
408
+ end
409
+
403
410
  def skip_ci?
404
411
  options[:skip_ci]
405
412
  end
@@ -657,6 +664,11 @@ module Rails
657
664
  end
658
665
  end
659
666
 
667
+ def rails_command(command, command_options = {})
668
+ command_options[:capture] = true if options[:quiet]
669
+ super
670
+ end
671
+
660
672
  def bundle_install?
661
673
  !(options[:skip_bundle] || options[:pretend])
662
674
  end
@@ -109,7 +109,7 @@ module Rails
109
109
  end
110
110
 
111
111
  def bin
112
- exclude_pattern = Regexp.union([(/thrust/ if skip_thruster?), (/rubocop/ if skip_rubocop?), (/brakeman/ if skip_brakeman?)].compact)
112
+ exclude_pattern = Regexp.union([(/thrust/ if skip_thruster?), (/rubocop/ if skip_rubocop?), (/brakeman/ if skip_brakeman?), (/bundler-audit/ if skip_bundler_audit?)].compact)
113
113
  directory "bin", { exclude_pattern: exclude_pattern } do |content|
114
114
  "#{shebang}\n" + content
115
115
  end
@@ -127,8 +127,8 @@ module Rails
127
127
  template "routes.rb" unless options[:update]
128
128
  template "application.rb"
129
129
  template "environment.rb"
130
- template "bundler-audit.yml"
131
- template "cable.yml" unless options[:update] || options[:skip_action_cable]
130
+ template "bundler-audit.yml" unless skip_bundler_audit?
131
+ template "cable.yml" unless options[:update] || skip_action_cable?
132
132
  template "ci.rb"
133
133
  template "puma.rb"
134
134
  template "storage.yml" unless options[:update] || skip_active_storage?
@@ -153,7 +153,7 @@ module Rails
153
153
 
154
154
  config
155
155
 
156
- if !options[:skip_action_cable] && !action_cable_config_exist
156
+ if !skip_action_cable? && !action_cable_config_exist
157
157
  template "config/cable.yml"
158
158
  end
159
159
 
@@ -177,7 +177,7 @@ module Rails
177
177
  remove_file "config/initializers/cors.rb"
178
178
  end
179
179
 
180
- if !bundle_audit_config_exist
180
+ if !skip_bundler_audit? && !bundle_audit_config_exist
181
181
  template "config/bundler-audit.yml"
182
182
  end
183
183
 
@@ -317,6 +317,7 @@ module Rails
317
317
  :skip_active_storage,
318
318
  :skip_bootsnap,
319
319
  :skip_brakeman,
320
+ :skip_bundler_audit,
320
321
  :skip_ci,
321
322
  :skip_dev_gems,
322
323
  :skip_docker,
@@ -65,7 +65,8 @@ COPY Gemfile Gemfile.lock vendor ./
65
65
 
66
66
  RUN bundle install && \
67
67
  rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git<% if depend_on_bootsnap? -%> && \
68
- bundle exec bootsnap precompile --gemfile<% end %>
68
+ # -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495
69
+ bundle exec bootsnap precompile -j 1 --gemfile<% end %>
69
70
 
70
71
  <% if using_node? -%>
71
72
  # Install node modules
@@ -83,8 +84,9 @@ RUN bun install --frozen-lockfile
83
84
  COPY . .
84
85
 
85
86
  <% if depend_on_bootsnap? -%>
86
- # Precompile bootsnap code for faster boot times
87
- RUN bundle exec bootsnap precompile app/ lib/
87
+ # Precompile bootsnap code for faster boot times.
88
+ # -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495
89
+ RUN bundle exec bootsnap precompile -j 1 app/ lib/
88
90
 
89
91
  <% end -%>
90
92
  <% unless dockerfile_binfile_fixups.empty? -%>
@@ -42,7 +42,7 @@ gem "thruster", require: false
42
42
  <% unless skip_active_storage? -%>
43
43
 
44
44
  # Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
45
- # gem "image_processing", "~> 1.2"
45
+ gem "image_processing", "~> 1.2"
46
46
  <% end -%>
47
47
  <%- if options.api? -%>
48
48
 
@@ -54,9 +54,11 @@ gem "thruster", require: false
54
54
  group :development, :test do
55
55
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
56
56
  gem "debug", platforms: %i[ mri windows ], require: "debug/prelude"
57
+ <%- unless options.skip_bundler_audit? -%>
57
58
 
58
59
  # Audits gems for known security defects (use config/bundler-audit.yml to ignore issues)
59
60
  gem "bundler-audit", require: false
61
+ <%- end -%>
60
62
  <%- unless options.skip_brakeman? -%>
61
63
 
62
64
  # Static analysis for security vulnerabilities [https://brakemanscanner.org/]
@@ -6,7 +6,9 @@ CI.run do
6
6
  step "Style: Ruby", "bin/rubocop"
7
7
  <% end -%>
8
8
 
9
+ <% unless options.skip_bundler_audit? -%>
9
10
  step "Security: Gem audit", "bin/bundler-audit"
11
+ <% end -%>
10
12
  <% if using_node? -%>
11
13
  step "Security: Yarn vulnerability audit", "yarn audit"
12
14
  <% end -%>
@@ -22,7 +24,9 @@ CI.run do
22
24
  step "Tests: Rails", "bin/rails test"
23
25
  step "Tests: System", "bin/rails test:system"
24
26
  <% end -%>
27
+ <% unless options.skip_active_record? -%>
25
28
  step "Tests: Seeds", "env RAILS_ENV=test bin/rails db:seed:replant"
29
+ <% end -%>
26
30
 
27
31
  # Optional: set a green GitHub commit status to unblock PR merge.
28
32
  # Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`.
@@ -1,8 +1,8 @@
1
1
  # Name of your application. Used to uniquely configure containers.
2
2
  service: <%= app_name %>
3
3
 
4
- # Name of the container image.
5
- image: your-user/<%= app_name %>
4
+ # Name of the container image (use your-user/app-name on external registries).
5
+ image: <%= app_name %>
6
6
 
7
7
  # Deploy to these servers.
8
8
  servers:
@@ -17,19 +17,21 @@ servers:
17
17
  # Remove this section when using multiple web servers and ensure you terminate SSL at your load balancer.
18
18
  #
19
19
  # Note: If using Cloudflare, set encryption mode in SSL/TLS setting to "Full" to enable CF-to-app encryption.
20
- proxy:
21
- ssl: true
22
- host: app.example.com
20
+ # proxy:
21
+ # ssl: true
22
+ # host: app.example.com
23
23
 
24
- # Credentials for your image host.
24
+ # Where you keep your container images.
25
25
  registry:
26
- # Specify the registry server, if you're not using Docker Hub
27
- # server: registry.digitalocean.com / ghcr.io / ...
28
- username: your-user
26
+ # Alternatives: hub.docker.com / registry.digitalocean.com / ghcr.io / ...
27
+ server: localhost:5555
28
+
29
+ # Needed for authenticated registries.
30
+ # username: your-user
29
31
 
30
32
  # Always use an access token rather than real password when possible.
31
- password:
32
- - KAMAL_REGISTRY_PASSWORD
33
+ # password:
34
+ # - KAMAL_REGISTRY_PASSWORD
33
35
 
34
36
  # Inject ENV variables into containers (secrets come from .kamal/secrets).
35
37
  env:
@@ -80,11 +82,14 @@ volumes:
80
82
  - "<%= app_name %>_storage:/rails/storage"
81
83
 
82
84
  <% end -%>
85
+ <% unless options.api? -%>
83
86
  # Bridge fingerprinted assets, like JS and CSS, between versions to avoid
84
87
  # hitting 404 on in-flight requests. Combines all files from new and old
85
88
  # version inside the asset_path.
86
89
  asset_path: /rails/public/assets
87
90
 
91
+ <% end -%>
92
+
88
93
  # Configure the image builder.
89
94
  builder:
90
95
  arch: amd64
@@ -65,6 +65,9 @@ Rails.application.configure do
65
65
  config.active_job.verbose_enqueue_logs = true
66
66
 
67
67
  <%- end -%>
68
+ # Highlight code that triggered redirect in logs.
69
+ config.action_dispatch.verbose_redirect_logs = true
70
+
68
71
  <%- unless options[:skip_asset_pipeline] -%>
69
72
  # Suppress logger output for asset requests.
70
73
  config.assets.quiet = true
@@ -17,20 +17,8 @@ Rails.application.configure do
17
17
  config.action_controller.perform_caching = true
18
18
  <%- end -%>
19
19
 
20
- # Cache digest stamped assets for far-future expiry.
21
- # Short cache for others: robots.txt, sitemap.xml, 404.html, etc.
22
- config.public_file_server.headers = {
23
- "cache-control" => lambda do |path, _|
24
- if path.start_with?("/assets/")
25
- # Files in /assets/ are expected to be fully immutable.
26
- # If the content change the URL too.
27
- "public, immutable, max-age=#{1.year.to_i}"
28
- else
29
- # For anything else we cache for 1 minute.
30
- "public, max-age=#{1.minute.to_i}, stale-while-revalidate=#{5.minutes.to_i}"
31
- end
32
- end
33
- }
20
+ # Cache assets for far-future expiry since they are all digest stamped.
21
+ config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" }
34
22
 
35
23
  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
36
24
  # config.asset_host = "http://assets.example.com"
@@ -27,6 +27,14 @@
27
27
  #++
28
28
  # Rails.configuration.action_controller.escape_json_responses = false
29
29
 
30
+ ###
31
+ # Skips escaping LINE SEPARATOR (U+2028) and PARAGRAPH SEPARATOR (U+2029) in JSON.
32
+ #
33
+ # Historically these characters were not valid inside JavaScript literal strings but that changed in ECMAScript 2019.
34
+ # As such it's no longer a concern in modern browsers: https://caniuse.com/mdn-javascript_builtins_json_json_superset.
35
+ #++
36
+ # Rails.configuration.active_support.escape_js_separators_in_json = false
37
+
30
38
  ###
31
39
  # Raises an error when order dependent finder methods (e.g. `#first`, `#second`) are called without `order` values
32
40
  # on the relation, and the model does not have any order columns (`implicit_order_column`, `query_constraints`, or
@@ -6,7 +6,7 @@ on:
6
6
  branches: [ <%= user_default_branch %> ]
7
7
 
8
8
  jobs:
9
- <%- unless skip_brakeman? -%>
9
+ <%- unless skip_brakeman? && skip_bundler_audit? -%>
10
10
  scan_ruby:
11
11
  runs-on: ubuntu-latest
12
12
 
@@ -18,12 +18,16 @@ jobs:
18
18
  uses: ruby/setup-ruby@v1
19
19
  with:
20
20
  bundler-cache: true
21
+ <%- unless skip_brakeman? -%>
21
22
 
22
23
  - name: Scan for common Rails security vulnerabilities using static analysis
23
24
  run: bin/brakeman --no-pager
25
+ <% end -%>
26
+ <%- unless skip_bundler_audit? -%>
24
27
 
25
28
  - name: Scan for known security vulnerabilities in gems used
26
29
  run: bin/bundler-audit
30
+ <% end -%>
27
31
 
28
32
  <% end -%>
29
33
  <%- if using_importmap? -%>
@@ -142,7 +146,7 @@ jobs:
142
146
  <%- end -%>
143
147
  # RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
144
148
  # REDIS_URL: redis://localhost:6379/0
145
- run: bin/rails db:test:prepare test
149
+ run: bin/rails <%= "db:test:prepare " unless skip_active_record? %>test
146
150
  <%- unless options[:api] || options[:skip_system_test] -%>
147
151
 
148
152
  system-test:
@@ -215,7 +219,7 @@ jobs:
215
219
  <%- end -%>
216
220
  # RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
217
221
  # REDIS_URL: redis://localhost:6379/0
218
- run: bin/rails db:test:prepare test:system
222
+ run: bin/rails <%= "db:test:prepare " unless skip_active_record? %>test:system
219
223
 
220
224
  - name: Keep screenshots from failed system tests
221
225
  uses: actions/upload-artifact@v4
@@ -14,7 +14,7 @@
14
14
  # GITHUB_TOKEN=$(gh config get -h github.com oauth_token)
15
15
 
16
16
  # Grab the registry password from ENV
17
- KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
17
+ # KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
18
18
 
19
19
  # Improve security by using a password manager. Never check config/master.key into git!
20
20
  RAILS_MASTER_KEY=$(cat config/master.key)
@@ -35,12 +35,35 @@
35
35
  font-weight: 400;
36
36
  letter-spacing: -0.0025em;
37
37
  line-height: 1.4;
38
- min-height: 100vh;
38
+ min-height: 100dvh;
39
39
  place-items: center;
40
40
  text-rendering: optimizeLegibility;
41
41
  -webkit-text-size-adjust: 100%;
42
42
  }
43
43
 
44
+ #error-description {
45
+ fill: #d30001;
46
+ }
47
+
48
+ #error-id {
49
+ fill: #f0eff0;
50
+ }
51
+
52
+ @media (prefers-color-scheme: dark) {
53
+ body {
54
+ background: #101010;
55
+ color: #e0e0e0;
56
+ }
57
+
58
+ #error-description {
59
+ fill: #FF6161;
60
+ }
61
+
62
+ #error-id {
63
+ fill: #2c2c2c;
64
+ }
65
+ }
66
+
44
67
  a {
45
68
  color: inherit;
46
69
  font-weight: 700;
@@ -83,13 +106,11 @@
83
106
  }
84
107
 
85
108
  main article br {
86
-
87
109
  display: none;
88
110
 
89
111
  @media(min-width: 48em) {
90
112
  display: inline;
91
113
  }
92
-
93
114
  }
94
115
 
95
116
  </style>
@@ -102,7 +123,7 @@
102
123
 
103
124
  <main>
104
125
  <header>
105
- <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" fill="#f0eff0"/><path d="m123.606 85.4445c3.212 1.0523 5.538 4.2089 5.538 8.0301 0 6.1472-4.209 9.5254-11.298 9.5254h-15.617v-34.0033h14.565c7.089 0 11.353 3.1566 11.353 9.2484 0 3.6551-2.049 6.3134-4.541 7.1994zm-12.904-2.9905h5.095c2.603 0 3.988-.9968 3.988-3.1013 0-2.1044-1.385-3.0459-3.988-3.0459h-5.095zm0 6.6456v6.5902h5.981c2.492 0 3.877-1.3291 3.877-3.2674 0-2.049-1.385-3.3228-3.877-3.3228zm43.786 13.9004h-8.362v-1.274c-.831.831-3.323 1.717-5.981 1.717-4.929 0-9.083-2.769-9.083-8.0301 0-4.818 4.154-7.9193 9.581-7.9193 2.049 0 4.486.6646 5.483 1.3845v-1.606c0-1.606-.942-2.9905-3.046-2.9905-1.606 0-2.548.7199-2.935 1.8275h-8.197c.72-4.8181 4.985-8.6393 11.409-8.6393 7.088 0 11.131 3.7659 11.131 10.2453zm-8.362-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.434.7199-3.434 2.3813 0 1.7168 1.717 2.4367 3.434 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm27.996 6.9779v-1.994c-1.163 1.329-3.599 2.548-6.147 2.548-7.199 0-11.131-5.8151-11.131-13.0145s3.932-13.0143 11.131-13.0143c2.548 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.664-1.3291-2.159-2.326-3.821-2.326-2.99 0-4.763 2.4368-4.763 5.6488s1.773 5.5934 4.763 5.5934c1.717 0 3.157-.9415 3.821-2.326zm35.471-2.049h-3.101v11.2421h-8.806v-34.0033h15.285c7.31 0 12.35 4.1535 12.35 11.5744 0 5.1503-2.603 8.6947-6.757 10.2453l7.975 12.1836h-9.858zm-3.101-15.2849v8.1962h5.538c3.156 0 4.596-1.606 4.596-4.0981s-1.44-4.0981-4.596-4.0981zm36.957 17.8323h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm30.98 27.5234v-10.799c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.9259-11.132-13.0145 0-7.144 3.932-13.0143 11.132-13.0143 2.547 0 4.984 1.2184 6.147 2.5475v-1.9937h8.695v33.726zm0-17.9981v-6.5902c-.665-1.3291-2.105-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.661 0 3.156-.9415 3.821-2.326zm36.789-15.7279v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.996 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm19.084 16.2263h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.963 5.095 11.963 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm13.428 11.0206h8.474c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.939-1.5506l-4.873-.9969c-4.154-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.762-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.741-8.2518zm27.538-.8861v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.993-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.871 0-9.193-2.769-9.193-9.0819z" fill="#d30001"/></svg>
126
+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" id="error-id"/><path d="m123.606 85.4445c3.212 1.0523 5.538 4.2089 5.538 8.0301 0 6.1472-4.209 9.5254-11.298 9.5254h-15.617v-34.0033h14.565c7.089 0 11.353 3.1566 11.353 9.2484 0 3.6551-2.049 6.3134-4.541 7.1994zm-12.904-2.9905h5.095c2.603 0 3.988-.9968 3.988-3.1013 0-2.1044-1.385-3.0459-3.988-3.0459h-5.095zm0 6.6456v6.5902h5.981c2.492 0 3.877-1.3291 3.877-3.2674 0-2.049-1.385-3.3228-3.877-3.3228zm43.786 13.9004h-8.362v-1.274c-.831.831-3.323 1.717-5.981 1.717-4.929 0-9.083-2.769-9.083-8.0301 0-4.818 4.154-7.9193 9.581-7.9193 2.049 0 4.486.6646 5.483 1.3845v-1.606c0-1.606-.942-2.9905-3.046-2.9905-1.606 0-2.548.7199-2.935 1.8275h-8.197c.72-4.8181 4.985-8.6393 11.409-8.6393 7.088 0 11.131 3.7659 11.131 10.2453zm-8.362-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.434.7199-3.434 2.3813 0 1.7168 1.717 2.4367 3.434 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm27.996 6.9779v-1.994c-1.163 1.329-3.599 2.548-6.147 2.548-7.199 0-11.131-5.8151-11.131-13.0145s3.932-13.0143 11.131-13.0143c2.548 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.664-1.3291-2.159-2.326-3.821-2.326-2.99 0-4.763 2.4368-4.763 5.6488s1.773 5.5934 4.763 5.5934c1.717 0 3.157-.9415 3.821-2.326zm35.471-2.049h-3.101v11.2421h-8.806v-34.0033h15.285c7.31 0 12.35 4.1535 12.35 11.5744 0 5.1503-2.603 8.6947-6.757 10.2453l7.975 12.1836h-9.858zm-3.101-15.2849v8.1962h5.538c3.156 0 4.596-1.606 4.596-4.0981s-1.44-4.0981-4.596-4.0981zm36.957 17.8323h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm30.98 27.5234v-10.799c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.9259-11.132-13.0145 0-7.144 3.932-13.0143 11.132-13.0143 2.547 0 4.984 1.2184 6.147 2.5475v-1.9937h8.695v33.726zm0-17.9981v-6.5902c-.665-1.3291-2.105-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.661 0 3.156-.9415 3.821-2.326zm36.789-15.7279v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.996 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm19.084 16.2263h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.963 5.095 11.963 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm13.428 11.0206h8.474c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.939-1.5506l-4.873-.9969c-4.154-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.762-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.741-8.2518zm27.538-.8861v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.993-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.871 0-9.193-2.769-9.193-9.0819z" id="error-description"/></svg>
106
127
  </header>
107
128
  <article>
108
129
  <p><strong>The server cannot process the request due to a client error.</strong> Please check the request and try again. If you're the application owner check the logs for more information.</p>
@@ -35,12 +35,35 @@
35
35
  font-weight: 400;
36
36
  letter-spacing: -0.0025em;
37
37
  line-height: 1.4;
38
- min-height: 100vh;
38
+ min-height: 100dvh;
39
39
  place-items: center;
40
40
  text-rendering: optimizeLegibility;
41
41
  -webkit-text-size-adjust: 100%;
42
42
  }
43
43
 
44
+ #error-description {
45
+ fill: #d30001;
46
+ }
47
+
48
+ #error-id {
49
+ fill: #f0eff0;
50
+ }
51
+
52
+ @media (prefers-color-scheme: dark) {
53
+ body {
54
+ background: #101010;
55
+ color: #e0e0e0;
56
+ }
57
+
58
+ #error-description {
59
+ fill: #FF6161;
60
+ }
61
+
62
+ #error-id {
63
+ fill: #2c2c2c;
64
+ }
65
+ }
66
+
44
67
  a {
45
68
  color: inherit;
46
69
  font-weight: 700;
@@ -83,13 +106,11 @@
83
106
  }
84
107
 
85
108
  main article br {
86
-
87
109
  display: none;
88
110
 
89
111
  @media(min-width: 48em) {
90
112
  display: inline;
91
113
  }
92
-
93
114
  }
94
115
 
95
116
  </style>
@@ -102,7 +123,7 @@
102
123
 
103
124
  <main>
104
125
  <header>
105
- <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm165.328-35.41581-45.689 100.02991h26.224v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.184v-31.901l50.285-103.27391z" fill="#f0eff0"/><path d="m157.758 68.9967v34.0033h-7.199l-14.233-19.8814v19.8814h-8.584v-34.0033h8.307l13.125 18.7184v-18.7184zm28.454 21.5428c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.528 0c0-3.4336-1.496-5.8703-4.209-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.209-2.3813 4.209-5.8149zm13.184 3.8766v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm37.027 8.5839h-8.806v-34.0033h23.924v7.6978h-15.118v6.7564h13.9v7.5316h-13.9zm41.876-12.4605c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm35.337-12.4605v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.997 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm4.076 24.921v-24.921h8.694v2.1598c1.385-1.5506 3.822-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.639v-14.2327c0-2.049-1.053-3.5443-3.268-3.5443-1.717 0-3.156.9969-3.6 2.7136v15.0634zm44.113 0v-1.994c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.8151-11.132-13.0145s3.932-13.0143 11.132-13.0143c2.547 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.665-1.3291-2.16-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.717 0 3.156-.9415 3.821-2.326z" fill="#d30001"/></svg>
126
+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm165.328-35.41581-45.689 100.02991h26.224v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.184v-31.901l50.285-103.27391z" id="error-id"/><path d="m157.758 68.9967v34.0033h-7.199l-14.233-19.8814v19.8814h-8.584v-34.0033h8.307l13.125 18.7184v-18.7184zm28.454 21.5428c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.528 0c0-3.4336-1.496-5.8703-4.209-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.209-2.3813 4.209-5.8149zm13.184 3.8766v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm37.027 8.5839h-8.806v-34.0033h23.924v7.6978h-15.118v6.7564h13.9v7.5316h-13.9zm41.876-12.4605c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm35.337-12.4605v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.997 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm4.076 24.921v-24.921h8.694v2.1598c1.385-1.5506 3.822-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.639v-14.2327c0-2.049-1.053-3.5443-3.268-3.5443-1.717 0-3.156.9969-3.6 2.7136v15.0634zm44.113 0v-1.994c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.8151-11.132-13.0145s3.932-13.0143 11.132-13.0143c2.547 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.665-1.3291-2.16-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.717 0 3.156-.9415 3.821-2.326z" id="error-description"/></svg>
106
127
  </header>
107
128
  <article>
108
129
  <p><strong>The page you were looking for doesn't exist.</strong> You may have mistyped the address or the page may have moved. If you're the application owner check the logs for more information.</p>