openstax_utilities 4.3.0 → 4.4.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/controllers/openstax/utilities/status_controller.rb +66 -0
  4. data/app/views/layouts/openstax/utilities/status.html.erb +26 -0
  5. data/app/views/openstax/utilities/status/index.html.erb +45 -0
  6. data/config/routes.rb +3 -0
  7. data/lib/openstax/utilities/assets/manifest.rb +4 -0
  8. data/lib/openstax/utilities/engine.rb +3 -2
  9. data/lib/openstax/utilities/version.rb +1 -1
  10. metadata +21 -113
  11. data/spec/cassettes/OpenStax_Utilities_Assets/loading_remote_manifest/uses_remote_json.yml +0 -353
  12. data/spec/dummy/README.md +0 -1
  13. data/spec/dummy/Rakefile +0 -6
  14. data/spec/dummy/app/access_policies/dummier_access_policy.rb +0 -10
  15. data/spec/dummy/app/access_policies/dummy_access_policy.rb +0 -10
  16. data/spec/dummy/app/assets/config/manifest.js +0 -3
  17. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  18. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  19. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  20. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  21. data/spec/dummy/app/models/user.rb +0 -2
  22. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  23. data/spec/dummy/bin/bundle +0 -3
  24. data/spec/dummy/bin/rails +0 -4
  25. data/spec/dummy/bin/rake +0 -4
  26. data/spec/dummy/config.ru +0 -4
  27. data/spec/dummy/config/application.rb +0 -18
  28. data/spec/dummy/config/boot.rb +0 -5
  29. data/spec/dummy/config/database.yml +0 -25
  30. data/spec/dummy/config/environment.rb +0 -5
  31. data/spec/dummy/config/environments/development.rb +0 -37
  32. data/spec/dummy/config/environments/production.rb +0 -78
  33. data/spec/dummy/config/environments/test.rb +0 -39
  34. data/spec/dummy/config/initializers/access_policies.rb +0 -1
  35. data/spec/dummy/config/initializers/assets.rb +0 -8
  36. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  37. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -3
  38. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  39. data/spec/dummy/config/initializers/inflections.rb +0 -16
  40. data/spec/dummy/config/initializers/mime_types.rb +0 -4
  41. data/spec/dummy/config/initializers/search_users.rb +0 -26
  42. data/spec/dummy/config/initializers/session_store.rb +0 -3
  43. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  44. data/spec/dummy/config/locales/en.yml +0 -23
  45. data/spec/dummy/config/routes.rb +0 -2
  46. data/spec/dummy/config/secrets.yml +0 -19
  47. data/spec/dummy/db/migrate/0_create_users.rb +0 -16
  48. data/spec/dummy/db/schema.rb +0 -29
  49. data/spec/dummy/db/test.sqlite3 +0 -0
  50. data/spec/dummy/log/test.log +0 -32144
  51. data/spec/dummy/public/404.html +0 -67
  52. data/spec/dummy/public/422.html +0 -67
  53. data/spec/dummy/public/500.html +0 -66
  54. data/spec/dummy/public/favicon.ico +0 -0
  55. data/spec/dummy/tmp/cache/C09/760/6da7b2a29da9cb0f80ef102c7effb91fab3374db +0 -0
  56. data/spec/factories/user.rb +0 -8
  57. data/spec/lib/openstax/utilities/access_policy_spec.rb +0 -68
  58. data/spec/lib/openstax/utilities/assets_spec.rb +0 -40
  59. data/spec/rails_helper.rb +0 -53
  60. data/spec/routines/openstax/utilities/limit_and_paginate_relation_spec.rb +0 -72
  61. data/spec/routines/openstax/utilities/order_relation_spec.rb +0 -55
  62. data/spec/routines/openstax/utilities/search_and_organize_relation_spec.rb +0 -139
  63. data/spec/routines/openstax/utilities/search_relation_spec.rb +0 -81
  64. data/spec/spec_helper.rb +0 -85
  65. data/spec/vcr_helper.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc7366a73ada7f334bd42ca06e41c0043f92e0d2aff08969f5ec1759275b1885
4
- data.tar.gz: 86fa1a1dbe2f4c8521afb1b6ce635b63c8c2140e6656de3028887fd22d7872d1
3
+ metadata.gz: 23bd083b2474dd40ea6848f919c4adbc50cc1cbaa927b8de0f968888100a3f8d
4
+ data.tar.gz: 0a35031fbb7df47f6675307130187e24e9bf4bec4699c8a129c0697832877653
5
5
  SHA512:
6
- metadata.gz: 26555b0e6c39c6cc7c3615d6e948849cce15aa9ff67ebafb5fad260ddb408a8003598b2e588f10ea1c2ed55256ade08a223ad92517b8fcc45adfeb8976583322
7
- data.tar.gz: c36765470b6f808e37e2145538b49b56312568ea9ddc73f8329c94e7eb593ecaa8fa5bd09f999db6e7deda74a6792a8c85fdfa4bd2e850a63239de85fbaebd4d
6
+ metadata.gz: b3bee8a0ca7d846e020da56ff82a50bde40317e772e7287d8853c8847009fa1ec857bc79865c8850f9f69a7e50817c1e3e2a85188ab35de21607fa0038b32397
7
+ data.tar.gz: 3a11784b8209459777082d0939c5d2ad6e2ee5373476f518056586b5ceb0d2371ecf2362ee8ffee1755e1321bf6e30d09be32e5ef791958782a801f19131b2f5
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  OpenStax Utilities
2
2
  ==================
3
3
 
