openstax_utilities 4.3.0 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
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