4
- [![Build Status](https://travis-ci.org/openstax/openstax_utilities.svg?branch=master)](https://travis-ci.org/openstax/openstax_utilities)
4
+ [![Tests](https://github.com/openstax/openstax_utilities/workflows/Tests/badge.svg)](https://github.com/openstax/openstax_utilities/actions?query=workflow:Tests)
5
5
  [![Code Climate](https://codeclimate.com/github/openstax/openstax_utilities.png)](https://codeclimate.com/github/openstax/openstax_utilities)
6
6
 
7
7
  A set of common utilities for the various OpenStax projects.
@@ -0,0 +1,66 @@
1
+ require 'aws-sdk-autoscaling'
2
+
3
+ class OpenStax::Utilities::StatusController < ActionController::Base
4
+ layout 'openstax/utilities/status'
5
+
6
+ def index
7
+ @application_name = Rails.application.class.parent_name
8
+ @environment_name = Rails.application.secrets.environment_name
9
+
10
+ @statuses = if @environment_name == 'development'
11
+ [ [ 'local', 1, 1, :ok ] ]
12
+ else
13
+ queues = Delayed::Worker.queue_attributes.keys.map(&:to_s) - [ 'migration' ]
14
+ asgs = [ 'migration', 'web', 'cron', 'background' ] + queues.map do |queue|
15
+ "background-#{queue}"
16
+ end
17
+
18
+ Aws::AutoScaling::Client.new.describe_auto_scaling_groups(
19
+ auto_scaling_group_names: asgs.map do |asg|
20
+ "#{@environment_name}-#{@application_name.downcase}-#{asg}-asg"
21
+ end
22
+ ).auto_scaling_groups.map do |asg|
23
+ name = asg.auto_scaling_group_name.sub(
24
+ "#{@environment_name}-#{@application_name.downcase}-", ''
25
+ ).chomp('-asg')
26
+
27
+ status = if asg.desired_capacity == 0
28
+ if asg.instances.size > 0
29
+ :shutting_down
30
+ elsif [ 'web', 'background', 'cron' ].include?(name)
31
+ :configuration_error
32
+ else
33
+ :sleeping
34
+ end
35
+ elsif asg.instances.all? do |instance|
36
+ instance.health_status != 'Healthy' || instance.lifecycle_state != 'InService'
37
+ end
38
+ :down
39
+ elsif name == 'migration'
40
+ :migrating
41
+ elsif asg.max_size > 1 && asg.desired_capacity == asg.max_size
42
+ :at_capacity
43
+ elsif asg.instances.size < asg.desired_capacity
44
+ :scaling_up
45
+ elsif asg.instances.size > asg.desired_capacity
46
+ :scaling_down
47
+ else
48
+ :ok
49
+ end
50
+
51
+ [ name, asg.instances.size, asg.max_size, status ]
52
+ end.sort_by do |name, _, _, _|
53
+ case name
54
+ when 'migration'
55
+ '0'
56
+ when 'web'
57
+ '1'
58
+ when 'cron'
59
+ '2'
60
+ else
61
+ "3#{name}"
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,26 @@
1
+ <% title = "OpenStax #{@application_name} (#{@environment_name}) Status" %>
2
+
3
+ <!DOCTYPE html>
4
+ <html>
5
+ <head>
6
+ <title><%= title %></title>
7
+ <meta name="robots" content="noindex">
8
+ <meta http-equiv="content-type" content="text/html; charset=UTF8" />
9
+
10
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
11
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
12
+ <%= csrf_meta_tags %>
13
+ </head>
14
+
15
+ <body id="status" class="status">
16
+ <header>
17
+ <h2 style="margin-left: 16px;"><%= title %></h2>
18
+ </header>
19
+
20
+ <div class="body" style="margin-left: 16px;">
21
+ <div class="body-container">
22
+ <%= yield %>
23
+ </div>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,45 @@
1
+ <%
2
+ status_icons = {
3
+ down: '💀',
4
+ configuration_error: '⚠️',
5
+ shutting_down: '😪',
6
+ at_capacity: '🥵',
7
+ scaling_down: '📉',
8
+ scaling_up: '📈',
9
+ migrating: '💾',
10
+ ok: '✅',
11
+ sleeping: '💤'
12
+ }
13
+
14
+ backend = @application_name == 'Tutor' ? 'tutor-server' : @application_name.downcase
15
+ %>
16
+
17
+ <h3>Versions</h3>
18
+
19
+ <ul>
20
+ <li>
21
+ Backend (<%= backend %>): <%= Rails.application.secrets.release_version || 'not deployed' %>
22
+ </li>
23
+ <li>
24
+ Frontend (tutor-js): <%= OpenStax::Utilities::Assets.manifest.version || 'not deployed' %>
25
+ </li>
26
+ </ul>
27
+
28
+ <% status = status_icons.find { |key, _| @statuses.any? { |_, _, _, status| status == key } } %>
29
+ <h3>Status: <% unless status.nil? %><span title="<%=
30
+ status.first.to_s.humanize
31
+ %>"><%= status.second %></span><% end %></h3>
32
+
33
+ <ul>
34
+ <% @statuses.map do |name, num_instances, max_size, status| %>
35
+ <% title = status.to_s.humanize %>
36
+ <li>
37
+ <%= name.to_s.underscore.humanize %>: <%= num_instances %>/<%= max_size %>
38
+ <% if status_icons.has_key? status %>
39
+ <span title="<%= title %>"><%= status_icons[status] %></span>
40
+ <% else %>
41
+ (<%= title %>)
42
+ <% end %>
43
+ </li>
44
+ <% end %>
45
+ </ul>
@@ -0,0 +1,3 @@
1
+ OpenStax::Utilities::Engine.routes.draw do
2
+ root to: 'status#index'
3
+ end
@@ -5,6 +5,8 @@ module OpenStax::Utilities
5
5
  module Assets
6
6
  # Reads and parses the assets manifest
7
7
  class Manifest
8
+ attr_reader :version
9
+
8
10
  def initialize
9
11
  @assets = HashWithIndifferentAccess.new
10
12
 
@@ -16,6 +18,8 @@ module OpenStax::Utilities
16
18
  if response.success?
17
19
  contents = JSON.parse response.body
18
20
 
21
+ @version = contents['version']
22
+
19
23
  if contents['entrypoints'].blank?
20
24
  Rails.logger.error { "failed to parse manifest from #{url}" }
21
25
  else
@@ -2,6 +2,7 @@ require "openstax/utilities/action_list"
2
2
 
3
3
  ActiveSupport::Inflector.inflections do |inflect|
4
4
  inflect.acronym 'OpenStax'
5
+ inflect.acronym 'OSU'
5
6
  end
6
7
 
7
8
  module OpenStax
@@ -14,10 +15,10 @@ module OpenStax
14
15
  end
15
16
 
16
17
  config.generators do |g|
17
- g.test_framework :rspec, :fixture => false
18
+ g.test_framework :rspec, fixture: false
18
19
  g.assets false
19
20
  g.helper false
20
21
  end
21
22
  end
22
23
  end
23
- end
24
+ end
@@ -1,5 +1,5 @@
1
1
  module OpenStax
2
2
  module Utilities
3
- VERSION = '4.3.0'
3
+ VERSION = '4.4.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstax_utilities
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.0
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - JP Slavinsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-28 00:00:00.000000000 Z
11
+ date: 2021-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: aws-sdk-autoscaling
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: sqlite3
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -188,11 +202,15 @@ files:
188
202
  - MIT-LICENSE
189
203
  - README.md
190
204
  - Rakefile
205
+ - app/controllers/openstax/utilities/status_controller.rb
191
206
  - app/routines/openstax/utilities/limit_and_paginate_relation.rb
192
207
  - app/routines/openstax/utilities/order_relation.rb
193
208
  - app/routines/openstax/utilities/search_and_organize_relation.rb
194
209
  - app/routines/openstax/utilities/search_relation.rb
210
+ - app/views/layouts/openstax/utilities/status.html.erb
211
+ - app/views/openstax/utilities/status/index.html.erb
195
212
  - app/views/osu/shared/_action_list.html.erb
213
+ - config/routes.rb
196
214
  - lib/openstax/utilities/access.rb
197
215
  - lib/openstax/utilities/access_policy.rb
198
216
  - lib/openstax/utilities/action_list.rb
@@ -216,61 +234,6 @@ files:
216
234
  - lib/openstax/utilities/text.rb
217
235
  - lib/openstax/utilities/version.rb
218
236
  - lib/openstax_utilities.rb
219
- - spec/cassettes/OpenStax_Utilities_Assets/loading_remote_manifest/uses_remote_json.yml
220
- - spec/dummy/README.md
221
- - spec/dummy/Rakefile
222
- - spec/dummy/app/access_policies/dummier_access_policy.rb
223
- - spec/dummy/app/access_policies/dummy_access_policy.rb
224
- - spec/dummy/app/assets/config/manifest.js
225
- - spec/dummy/app/assets/javascripts/application.js
226
- - spec/dummy/app/assets/stylesheets/application.css
227
- - spec/dummy/app/controllers/application_controller.rb
228
- - spec/dummy/app/helpers/application_helper.rb
229
- - spec/dummy/app/models/user.rb
230
- - spec/dummy/app/views/layouts/application.html.erb
231
- - spec/dummy/bin/bundle
232
- - spec/dummy/bin/rails
233
- - spec/dummy/bin/rake
234
- - spec/dummy/config.ru
235
- - spec/dummy/config/application.rb
236
- - spec/dummy/config/boot.rb
237
- - spec/dummy/config/database.yml
238
- - spec/dummy/config/environment.rb
239
- - spec/dummy/config/environments/development.rb
240
- - spec/dummy/config/environments/production.rb
241
- - spec/dummy/config/environments/test.rb
242
- - spec/dummy/config/initializers/access_policies.rb
243
- - spec/dummy/config/initializers/assets.rb
244
- - spec/dummy/config/initializers/backtrace_silencers.rb
245
- - spec/dummy/config/initializers/cookies_serializer.rb
246
- - spec/dummy/config/initializers/filter_parameter_logging.rb
247
- - spec/dummy/config/initializers/inflections.rb
248
- - spec/dummy/config/initializers/mime_types.rb
249
- - spec/dummy/config/initializers/search_users.rb
250
- - spec/dummy/config/initializers/session_store.rb
251
- - spec/dummy/config/initializers/wrap_parameters.rb
252
- - spec/dummy/config/locales/en.yml
253
- - spec/dummy/config/routes.rb
254
- - spec/dummy/config/secrets.yml
255
- - spec/dummy/db/migrate/0_create_users.rb
256
- - spec/dummy/db/schema.rb
257
- - spec/dummy/db/test.sqlite3
258
- - spec/dummy/log/test.log
259
- - spec/dummy/public/404.html
260
- - spec/dummy/public/422.html
261
- - spec/dummy/public/500.html
262
- - spec/dummy/public/favicon.ico
263
- - spec/dummy/tmp/cache/C09/760/6da7b2a29da9cb0f80ef102c7effb91fab3374db
264
- - spec/factories/user.rb
265
- - spec/lib/openstax/utilities/access_policy_spec.rb
266
- - spec/lib/openstax/utilities/assets_spec.rb
267
- - spec/rails_helper.rb
268
- - spec/routines/openstax/utilities/limit_and_paginate_relation_spec.rb
269
- - spec/routines/openstax/utilities/order_relation_spec.rb
270
- - spec/routines/openstax/utilities/search_and_organize_relation_spec.rb
271
- - spec/routines/openstax/utilities/search_relation_spec.rb
272
- - spec/spec_helper.rb
273
- - spec/vcr_helper.rb
274
237
  homepage: http://github.com/openstax/openstax_utilities
275
238
  licenses:
276
239
  - MIT
@@ -294,59 +257,4 @@ rubygems_version: 3.1.4
294
257
  signing_key:
295
258
  specification_version: 4
296
259
  summary: Utilities for OpenStax web sites
297
- test_files:
298
- - spec/rails_helper.rb
299
- - spec/spec_helper.rb
300
- - spec/vcr_helper.rb
301
- - spec/factories/user.rb
302
- - spec/dummy/app/models/user.rb
303
- - spec/dummy/app/assets/javascripts/application.js
304
- - spec/dummy/app/assets/stylesheets/application.css
305
- - spec/dummy/app/assets/config/manifest.js
306
- - spec/dummy/app/views/layouts/application.html.erb
307
- - spec/dummy/app/access_policies/dummier_access_policy.rb
308
- - spec/dummy/app/access_policies/dummy_access_policy.rb
309
- - spec/dummy/app/controllers/application_controller.rb
310
- - spec/dummy/app/helpers/application_helper.rb
311
- - spec/dummy/tmp/cache/C09/760/6da7b2a29da9cb0f80ef102c7effb91fab3374db
312
- - spec/dummy/db/migrate/0_create_users.rb
313
- - spec/dummy/db/test.sqlite3
314
- - spec/dummy/db/schema.rb
315
- - spec/dummy/log/test.log
316
- - spec/dummy/README.md
317
- - spec/dummy/public/favicon.ico
318
- - spec/dummy/public/422.html
319
- - spec/dummy/public/404.html
320
- - spec/dummy/public/500.html
321
- - spec/dummy/config.ru
322
- - spec/dummy/bin/rails
323
- - spec/dummy/bin/rake
324
- - spec/dummy/bin/bundle
325
- - spec/dummy/config/application.rb
326
- - spec/dummy/config/initializers/filter_parameter_logging.rb
327
- - spec/dummy/config/initializers/search_users.rb
328
- - spec/dummy/config/initializers/assets.rb
329
- - spec/dummy/config/initializers/cookies_serializer.rb
330
- - spec/dummy/config/initializers/inflections.rb
331
- - spec/dummy/config/initializers/backtrace_silencers.rb
332
- - spec/dummy/config/initializers/wrap_parameters.rb
333
- - spec/dummy/config/initializers/access_policies.rb
334
- - spec/dummy/config/initializers/session_store.rb
335
- - spec/dummy/config/initializers/mime_types.rb
336
- - spec/dummy/config/locales/en.yml
337
- - spec/dummy/config/routes.rb
338
- - spec/dummy/config/database.yml
339
- - spec/dummy/config/environment.rb
340
- - spec/dummy/config/boot.rb
341
- - spec/dummy/config/environments/production.rb
342
- - spec/dummy/config/environments/test.rb
343
- - spec/dummy/config/environments/development.rb
344
- - spec/dummy/config/secrets.yml
345
- - spec/dummy/Rakefile
346
- - spec/lib/openstax/utilities/access_policy_spec.rb
347
- - spec/lib/openstax/utilities/assets_spec.rb
348
- - spec/routines/openstax/utilities/limit_and_paginate_relation_spec.rb
349
- - spec/routines/openstax/utilities/search_relation_spec.rb
350
- - spec/routines/openstax/utilities/order_relation_spec.rb
351
- - spec/routines/openstax/utilities/search_and_organize_relation_spec.rb
352
- - spec/cassettes/OpenStax_Utilities_Assets/loading_remote_manifest/uses_remote_json.yml
260
+ test_files: []
@@ -1,353 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://tutor-dev.openstax.org/assets/assets.json
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - Faraday v0.9.2
12
- Accept-Encoding:
13
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
- Accept:
15
- - "*/*"
16
- response:
17
- status:
18
- code: 200
19
- message: OK
20
- headers:
21
- Server:
22
- - nginx
23
- Date:
24
- - Thu, 13 Sep 2018 17:45:53 GMT
25
- Content-Type:
26
- - application/json
27
- Content-Length:
28
- - '404'
29
- Last-Modified:
30
- - Fri, 31 Aug 2018 21:21:15 GMT
31
- Connection:
32
- - keep-alive
33
- Etag:
34
- - '"5b89b14b-194"'
35
- Expires:
36
- - Fri, 13 Sep 2019 17:45:53 GMT
37
- Cache-Control:
38
- - max-age=31536000
39
- - public
40
- Strict-Transport-Security:
41
- - max-age=31536000; includeSubdomains
42
- Accept-Ranges:
43
- - bytes
44
- body:
45
- encoding: UTF-8
46
- string: |
47
- {
48
- "all-features.svg": {
49
- "src": "aa24fa15d6d08eb7078616fbb038188d.svg",
50
- "integrity": "sha256-QIcMINxIyaiYNQW9dnIvxmzMmLeQosO1bSgC7pzLpKQ= sha384-aa0rfgAhJ+iIH8CRpf4Ei0V3KlQWZ3Fh+MMMo40S0kixI692PhGM2qFvq1/3qSFx sha512-oObRARlAvemWUB3OwlW6lP6tQDuRW3YxXZ6rGXZln4cZ96sejeYJ9BOmvVSDTfGHDZHU0l6gF4VrmlBF9dCgpw=="
51
- },
52
- "ap_physics-book-thumbnail.svg": {
53
- "src": "dcbb7de4327cd469d54012fcfbaf83ac.svg",
54
- "integrity": "sha256-DWm0KEcgX5XXa3XOSmwS6lx8gYzPaS8gLquubhEGIh0= sha384-JyqJgDexFBJMAAsiDKVEoZ70dNEB6ZFP9wKgc6p+rnr+oqbwlJefSUVkgX1k454V sha512-36vObxxYPaGBDeVpzvwjKac4fGprb5H7XHNgA4IWA9x0KbIg/nzYR2uUsEu77gaHoHV3CUbEdIAc3sGc/fKf3A=="
55
- },
56
- "ap_us_history-book-thumbnail.svg": {
57
- "src": "ea15eb313d33bf91c3fadc2fe7dab027.svg",
58
- "integrity": "sha256-cR4KKeLsxiAgV+EDpAU3vVFs5FpnuhAxOc8IlBsS+Jc= sha384-+ackdSHqLVeGuZJ3ABavi/LwJnwHdKy0vDufWeNYbCvT/E7nIT5fHS7RXivfdOPf sha512-WQ5JjbuMoaV+EddeQBm9uDvbn0M8QYubb1wWAUeVkkN3clMBhMnnI551do0ulHMKCjq3ZGQHrLDfofwUELQFEQ=="
59
- },
60
- "biology-book-thumbnail.svg": {
61
- "src": "09a7aa2d0aa9bc4f083ae2b514966827.svg",
62
- "integrity": "sha256-Q8ctLwjOkI7MmE1O7fWGrUyDWTuh0SyGaUROWDSZuAU= sha384-Rft6bksJWnKoqqy+pVb3dLYFKLWGkP8AS58oZ6prX0ihX3e+WGUJbUSmlw4mPIkO sha512-zyWDI5gric8qXi4GdtSzIUBgLxvn59Plb5PhjdunS1TjpWOsxI5lG0YmnkPFCjxa63rXio4hswLoy4PHcE8igQ=="
63
- },
64
- "biology_2e-book-thumbnail.svg": {
65
- "src": "2c69b48945c8869b7195c99b3bb8b390.svg",
66
- "integrity": "sha256-Mom7+7inJVDA/6XczbQ9eZHKH9EttlLUlbX0q32WvAY= sha384-XvUUDHngymDbamwadCVvQifAel4O/77r6x2/0FnbRQGLNyAjvN9k4LBbSk85mtW+ sha512-CxMUoVkgRjj2ojALi2EHr7AxTs9+1kOQj3rDKnjFTi9CsQjBLcWotS6kZCVGttw4FjueBl1T1rsAq8EwoAZDsQ=="
67
- },
68
- "cant-save-work.svg": {
69
- "src": "5ad1479c3561fa1988912b1c3e061282.svg",
70
- "integrity": "sha256-egeZy7hvduoP9ujDJEB9fRwf/QRuZE9+e5B6yI1D1q4= sha384-I61LI2VdHk5a7lzeaNveog7TWTPncH0BzDjAVPnnMUpmAEU8yIdQAheXqbLT2OGt sha512-7pYkiymyYORnuUEdhehr4NFtk5Yy++owADUWu2NmtRVTQz3qODSvmPgysoyBaFWaAb0iJ9GzBRaw/5EiyQC3vQ=="
71
- },
72
- "college_physics-book-thumbnail.svg": {
73
- "src": "aac1db15414fad4a0e79efbb886cd8f0.svg",
74
- "integrity": "sha256-qE69BiNBc1iYcaV0nGFgMkh39eheSSpafxp2c/uqv5U= sha384-ujsnbp8Ahdy4uTPdXZ0jOp3jhvbH6QjtK8zkALqHi/UN7L0LrKlQB2zit9JiNt9U sha512-GM2S0r7q6YnBmV+7ej2iRtITX5X3R1/p6vpy+llGf8JwKn/aYyvWaFtXq74yvkN3Wo8k/ZXJiO7LqmsJHYoMpg=="
75
- },
76
- "entrepreneurship-book-thumbnail.svg": {
77
- "src": "9527f9c2439d00c1d58ec28e52420e2b.svg",
78
- "integrity": "sha256-I9i39FEBc4kHcAkgTDc1n2BAaydY/cz9nrTIZ0fFXyA= sha384-qrWWGZDEI/302XzLD2hPaRKubyplPfCPu8LKBzylmXlxu57xAbiq8Ye0U24WBxgA sha512-iBAELZ7s/y+hxwAwPutHSafTd7cyrU4P9wvykmDVTu4noK1ccC8QChc6zk2MsBynfm1ISMO0sjKlJ7Dz+H1pDg=="
79
- },
80
- "entrypoints": {
81
- "tutor": {
82
- "js": [
83
- "tutor-b920eb0be760a7c440bf.min.js"
84
- ],
85
- "js.map": [
86
- "tutor-b920eb0be760a7c440bf.min.js.map"
87
- ]
88
- },
89
- "lmspair": {
90
- "js": [
91
- "lmspair-b920eb0be760a7c440bf.min.js"
92
- ],
93
- "js.map": [
94
- "lmspair-b920eb0be760a7c440bf.min.js.map"
95
- ]
96
- }
97
- },
98
- "exclude-question.svg": {
99
- "src": "f7460965d0f2443a757b68486a271a46.svg",
100
- "integrity": "sha256-U0lKhNqO0f+UFKzsJDL1tO24TrsTrp+ZOwH/C3eP8iM= sha384-onoZmRrSMr22/L0ysTlsQlhUiO7O+ea+LNnEaVctuUecPdOJGE4onsGx7FRudlHZ sha512-SwHKMLIhqmUJJHI5BNCqJsN3mALz8g85MvJoGSDHm2n3cyx3F2IBjgA6aPnVzp072ZGpcK8tlil5RzgcsqTtVw=="
101
- },
102
- "exercise-details-action.svg": {
103
- "src": "ade68bd7a65ec534db8f179e78173f36.svg",
104
- "integrity": "sha256-jPGHeozXhBAfeuSt6kZg0O0SqhX/Ofg9B1HAClnXI+A= sha384-srUWMTIvZBKyzwyk+vKJ9uwZ8viObVdvP/0Xmq3blFD8w48KKm0vP8iieFQ/4njf sha512-76DO9BtdlnsUmsba/rP4H2tYXtMy2dTK/CudPTQnkESzGWiC4hbpn2aDSh8vAG/CD3ObPFo4u2Utpc/iCRm/dg=="
105
- },
106
- "exercise-exclude-card-view-action.svg": {
107
- "src": "6f6a7d08a934392dfb6daae9b32e1eca.svg",
108
- "integrity": "sha256-Ttp7m6dHS9X+6JFLpkfD4EcQPB4xKAD5kFVHuLmFGCI= sha384-sEGYw9qGeaH2C6ou+UzssORsdqVPgMkB1iOgqj+AMAQwjH89k3iu9Rcr9V8DCuXy sha512-p2DUqibi4667xwZylBV+XOseXeitmvEb28FmfPBnfyGNlMEpBFRYVb+w2/Hr8T4lZ1mZjLEJE1N7wPwTurKqLw=="
109
- },
110
- "exercise-exclude-details-view-action.svg": {
111
- "src": "f03fe8cfd847898edc376bf0bdac0056.svg",
112
- "integrity": "sha256-pO3LCOn2pMqZNaEAwG4meH5xOjfaa4EvGTvR8AxaY+k= sha384-dnKtfgmDF18YjfzV+uz7DS89doo6v3ClonG2Ak/jHIzm4gGe++wr9AmFWDHzGv72 sha512-0m84pmF3KPDwGMRrtGmM9+7ylVAO457hnomaZRXQcnLwPh7nkAP4cECf5+urSYG+o766dM3BWrUS5ZETRZCi5w=="
113
- },
114
- "exercise-feedback-off-action.svg": {
115
- "src": "cc317d981b83c9468e000a4cd0cd6bd1.svg",
116
- "integrity": "sha256-poQbe47ZyBZn/r0nVK8QlvfCStK7I3reJf31ic5XU+E= sha384-P7/nY9zRRRtpVbGA24ZIeI4mPmerty84X7uWBrzPjaUOAS2FgtnvWdbcTZnUqN2S sha512-dSge35cZIzZfaxbBzcamOyId4rTn8CWwWJ37wNf54VDcdk2h/8lTC5eLxLe5nDwQq1HZtBnnN6H9JmG4tSfdOA=="
117
- },
118
- "exercise-feedback-on-action.svg": {
119
- "src": "7941f79e27c564f9778784c78a005f78.svg",
120
- "integrity": "sha256-u0kNxYc0B/rm9U86ul3VNZByM9yNneSjvvArdW1RWDA= sha384-VU5b7mFjwluxcp72y8oupgiMswhsqYzIsj6/tHw6PoIawkt1GELqYoByDJ3erlNl sha512-mBtoqoEmzXhOUEbz4TpNclqOmLraeQbHTmM2xRFtu++sHiW1lMkX2B+a313v7laVQGr1ZDptmuItSXg/OE9rWg=="
121
- },
122
- "exercise-include-action.svg": {
123
- "src": "9b3328d7b81d35b1764a709b5e2fe14a.svg",
124
- "integrity": "sha256-yP6keVl5XVCCb7YKkvD/6zVWwcOQ7pAqgB0H0jSoafM= sha384-0YpNustNygxYxOF654o+uVJJvrZIddYOcU7wKU1zk4ayenBOUL0k/ghPvkmD+nlV sha512-R/PK9Bbxe8mRUglibbClnRpKmt3oECX2l+A8Z+bnDXVii+wQufmN23jka6oaS5TqFRF1e1DVWGHxz6oIfpbXlQ=="
125
- },
126
- "exercise-report-error-action.svg": {
127
- "src": "062f41bcd1652ae1e6c77bfeb0bab7aa.svg",
128
- "integrity": "sha256-spCoklXvyEE96RU6A7DbGn5LX3lBBMbfLLoceIRUCYM= sha384-k0nkM8JP4NWILjiRgV9R9cEOqHpnZ33AzM5qcJAetFxCn80W+6pZVedm6bKZdQcH sha512-0WueUVO8xKmGQXqf1UUFm3NAEvS0YL9m20OzOgOr0GCZpzzmhxH4DgtuOsu2I/Qj/5s9HnVYcaKeIzCSyi3h5A=="
129
- },
130
- "export-by.svg": {
131
- "src": "8ef183dc2032a92a87e654ccf009c858.svg",
132
- "integrity": "sha256-znMsZmY1bYcoxtmQV73W0dk8Lvqimu5JYxZGAKaLDrk= sha384-DenBRw8WXoI3jjlL+d28j1fQCPwpSKrjTEfxMG5nCYJT6XWyA0lwOFHppGb5siRl sha512-mnCct5NVCBZUoFLBEYmUjXpQpfwYxRAk6JDP6EFCrjy5LLGCTu85df4MbsagBX9LoVUsinzpIzckdH2stVanWg=="
133
- },
134
- "hs_physics-book-thumbnail.png": {
135
- "src": "57112172ebb42b6d76439ef3c09e10a0.png",
136
- "integrity": "sha256-X8trpVLInJlun+ilsDXvuIRUWWTTFrMNCodyGjGE00U= sha384-wZTgHHcKjYDXRa/mU3kEfgexBJUHa3+SUCDExZSX9RSz47No8RiIH8HYNQWJbc6U sha512-yXPx9yx0xlWTJ4yiDFSD+b2n63Ixvz09wV7bTvqv370IfweQVDypQjOQF4QlmuDmx8UQvLma6LVyyBECTxwebg=="
137
- },
138
- "icon-completed.svg": {
139
- "src": "1eaa77438418976d919742a5f51778de.svg",
140
- "integrity": "sha256-/K4ahQxRv8VVA4xFL4YhzPzl2850BlHndoyY6I5QmO4= sha384-AGd5sL6cIlNIkd5HRwp/DM6oyVytHeZz2VP0DnN6PoOqnTbCRUiuhqq/Wvdc74tq sha512-JFmeWiO2a8uV98fXj0wOXSYGqtGyKkdXzXqEwb4oLdB6mEbmweWYsQr1E2SsLr7AaO8IJm0sWbKSJOtmSYXQPg=="
141
- },
142
- "icon-copy-course.svg": {
143
- "src": "1d0014e980c13576a550645339994b4a.svg",
144
- "integrity": "sha256-QIPi/bNPslFUOaHnJBrp6g7Uvqyz4IzD68qsOu6WL9Y= sha384-7P3AUbnSRFGrTNfB4fLEwrM7PbvGSVS5PiIrPDuXO/Lfy99K0Ru8gvjRvHQZY6P8 sha512-wCBpSGWJsFgbT+UcEWSUzSfRhnrGRVo3t2PiGmTQ4bTTD5FveTZ1m57BalXvjM01Bf4NaUilo7aWy1L5047p+A=="
145
- },
146
- "icon-correct.svg": {
147
- "src": "d62f4fb9677b23b176d92210a6e635ef.svg",
148
- "integrity": "sha256-xNt/TBBZyJNIOve+JEo1QPmEHjDXOG+zhgJdGNWVY4c= sha384-66GlLUhSM8fjCEYhQe8jpj2YxoJmDxrhbf6cFFZKXs2lSp37pWwcb9jZFSoFx4NX sha512-EX/6y1IKJDKllghlw6eYxCICFXpkWzC+sOzxIr8bJ6tT/QQ/fapWqMXwGJFyEObfhj+KcO9KwI4zl8e9Tv6Xjw=="
149
- },
150
- "icon-end.svg": {
151
- "src": "5296aaa9429bfe5364c92abde90b4edc.svg",
152
- "integrity": "sha256-BXtydxlsc1UFcXLNGICzgSi1AAleC4V/MHFo3GmofHo= sha384-xnAT7T4PYBriYONAxS9fe8MaPuMfGFXqEb8dyXWAN0CqZwg9E3qQE4JDXPAJYSiw sha512-cAw2abfRDgnsFKfFkb9ZjUeov0AahzebMlDc9vKr7+PAwSmvzfHowgNGvRQc99nDAXALUwbtuNPqO5k0lbZLog=="
153
- },
154
- "icon-event.svg": {
155
- "src": "fa1d0a374b1f522c38359988bf6e1397.svg",
156
- "integrity": "sha256-pP/L+KKaa88C4cdigU270H2BnnFgok5DJR3WmvSNqbA= sha384-PafVjCvOmkOHIwcKLViwNuAvEqvafJ3dmuEFeLuptY+yi7uu8MOSZhYvFuC2oJWy sha512-zsjD8duZuW3hSIOfdmuC8Ir2h1al6lvobuoNBUy5L7oA55PLn0d5ctr34jbjp4OarvDAWtYGAUlhAOfd8r6G1g=="
157
- },
158
- "icon-external.svg": {
159
- "src": "97a63312f2f3742a92945f8d88749dbb.svg",
160
- "integrity": "sha256-ZZRqh5dtY6W9RtdFwrD0BaiY4R/KLj7ek5org5dhiXM= sha384-9VDt4hCbNSJUoNFKE/x1/UrBuxR2x2hNKZFfgie6I+ogsjRcNKgWQp27o+zZhfLd sha512-YONCeRp+yZ1GwgQBqDZxvFRSTBkYvT8hMGD3WVn4EP5FkrRYDBPqOY3QFE5Kj6yy65uxExY+D4WeYUJBgU0Ojw=="
161
- },
162
- "icon-feedback.svg": {
163
- "src": "7dc00913481d3aa9a49be8cf59c3c035.svg",
164
- "integrity": "sha256-wblvGlrCG5TUofVjXU15+CBY2aRcC6h1sV4Dd0XuyMU= sha384-ssrw3CwHB/bh8E/yiLGHxatTI0xlGeOcvemUlUQyvGoehxMUF8fZDco/w1a6RF3l sha512-J8ElVtpiYvQzUlS74h/QtWngAGjkTCJqdVvXpPV5169mQx8f4YjbLkFvxJaUgQwWa6Cxeh53xdMCrU5Qih80iw=="
165
- },
166
- "icon-homework.svg": {
167
- "src": "ffc68bfb492c28cdd981df81d36e16fa.svg",
168
- "integrity": "sha256-7sf4rOZYKIP9qB3Gy1658p9KYCU0GmAjt21KjuuX8sQ= sha384-evtoWVKVfwGkPHIogy6WgvvbRs8APaAJbnqS8cXl42t4k303HueNhzhqe+qizgak sha512-eDqCY98nA1OKs6dS5ERZBW/tWKdPileDrEBPLopep1hJkqK0CZsGGpb+sd/PHwq/y+dKL8nAUAAtJD1aj7DYAA=="
169
- },
170
- "icon-incorrect.svg": {
171
- "src": "79d4706e51a98be43c9d27102c6b1b91.svg",
172
- "integrity": "sha256-0wBdRovm9zI8TfENz6nTYhEA+CPEobOUbB3wuZPDcdY= sha384-8x6qtL6UDYSqef5xokqC153m/QEnHeT/y2jlVTbYsa21SGzhbGr1vJd4eaQEn+3k sha512-3ePjz40aQczwcCvh0e7sKMQWog9l2tRVH6aP9l/i2ye/Nvy4zfphsX+Ke15YXK46fKWm5WhBvzRdziGBw/WRaw=="
173
- },
174
- "icon-individual-review-heading.svg": {
175
- "src": "005ae70666804bf1b4fcbdd1820cda69.svg",
176
- "integrity": "sha256-z6B3CCVljKsfARlA4smvKa8MWT1+yKVyCb5Q2xPV+5s= sha384-L41LTjzYeTj1BAfaxuLLplZF5lS9HI7r19SlOprdfYlZxyuN6eWYweCLySfBJLl8 sha512-4/0E8WkRF7zyekaFucGHMho/+sqyHb57QvTwJ5U6ZYZw4c8ACFoHcNDd6R4kuI06ImivTmvK0c+3IFju8WpOcg=="
177
- },
178
- "icon-individual-review.svg": {
179
- "src": "94f2e768af2ef350e8756f5159a3b560.svg",
180
- "integrity": "sha256-6XWMkb/NOcs5yKd3zXn3wHG/X9dHpX7eIhPVTWmPMjw= sha384-Zvssf5n/SRzZl/1nr26TW99JJrgDKZSrb2qjB/vP0OySH38HTBP1CSxtR95rTK8i sha512-UoAVUGQXLBdFHocYTTZtQT4JQa1jFyvDv3dKj0YqCwr5BGuq2ICgI+ItT+FLpUxleattFTAoNTxZJgnqrdkkIQ=="
181
- },
182
- "icon-interactive-placeholder.svg": {
183
- "src": "2a0017a49d2dacbc02dab29ba52f7a08.svg",
184
- "integrity": "sha256-NCfCPWYY8SX8a8wF0UZ71MtZ0xz7cyArY+6Z4azs2wM= sha384-jtOPNwwOtGb7IBOjTMGbjUqvTXjpvH9tn6aiHPtNKp8j8KlN44IihZNrS4AxtfAQ sha512-9U1du0DlL8DOIe39bsEQXEwWbS4NQmrc4vGC1lGL5z4r68mkcC3KOFkwPi2BWWN/vHJ82daqihBKmk1eCn74vQ=="
185
- },
186
- "icon-interactive.svg": {
187
- "src": "790f8f667a1ef6aa74114278d7e58b7d.svg",
188
- "integrity": "sha256-FDbdyyGIVVSSUlTj9A1a0BgEVkURMetRvMdKSqpt2MA= sha384-XhOGsiw2ypmKK5+Q8ocjx6FNGACD8F6pMOauwFtONWL47vA0tsNFDUkpmzfpzUgI sha512-P9qJuOoQaUHZ/p+1oa9AAYjAHJKg2BURRjDmHVRHomOpJakz9zKblJNaYRVaBOJWXrWWqqsDpwAI6znqVuazNA=="
189
- },
190
- "icon-new-course.svg": {
191
- "src": "8ff80c156c21fc6abf9683c5c17de83f.svg",
192
- "integrity": "sha256-uo955IwvjR3ScptZKAdQptFFCc+L5T/JmZ2hu4Hldxk= sha384-kK4iY5qdUN7UpWRuRLz4n3qFAs1m+5nzAXCySMKKIqBMNkV7/ZOZbOoZ+4E2gWTn sha512-CiUa0EJHljs9YN/zfJTcHDXhAHfl/0LpLKD0ndQZ0XsXRaXhHXFVVC6FoEHFmlMJhjuYWndhvm+iu6gnRZsE9g=="
193
- },
194
- "icon-personalized-intro-heading.svg": {
195
- "src": "cbdf929d0e17cf97add3bc0dac6a7328.svg",
196
- "integrity": "sha256-IBctmn9uifI7pVyxN2AexMqDiMA0kBd9GIWXvmBjSSY= sha384-QSASvvsbnTxKvqE39SdY/SvOMZtN3jta5tfglrpReaBQwrWZAgiwx8Lu2Nr9K8bv sha512-j8nX3RJSFuflhL1gMAKFdbnT//RvitfljX2J/mKgMnF7qekYoWAJGyi203k6/U4zWjEUIdFwHAsrnuE6gwOxqw=="
197
- },
198
- "icon-personalized-intro.svg": {
199
- "src": "d0ec81696d3f0f537b73cc7d55aa5d8c.svg",
200
- "integrity": "sha256-AKsLueFcgvjfVdRvoXF9JRaEp0d00WJWF48bplDE4KM= sha384-irp1AA5AMLgDZ+PkyQcv7WmIyQocDbgkMYiu8MXHFVbykU59Z1fK9fiYIDUNZfK9 sha512-MlyPKN8FoXgF7KyvwCCUrz0TcbrU0D3S5IDTEqoigVH6jqg6SBjn/wva+2usftm9DMBiIw7JxHSmRGYAJLUrSQ=="
201
- },
202
- "icon-personalized.svg": {
203
- "src": "db35e38026c6e71b91bd689fea0cb6ce.svg",
204
- "integrity": "sha256-os5aOEnjevx/9gTLS5wGa+r4Zi/Q2U+DOXwxiTOVwNM= sha384-rxBYlhFhyP2PIvkoK9jnLeoNzIcq3iD34xkmhOuAp2+gZMJ7jgvw8zww5plJEqlf sha512-28R7zIvQX8En8DYGFNqGksngu6k0I2qZ7L4ebfV2GA/jOEGIwgKIImPWDVJKuImKbqN9C4+PTJN8avPlCrxynQ=="
205
- },
206
- "icon-reading.svg": {
207
- "src": "260832dd3b75923fbb73c2e4c9496f76.svg",
208
- "integrity": "sha256-JihCXF0Rayd2OIXiTGI78+9gSUkL3YvE3MojjVlkZVk= sha384-6hh7LBOpsGEbwmSjprn/8u1at61H5ihj7LWWhtokxGxcx7Y4ClJsdhPQU+ehycHs sha512-g1kceTzm7WkbTgl9OFbb5wFHMSjoFTntz71JdzgPogU89DzJd7z1rJ+ecIshV07z0jrEWyFQag6oL3kO9qptsQ=="
209
- },
210
- "icon-recover.svg": {
211
- "src": "98147b62873e4126b3e401e1de69dc36.svg",
212
- "integrity": "sha256-LCc1oQEtidXDzm5gKYdefTDgeXdN4v9eRVgelyyb1q0= sha384-Oe3lDlAtROLcqbua09sa4U+dx0YKgmrGFWm/sB3V0a7F3weiBctVTe+vc5UUon7e sha512-18OSvbgIM1m/PQW0FZDD8hUw8lkcHlra9U3l9rDPMmWA0rZQWuBncLLEStnuMk7Dg0xJFLHXkoBoSFFsPLEr8g=="
213
- },
214
- "icon-spaced-practice-intro-heading.svg": {
215
- "src": "e9b103dc00923e20ca3513fe7c827e99.svg",
216
- "integrity": "sha256-jjfLXDcMqN2MKGTmPbV6xWEiFADvVpPFgspOUeU9nWA= sha384-Jp751ZJHk16LIUFNIISYzeUxqs0Wstixcft4IEfcErIyH8L7mHRqQ19n38M7ijWK sha512-DJwbFJ0ja/dQ+Pk1bWEpTcr4nErrITukQMnc3RMFZqZ2wvjkr46N2Oj+VyHyQpeazVdP+IIZTHGIXyWqJKxpdg=="
217
- },
218
- "icon-spaced-practice-intro.svg": {
219
- "src": "759ca0007f65b2d71b45b77183d98762.svg",
220
- "integrity": "sha256-IVk9O+hTqIhPE1HtFcKFNAhl8KA3AloSA60hc1D35SA= sha384-mrz5GkX/eaPGtpB+SaJ+SbeRe+lySFZc8ypl9S/FOYCsSU1LsTK2FXbjTZqNb9rV sha512-GP+2CFuLygKSpykN7HXWrZ1R7JqrApgx1FeVkA27Hq3VbGQTona6iemrdPz6l3KZTrTpOTQbmkDi4f8RVM5zrQ=="
221
- },
222
- "icon-spaced-practice.svg": {
223
- "src": "313955b37572c6d83e0989fcbaaa3a1d.svg",
224
- "integrity": "sha256-dnJamctcrUQMUEnuJ9USdrPjwdzzraj0diuOdRD9+1c= sha384-uusWYCiPcxLnKG/m4+XecfUlSb+voNei1uXO/B/CVq+3yTBT8x+XEE8/k4LJX7L8 sha512-cdEo0Ea50nJPfX1NwAuVGvdhSd97VJkGnJOZ0ThkwZDuBVeYnXzOlMznVQsIKIFxfxMURxPtgr7Lgvqe3V5ahw=="
225
- },
226
- "icon-test.svg": {
227
- "src": "c07bc4e863e2e875e4f7367ad7da03f6.svg",
228
- "integrity": "sha256-8ovyBLYu4km60nOW2obXQGLFPN44ZsgyIiSwmO22b9U= sha384-eBQPb5Lok6/b6BsAvI20ANFiymp9KvTSIay9kPJY7SBuBRBiAUKnnh/3foT1WNfa sha512-ngj/qVNQrlwKcX6g61bnPfdI6kBpJSeLNb31k/eqSamn+vVZ2hb7RtbRWVOCKhlSx3/2/u3MSYWMhPFwKV3zdg=="
229
- },
230
- "icon-two-step-intro-heading.svg": {
231
- "src": "000934185c3c0d5be58c6a6dae7b8f26.svg",
232
- "integrity": "sha256-2Bytl2XMGtb9Z3iXDtHJNY7P2mWQIRIsViY9L1unwXc= sha384-haJFr46mCgFjuJkcGOFjtcMyNf38Yr4WmzC3gn9G5YXhkt10IWP/MqTjxFKKa4HF sha512-uQjoDHvw4BJ6LeVVj4Gac5cR8Kf3G1jJsRfuCixzNTAWdh7SYzuodJxzpih9cRw2Cnqn/ZANwfzWBkJGt/NDng=="
233
- },
234
- "icon-two-step-intro.svg": {
235
- "src": "dada9a6e0febdd86d4ad4ad3ac6ca2f0.svg",
236
- "integrity": "sha256-dDRjGCnDNkRKFd9AnUYsfCG97J6LFcxa4JQnLCwFkxY= sha384-E+/YdMVeaVpfYBHopB4Zm9KP4+zh4yfcNfdl9Y8+1wxS4+Q32uzkL2UTVAdCCe/U sha512-O/ctilyRrMXmqQnQyI4Qukg/8QHRxxkVU7hKMWZQHm+SwMP1xag6bsltJ86U9dZv7k/i1516I0my1jsnUHbaIw=="
237
- },
238
- "icon-video-placeholder.svg": {
239
- "src": "59c2b6634ba0dc7fc7eca3ae8a679152.svg",
240
- "integrity": "sha256-p04VjnTOPydVDkpF0PZV4UIzMxvO/BQR2z1GRMVzc/U= sha384-v40l/dwi7PJeU6QHWw+SnLWN4Uu5KDSjjkAv74tUUgtl1pS8mjh5W5IVupD0YFcM sha512-pCbKElEAoBeSyjU1jHHE8cpCG5+uFOy+rgEgAublEdA93CorUyixibXA5iVKrrQZ/ZQmcXlluj8aYKhf3sOMow=="
241
- },
242
- "icon-video.svg": {
243
- "src": "21f3e628bc44dfce2e24f8cfec47a0d8.svg",
244
- "integrity": "sha256-NlwXchMCaxZB3VLlcxo4piwni5jjo/eplJ/UaQU0DdU= sha384-Xn0xt8K/Sgd14fGQVyjPsstfi2Y5L26OPu6UleKEsJhszceJJmcgY4dr16e6OFPm sha512-tpsdzcO7wls31Vl3Vsjc0auMJvR7cEo8hOoE+01xVLVkb5qKi5pOCU4xaXG08xFVL33dRx8fUm+z1R+jIRTUVQ=="
245
- },
246
- "icon-worked-example.svg": {
247
- "src": "309b353715d7c6b9ae2a81b1a9023780.svg",
248
- "integrity": "sha256-8t4YvRZDcaIbUnrchsq4D3m8C9A0yIRrk7IcaHhZlcI= sha384-tn3V6W2JF0UlJxo7WYGOURgMjCIRH/VqF4nJUX06YQ1oGXP02A5G5sWPKtvHby52 sha512-UEGcHtTj0NogdhyqXRCdeUzLUrsZvGTTiX/UCkqimBGBzLSaIIO3EtNr8JoYAdUXQEq3nMQul6ouZhJoRkgHEg=="
249
- },
250
- "icon-wrm.svg": {
251
- "src": "c7bd4e178229a98b8774588bc7a6ffe7.svg",
252
- "integrity": "sha256-XcbLf91P/SJgrYxy6CNDq9FOGxKCmNVw1kauO6S0+a0= sha384-d52Q/QDbFPf1ZLVgAnBk+In+i7l0I0FHCxj15XlH24um/dgLm+Zk+s+WVood+nqr sha512-WyNAhnnew2LtsesFuvBSsZq9OjeI8MyI88INYfPPgZyEJmkkUwk2w6EhKl8aJF5MfyMohH9eUefFiFLXiz9InA=="
253
- },
254
- "instructions-highlighter-icon.svg": {
255
- "src": "8fe7c78ea503e5570a5f304da25a18f4.svg",
256
- "integrity": "sha256-3toLWhK8uSO9ZK4VZb5Ts6PmF7FpPw280LNrj/aWd1s= sha384-nC8EOBd4BAxIJkFAKxksaH7ufXYLwZKqLhRpx8Tm37OP49QJL4wQfSAckxeZIMRB sha512-ZQ59ZjAJjrSnH10iJji/pGwPAuLXeKgejtdfITg112TP1Y13FOWdAYFDUs4As2EAufPaoZaCIeSMKH9cw+ug9w=="
257
- },
258
- "instructions-notes-icon.svg": {
259
- "src": "fd076cc8c9652104b669e16f1fd6dd39.svg",
260
- "integrity": "sha256-W52rFj58UdsNd0AxpgN5ffwqyh1MQaotN7Ii1BmBDGU= sha384-Mp4WKhTV6XHT+hzBi0xu6BBgD9DV/OPWkhJRuouSKS1n0G0rzzew2GzbwcS3q9kz sha512-mqfzAy1YWoMF46TSuu99p2kuQN7cRcPm9511iE3k97suXlDHkXd9ViBRV3W7p6cx6Ry9Pse+RDKbhJ3WLFOsqw=="
261
- },
262
- "instructions-panel-icon.svg": {
263
- "src": "f54739e81447998f251bfa4cfe5235d8.svg",
264
- "integrity": "sha256-daRrpXUohzziG+lL6n4EC+skDqyzi5Gdm8JkgwqOG24= sha384-1Aq1g3NDNjzRZI0mn1LzesF1DR1LUwE5iXY68lDBfD8WyMx1s3M9/Rh1VXoUhhMr sha512-fy5qGHUe4wpqJbr85X0Pnj7yCXcEqmHc7TASK23xv8F1BWp4GVgnSAwnDl8e+bGlb3mFe+0G7DLmVu7VFgzzng=="
265
- },
266
- "lmspair.js": {
267
- "src": "lmspair-b920eb0be760a7c440bf.min.js",
268
- "integrity": "sha256-zj4BIjiWRMW8+QCFAF5QoySAtYl3X6v4G6ghehGUe2I= sha384-w0fhrLZFfWdcozcxYAvU5Fn6cQBoJXReN45T34IbFAAY3dPdKwXA007UCx7G8bnR sha512-PK7Y3NTJP4J01XJUP4zlvDaCbsSJH0+UGefnfEsRqQ8GKK8jukCWui23teFX8qPptHi+9cgPUz8FhEUCRssWhA=="
269
- },
270
- "lmspair.js.map": {
271
- "src": "lmspair-b920eb0be760a7c440bf.min.js.map",
272
- "integrity": "sha256-r6zqgX5y0+kz8XueErGOCJp21skTeBg2Cyc/HYpBtp0= sha384-/KoyUPKkIwTK8WbNGFlOZcNHF/yzHIIEhmUpIucAyel1Wyl16JTTszBbmIgNVXk0 sha512-q8sytkhkh0q4LuavgoI/ByIXferqUdDsRr25F9l/ws2vo3sxvWQyEq539MjltvvFXPwUjf42eRIlTANL/lEggQ=="
273
- },
274
- "low-cost.svg": {
275
- "src": "d472c99532f99a96b0077c98919b225c.svg",
276
- "integrity": "sha256-YUxnr6DqF7RUBPLRkpeMWLzD8meevaYeGICF5sjKqdg= sha384-7/cRGlxuGP5Txh69HjejWx24sA1ADsF654y3fdtXQjsfzHwkrRVz+8qz/nXuG9bs sha512-4ql/s1cwVQAUZY7SCcVG28yT8NfMO9n7xp5Q+Hbi17dq8ktZsOnW4KGRjfIQLzYv5Gq4ba1h9kS6ZuxKa4BecQ=="
277
- },
278
- "machine-learning.svg": {
279
- "src": "55490dd6c556c47099d62009ff27b239.svg",
280
- "integrity": "sha256-KcHMLf9/Jk/SiWir2R4GoiVibnaSPsCSVaepMB1OXU0= sha384-hvPkNJSzfgpCJ1H0d5cFekKzF5YS07R1bDUFkVXQn9VOKLeeHKRXizHKXihTe1nI sha512-Ioas8FnK3KSgZyCPzy+4kyVbkTcSSQI7t0I4xip+qjIMcTbkY2tmKCE4KgfBmsMibOrOkm4Cdx0ayQAHBAruRA=="
281
- },
282
- "openstax-logo-white.png": {
283
- "src": "f2444d4fd75af3b6705db4faa67c5159.png",
284
- "integrity": "sha256-tx/oz4lQz3fk1MD4bkCh+q7ccRbZO9jaUkNUdLa4agw= sha384-6QAmqkxWzSaCGZfZXeQ4DsgzeUl7VAKMxuGznMuaODWTWZ92B5NbRwnX2tmOXNGq sha512-fs3NoJJQNCJzk7wq7KfV1Hm5amlhkHSboGK2SHolGm64KIoHhh8TAixfzYX1q6F/lDNvmuNqfQOatItzuMvYaA=="
285
- },
286
- "openstax-tutor-beta-logo.svg": {
287
- "src": "f18b0f23c170a67630329412c35f7db8.svg",
288
- "integrity": "sha256-nL0MxXkLoMYbAVmOnAzUMhFN+GsijRlbOvzy4Vb71u8= sha384-KPsn3+E01chDGAQ+iwjPG4zT40tWQQgeTG1IcDrZGssmvJZZxumw3YJo79ocGgNV sha512-sb1CRkrTtA9wMmafVG9A3JXNTkBBJ3Gs+j9KNLImVPqd+HBWqQ4je7ZjKY0GH9DzDFUovhPajwPH0Ulyh5qZYA=="
289
- },
290
- "ost-hero.jpg": {
291
- "src": "f0d3bb6d9242c522ff41985568cdcaa6.jpg",
292
- "integrity": "sha256-Wmvgh9YW1rpqmLHTNDG741acRV0Ed/4bXmUyILaTKg0= sha384-86PzPaGiRYQEKGshdQ952zAF0e1wgRlmOuijLqtdnzL5Htmot1vjDK/JOxfHk2wI sha512-wtsH/jVxQTcJeY/amx8IYzLcrakfPAa/1cMC6X55fJNpinYOqYY8JEyC0N4/XOL2M2oXrXWXAN7buy15ZQ3BDQ=="
293
- },
294
- "pending-verification.svg": {
295
- "src": "e767f1bf6310180b139aa05f6b533263.svg",
296
- "integrity": "sha256-RGKCVnt5LvnfsQw5fnaKWdm1MnqbPP/S0UubXFzHTfY= sha384-3pjlCK8T1uTBU0anaYdwSYckECzPiEFv/2ZtwdSshTdOhacNtZYMQ+1SX0FXZ+s/ sha512-r1E1lmCRwedlIrD9ICE+slrnhmmJinYzfdtqIZTmIi47dNqSbdm6Pjgc4zOatB5U5D3sVB/LDB3zCmbx+F/Dlg=="
297
- },
298
- "personalized.svg": {
299
- "src": "2b20d03cc82916d962b66602c03139a9.svg",
300
- "integrity": "sha256-O/LsK3vPlv3BQ4ljTxYNbtV5MYIUHjxy6RvnydzKdJU= sha384-CAjpa1dwP1lEF8I8SAwrzQ8hVEiTNj8Qn+PReZ8i9VD4mYogIrmuaoHJfjSYMrlN sha512-CtNXI/LqpiQqLr/fj7axU7LxU0LBzhA/yvLMhKd0sSz7ak3I19BOVf5RqSJGF6UXJ7oK760TXcMrGPfL8ppmlQ=="
301
- },
302
- "question-details.svg": {
303
- "src": "7db5ec34af929030c99ae593ef1129fd.svg",
304
- "integrity": "sha256-Idl3X0htyjennT4iZ7wlad6oLwPni5e31qIjHvBG0ig= sha384-nq5eoyY7uHelThhHS6ukxsztaSPvxC8fUrRNoFzFDbkU+KVgS3SjGtBQejy5zq0+ sha512-ryndGXWUjsPEeK04P1R8QjyLFvKqGQGKcSQwzPU3hszqaPHY4DkAR6Q4xTX2lJL3B7lbpwlbucSNxJjByF2BSw=="
305
- },
306
- "sociology-book-thumbnail.svg": {
307
- "src": "87f800dff49d121084ae12bdf6b239f7.svg",
308
- "integrity": "sha256-jKdj9T2a0NDgMKN/f4kBheWk4Qj8P9ijxKVFo5Az+n0= sha384-ueLpzQcQT6xn2mLd9fwBYN5V39agKUgQ0cB5TKoZj3uPAxugcUi6/45CuyPVcso7 sha512-gXqXDjmj8Z9FIBg/9P3HDIFdIGFNj1Og4FBlx0u7R4g42P1cK6jV8zVv4vzz8WsVOhlsucpxix118PwPidhyoQ=="
309
- },
310
- "spaced-practice.svg": {
311
- "src": "921793921ccdd98049dfb9afc9e214c0.svg",
312
- "integrity": "sha256-EuBXQAroPjLMdFlcL/7lxOwGhTzdgEEtDyCMfXQK3xA= sha384-m/r7MVfXZ6nvDei8nVZGxMxMUvkTzsJ6DG0xirWVvTFTuTzj3xHhONatgW2tR2qJ sha512-3JjnvUz/2vzWu6glse5dfmGC+q7eoZVQoCZTz0kDjB2Cd62g8tMOwblxGd01rlNN58QwdM7+JtLnTNV2YmXvUg=="
313
- },
314
- "student-id.svg": {
315
- "src": "a43719051e12773aac21032f5605bf44.svg",
316
- "integrity": "sha256-JGhkqIZaqydKtTHRd34d7siuWWJqPK4aBclthhxSBHY= sha384-mvQWsSeekaNJvsxZVYkt+yjrj7SeC1mpdtuH3rDEPm29MMu6u0TM7l09gkwsr1+Q sha512-KrKVoQojDXREk1CgmPzb67opIQXHf2GGaCbaxX3MbbWoCRKsBr1SzUtKKejeOXXqEcYgH71C7alqAEAsXv157g=="
317
- },
318
- "thanks.svg": {
319
- "src": "b6c57fb1a28c9b844d80c2731eceff04.svg",
320
- "integrity": "sha256-V9gGBEv4x3SCE4rXswydR4vwBJGCDsbP6RVLcEHn20Y= sha384-mTjvU8iI3HzfV2Qwx3GrIBUXEKgeEwHe3ZRDixFJxLiN1NcjtrcbxqeIDRb0yYvH sha512-DaCD05S8s2vE3UkE7rls74qeNwSCbdGYtQXA+Bze4FkjCrWIXxb3shl2TWp93Tc0l5e4WMYE/yimfJ8Av1eLcQ=="
321
- },
322
- "tutor-background.svg": {
323
- "src": "3cc6304df650475b4f10f232ff1a5ef7.svg",
324
- "integrity": "sha256-hwlHuLTQur24h28OmJblnn3sxHpriuWag+JZEP0FmwQ= sha384-Znri9p3p0BEVkbUHn6dC/4i4eaEE/vZgo5GY7sB2vQeDQhEjNRGyviKM+n7g+tOm sha512-1pejTCv0JPxfhLQ/YccFsZeFzKNo1rmxM0pG3w/p5C9jAJNgL+8SxQzJ0CDhATrPXEKJAOMQebFjC0Jp0OJQiA=="
325
- },
326
- "tutor.js": {
327
- "src": "tutor-b920eb0be760a7c440bf.min.js",
328
- "integrity": "sha256-tUf3KX1QlfRrJ7KJQQ4Ug40ZQS2T5thLAHSQoxbFI88= sha384-jmALLyE5iHUJA6h/FjOiPJT91DkuFM1XFIvo3OI8ZuaPm+ViPRdVwMrx+i5kcchC sha512-BBlxT9ywpOCERkuP0CSu8AKLRCWmd2uNMf7xwxZPTNH7233TGTJrcnClysI6x19gjYfiaC0JAmmfzNJImEjWPQ=="
329
- },
330
- "tutor.js.map": {
331
- "src": "tutor-b920eb0be760a7c440bf.min.js.map",
332
- "integrity": "sha256-Zzt45LgnZqL+4u9CJPZkJC12HZSsB7mLGfqAF84sy0M= sha384-CQoX4WqDssFuIHAQWSYjVVypECIxQKFTSUT+NT3Zt34j7/4GnTswEP+4wHgAadWd sha512-7NM8XP+5ZrEaWzLYKcS1CmsLtRQ3o/0Xsfl2UT+H8sGRbo3aaUVagdnPE+ldWrjyKtPqKbb4Z3IrJYBUUzfZzQ=="
333
- },
334
- "two-step.svg": {
335
- "src": "420bd9cd338cbadd717b467652f39972.svg",
336
- "integrity": "sha256-aNb0APXZC5Ccskfvym4qLaYuidR8Q/DCdScvaDbY7+A= sha384-S4QxsFZ9BwOHWQf2RjXtXpghVIzss0LkIWxIr/jgjEbDj7UfkY1NNUCnjpi3tGyh sha512-fKvPtm05LtVny66ebvGEuACVH+FZasRDkNym/kbTQoSp0JHBlaGROLDyaIclri3i6/lauJBUR8E0g25hfsyPaw=="
337
- },
338
- "under-construction.svg": {
339
- "src": "3ec1654100b2949e03fe3672d4d11c02.svg",
340
- "integrity": "sha256-XYAFrfp93PRK93dmGmyuHwF0Vc8aK607Wa8QaR+d2AU= sha384-0/CAwh8G+ojbqV2jbISPpF8JZz4cM40YhSRB5OOtMDW+oeMTSAFOrydhAYbmTacR sha512-PLHo8+zkC0JqAJC3ZPK5WNZbFiSGHYYHI6XxmaL7yIEX8w5kr4n6i5N/WVpeeyLP3SOo960q1giupV3BqAHSOA=="
341
- },
342
- "view-analytics.svg": {
343
- "src": "9d10bd3d48974cdbf0f331c7feddd248.svg",
344
- "integrity": "sha256-vtNdsHjfsjbQk/5oNADgrIAIqURecD9P4ZrZAo6Pfes= sha384-PlIKDJbmktmjRxnOZWLjKXN/ClJryQR2zfPmNrfBMvxl+dku7vumqYFRIfwkoK9j sha512-pwgSXSXsQxdSIN6Jot3GFP2yQTaj3qNDNh7lkhq+w5H2CpdBCEcCV2CS/CHJNZUMymhvbEJFNs4hKASdNkX3Sw=="
345
- },
346
- "view-textbook-questions.svg": {
347
- "src": "08012f03a5268802675536d260cac3f6.svg",
348
- "integrity": "sha256-mvsVwamHpST7FAvIQHdMvnTTAY1sBid/C+ezqf+wdmg= sha384-5X7g/jp6BEjbh4fmyRz5OdXYSRQ+GOKCgbxifciG4jsEVZbEOXB80h7veLLcIyqO sha512-ebw6zM2nJ3l3B0x9x7eVWE6cOnAK1os4kKX75JBByp7YE/LV/D8He5a3EBJehUHvMlIIBsD8qqNKClanvp6Jug=="
349
- }
350
- }
351
- http_version:
352
- recorded_at: Thu, 13 Sep 2018 17:45:53 GMT
353
- recorded_with: VCR 2.9.3