CINXE.COM
Open Textbook Criteria - Open Textbook Library
<!DOCTYPE html> <html class='h-100' lang='en' prefix='og: http://ogp.me/ns#'> <head> <script nonce="2428adaef46733dc673959f7e27be192"> //<![CDATA[ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;var n=d.querySelector('[nonce]');n&&j.setAttribute('nonce',n.nonce||n.getAttribute('nonce'));f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-KVLSPNJ'); //]]> </script> <script type="text/javascript" nonce="2428adaef46733dc673959f7e27be192">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"870b502a95","applicationID":"175895155","transactionName":"JlcNEUJcXg9UShZYUAdKAhdJHF4KU0pYRkBKWgwKW0A=","queueTime":0,"applicationTime":66,"agent":""}</script> <script type="text/javascript" nonce="2428adaef46733dc673959f7e27be192">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"870b502a95",applicationID:"175895155"};;/*! For license information please see nr-loader-rum-1.284.1.min.js.LICENSE.txt */ (()=>{var e,t,r={122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},217:(e,t,r)=>{"use strict";r.d(t,{D0:()=>m,gD:()=>v,xN:()=>h});r(860).K7.genericEvents;const n="experimental.marks",i="experimental.measures",o="experimental.resources",a=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var s=r(614),c=r(944),u=r(384),l=r(122);const d="[data-nr-mask]",f=()=>{const e={feature_flags:[],experimental:{marks:!1,measures:!1,resources:!1},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{get capture_marks(){return e.feature_flags.includes(n)||e.experimental.marks},set capture_marks(t){e.experimental.marks=t},get capture_measures(){return e.feature_flags.includes(i)||e.experimental.measures},set capture_measures(t){e.experimental.measures=t},capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(o)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:s.wk,inactiveMs:s.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){a(t)?e.mask_selector="".concat(t,",").concat(d):""===t||null===t?e.mask_selector=d:(0,c.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){a(t)?e.block_selector+=",".concat(t):""!==t&&(0,c.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,c.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},spa:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]}}},g={},p="All configuration objects require an agent identifier!";function m(e){if(!e)throw new Error(p);if(!g[e])throw new Error("Configuration for ".concat(e," was never set"));return g[e]}function h(e,t){if(!e)throw new Error(p);g[e]=(0,l.a)(t,f());const r=(0,u.nY)(e);r&&(r.init=g[e])}function v(e,t){if(!e)throw new Error(p);var r=m(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>d});var n=r(122),i=r(384),o=r(154),a=r(324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0,harvester:void 0},l={};function d(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!l[e])throw new Error("Runtime for ".concat(e," was never set"));return l[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");l[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(l[e],"harvestCount")||Object.defineProperty(l[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=l[e])}},324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,xv:()=>n});const n="1.284.1",i="PROD",o="CDN"},154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>c,RI:()=>i,WN:()=>l,bv:()=>o,gm:()=>a,mw:()=>s,sb:()=>u});var n=r(863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,l=((()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)())},687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>d,x3:()=>u});var n=r(836),i=r(606),o=r(860),a=r(646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};l(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),g(e,t,!1),s[e].size&&f(e))}function l(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function d(e="",t="feature",r=!1){if(l(e),!e||!s[e].get(t)||r)return g(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),g(e,t)})))}function g(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(990),o=r(371),a=r(646),s=r(607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},l={},d=!1;try{d=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=g(n),c=m(e),l=c.length,d=0;d<l;d++)c[d].apply(a,r);var p=v()[s[e]];p&&p.push([f,e,r,a]);return a},get:h,listeners:m,context:g,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:d?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:d};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function h(t){return l[t]=l[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),l=(0,n.Zm)();l.ee||(l.ee=u)},646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(566).bz)()},566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}},614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(836),i=r(154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>l,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>d});var n=r(154),i=r(863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function l(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},434:(e,t,r)=>{"use strict";r.d(t,{Jt:()=>o,YM:()=>c});var n=r(836),i=r(607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];l(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return l(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,l,d;try{a=this,o=[...arguments],l="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],l],e)}i(r+"start",[o,a,s],l,c);try{return d=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],l,c),e}finally{i(r+"end",[o,a,d],l,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function l(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},993:(e,t,r)=>{"use strict";r.d(t,{A$:()=>o,ET:()=>a,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o={OFF:0,ERROR:1,WARN:2,INFO:3,DEBUG:4,TRACE:5},a="log";n.K7.logging},773:(e,t,r)=>{"use strict";r.d(t,{z_:()=>o,XG:()=>s,TZ:()=>n,rs:()=>i,xV:()=>a});r(154),r(566),r(384);const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},344:(e,t,r)=>{"use strict";r.d(t,{G4:()=>i});var n=r(614);r(860).K7.sessionReplay;const i={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"};n.g.ERROR,n.g.FULL,n.g.OFF},234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(836),i=r(687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},603:(e,t,r)=>{"use strict";r.d(t,{j:()=>K});var n=r(860),i=r(555),o=r(371),a=r(908),s=r(836),c=r(687),u=r(289),l=r(154),d=r(944),f=r(773),g=r(384),p=r(344);const m=["setErrorHandler","finished","addToTrace","addRelease","recordCustomEvent","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],h=["setErrorHandler","finished","addToTrace","addRelease"];var v=r(863),b=r(614),y=r(993);var w=r(646),R=r(434);const A=new Map;function E(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,d.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,R.YM)(i),a=new w.y(s.P);a.level=n.level,a.customAttributes=n.customAttributes;const c=t[r]?.[R.Jt]||t[r];return A.set(c,a),o.inPlace(t,[r],"wrap-logger-",(()=>A.get(c))),i}function _(){const e=(0,g.pV)();m.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,d.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const x={};function N(e,t,g=!1){t||(0,c.Ak)(e,"api");const m={};var w=s.ee.get(e),R=w.get("tracer");x[e]=b.g.OFF,w.on(p.G4.REPLAY_RUNNING,(t=>{x[e]=t}));var A="api-",_=A+"ixn-";function N(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),j(A,n,!0,o||null===r?"session":void 0)(t,r)}function k(){}m.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,w),function(e,t,r={},i=y.p_.INFO){(0,a.p)(f.xV,["API/logging/".concat(i.toLowerCase(),"/called")],void 0,n.K7.metrics,e),(0,a.p)(y.ET,[(0,v.t)(),t,r,i],void 0,n.K7.logging,e)}(w,e,t,r)},m.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,w),E(w,e,t,{customAttributes:r,level:i})},h.forEach((e=>{m[e]=j(A,e,!0,"api")})),m.addPageAction=j(A,"addPageAction",!0,n.K7.genericEvents),m.recordCustomEvent=j(A,"recordCustomEvent",!0,n.K7.genericEvents),m.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,j(A,"setPageViewName",!0)()},m.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return N(e,t,"setCustomAttribute",r);(0,d.R)(40,typeof t)}else(0,d.R)(39,typeof e)},m.setUserId=function(e){if("string"==typeof e||null===e)return N("enduser.id",e,"setUserId",!0);(0,d.R)(41,typeof e)},m.setApplicationVersion=function(e){if("string"==typeof e||null===e)return N("application.version",e,"setApplicationVersion",!1);(0,d.R)(42,typeof e)},m.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,w),w.emit("manual-start-all")}catch(e){(0,d.R)(23,e)}},m[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,w)},m[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,w)},m.interaction=function(e){return(new k).get("object"==typeof e?e:{})};const T=k.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,w),g||(0,a.p)(_+"tracer",[(0,v.t)(),e,r],i,n.K7.spa,w),function(){if(R.emit((o?"":"no-")+"fn-start",[(0,v.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw R.emit("fn-err",[arguments,this,t],r),t}finally{R.emit("fn-end",[(0,v.t)()],r)}}}};function j(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,w),i&&(0,a.p)(e+t,[r?(0,v.t)():performance.now(),...arguments],r?null:this,i,w),r?void 0:this}}function I(){r.e(296).then(r.bind(r,778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,d.R)(27,e),w.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{T[e]=j(_,e,void 0,g?n.K7.softNav:n.K7.spa)})),m.setCurrentRouteName=g?j(_,"routeName",void 0,n.K7.softNav):j(A,"routeName",!0,n.K7.spa),m.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,w),(0,a.p)("err",[t,(0,v.t)(),!1,r,!!x[e]],void 0,n.K7.jserrors,w)},l.RI?(0,u.GG)((()=>I()),!0):I(),m}var k=r(217),T=r(122);const j={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},I={};var O=r(284);const S=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let P=!1;function K(e,t={},r,n){let{init:a,info:c,loader_config:u,runtime:d={},exposed:f=!0}=t;d.loaderType=r;const p=(0,g.pV)();c||(a=p.init,c=p.info,u=p.loader_config),(0,k.xN)(e.agentIdentifier,a||{}),function(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");I[e]=(0,T.a)(t,j);const r=(0,g.nY)(e);r&&(r.loader_config=I[e])}(e.agentIdentifier,u||{}),c.jsAttributes??={},l.bv&&(c.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,c);const m=(0,k.D0)(e.agentIdentifier),h=[c.beacon,c.errorBeacon];P||(m.proxy.assets&&(S(m.proxy.assets),h.push(m.proxy.assets)),m.proxy.beacon&&h.push(m.proxy.beacon),_(),(0,g.US)("activatedFeatures",O.B),e.runSoftNavOverSpa&&=!0===m.soft_navigations.enabled&&m.feature_flags.includes("soft_nav")),d.denyList=[...m.ajax.deny_list||[],...m.ajax.block_internal?h:[]],d.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,d),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=N(e.agentIdentifier,n,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=f),P=!0}},374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>u,K7:()=>s,P3:()=>c,XX:()=>i,qY:()=>n,v4:()=>a});const n="events",i="jserrors",o="browser/blobs",a="rum",s={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},c={[s.pageViewEvent]:1,[s.pageViewTiming]:2,[s.metrics]:3,[s.jserrors]:4,[s.spa]:5,[s.ajax]:6,[s.sessionTrace]:7,[s.softNav]:8,[s.sessionReplay]:9,[s.logging]:10,[s.genericEvents]:11},u={[s.pageViewEvent]:a,[s.pageViewTiming]:n,[s.ajax]:n,[s.spa]:n,[s.softNav]:n,[s.metrics]:i,[s.jserrors]:i,[s.sessionTrace]:o,[s.sessionReplay]:o,[s.logging]:"browser/logs",[s.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"nr-rum-1.284.1.min.js",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.284.1.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var d=u[l];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==t+o){s=d;break}}if(!s){c=!0;var f={296:"sha512-I5tV79u0jhQi7aouG2M+kaxUnC8otPe2WXnytHYva1pERqoP8GhxHAi7OJZyNzSvBOojrdGEBSfIO5Sy7scrmA=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var g=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(g.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=g.bind(null,s.onerror),s.onload=g.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={374:0,840:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.284.1.PROD"]=self["webpackChunk:NRBA-1.284.1.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(374);var e=i(944),t=i(344),r=i(566);class n{agentIdentifier;constructor(){this.agentIdentifier=(0,r.LA)(16)}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}recordCustomEvent(e,t){return this.#e("recordCustomEvent",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(217);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var l=i(603);var d=i(687),f=i(234),g=i(289),p=i(154),m=i(384);const h=e=>p.RI&&!0===(0,s.gD)(e,"privacy.cookies_enabled");function v(e){return!!(0,m.dV)().o.MO&&h(e)&&!0===(0,s.gD)(e,"session_trace.enabled")}var b=i(389);class y extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,d.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,b.J)((()=>{(0,d.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if(h(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(296).then(i.bind(i,861));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(!this.#t(this.featureName,o))return(0,d.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(296).then(i.bind(i,103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),t.runtime.harvester.initializedAggregates.push(this.featAggregate),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,d.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,g.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return v(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var w=i(630);class R extends y{static featureName=w.T;constructor(e,t=!0){super(e,w.T,t),this.importAggregator(e)}}var A=i(908),E=i(843),_=i(878),x=i(782),N=i(863);class k extends y{static featureName=x.T;constructor(e,t=!0){super(e,x.T,t),p.RI&&((0,E.u)((()=>(0,A.p)("docHidden",[(0,N.t)()],void 0,x.T,this.ee)),!0),(0,_.sp)("pagehide",(()=>(0,A.p)("winPagehide",[(0,N.t)()],void 0,x.T,this.ee))),this.importAggregator(e))}}var T=i(773);class j extends y{static featureName=T.TZ;constructor(e,t=!0){super(e,T.TZ,t),p.RI&&document.addEventListener("securitypolicyviolation",(e=>{(0,A.p)(T.xV,["Generic/CSPViolation/Detected"],void 0,this.featureName,this.ee)})),this.importAggregator(e)}}new class extends o{constructor(t){super(),p.gm?(this.features={},(0,m.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(R),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,l.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,m.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[R,k,j],loaderType:"lite"})})()})();</script> <title>Open Textbook Criteria - Open Textbook Library</title> <link rel="icon" type="image/x-icon" href="/assets/common/favicon/favicon-6666d4af5ecb597851b1bd6b4af4d8472feee5ef149656c053063f5c427c993c.ico" sizes="32x32" /> <link rel="icon" type="image/svg+xml" href="/assets/common/favicon/icon-0d2a8f5b51ab3059a14f0742b4afa82fe4ecfcc80305b3c52a94bf0e16aac2a1.svg" /> <link rel="apple-touch-icon" type="image/x-icon" href="/assets/common/favicon/apple-touch-icon-d7d601b3543106476d46692d8ea08dea4b727bbbcdf744e1f938f5e2fe3a69c2.png" sizes="120x120" /> <link rel="icon" type="image/webp" href="/assets/common/favicon/icon-32x32-c803789e4367172c87005d8724c6548012c9cabdd427eb9568dae1b5b84cbeff.webp" sizes="32x32" /> <link rel="icon" type="image/webp" href="/assets/common/favicon/icon-16x16-1fb95c64521256b6558821cc3c3d8d0d236531556f15788b0de758b456de57ff.webp" sizes="16x16" /> <link rel="mask-icon" type="image/x-icon" href="/assets/common/favicon/safari-pinned-tab-92ce09c3a70c51dd7b3743e4cc638a69dac4e6fb6889cf49b0aaee2407fed538.svg" color="#872384" /> <meta content='#ffffff' name='msapplication-TileColor'> <meta content='#ffffff' name='theme-color'> <meta content='text/html; charset=utf-8' http-equiv='Content-Type'> <meta content='width=device-width, initial-scale=1, shrink-to-fit=no' name='viewport'> <link href='/humans.txt' rel='author'> <link href='/opentextbooks/manifest.json' rel='manifest'> <link href='/opentextbooks/search.xml' rel='search' title='Open Textbook Library' type='application/opensearchdescription+xml'> <link href='https://open.umn.edu/opentextbooks/books' rel='canonical'> <meta content='Textbooks in the Open Textbook Library are considered open because they are free to use and distribute, and are licensed to be freely adapted or changed with proper attribution.' name='description'> <meta content='open education, open educational resources, OER, open publishing, open textbooks, open textbook library, equity higher education' name='keywords'> <meta content='summary' name='twitter:card'> <meta content='open.umn.edu' property='twitter:domain'> <meta content='https://open.umn.edu/opentextbooks/books' property='twitter:url'> <meta content='@OpenEd_Network' name='twitter:site'> <meta content='Open Textbook Criteria - Open Textbook Library' name='twitter:title'> <meta content='Textbooks in the Open Textbook Library are considered open because they are free to use and distribute, and are licensed to be freely adapted or changed with proper attribution.' name='twitter:description'> <meta content='Open Textbook Criteria - Open Textbook Library' property='og:title'> <meta content='Textbooks in the Open Textbook Library are considered open because they are free to use and distribute, and are licensed to be freely adapted or changed with proper attribution.' property='og:description'> <meta content='Open Textbook Library' property='og:site_name'> <meta content='website' property='og:type'> <meta content='https://open.umn.edu/opentextbooks/books' property='og:url'> <meta content='en' property='og:locale'> <link rel="stylesheet" href="/assets/library-91796f4b8e97f95f96fe174e499b888f2c3e6df2b2242737707df444165f1571.css" media="all" /> <script src="/assets/jquery-sprockets-9604073ae34ebee077913ca351aa2b7f8ca6a1c14cd5883622ccf278d39ea507.js" nonce="2428adaef46733dc673959f7e27be192"></script> <script type="importmap" data-turbo-track="reload" nonce="2428adaef46733dc673959f7e27be192">{ "imports": { "@rails/ujs": "/assets/@rails--ujs-539e0c5fdda60fc0fda95b372aa523264324b5674ff5588c8717c88b90b6ebae.js", "@hotwired/turbo-rails": "/assets/turbo.min-af96e10b36ae4e9eec25aaa9d1f39341959490c38f5248c341202038709b894c.js", "@hotwired/stimulus": "/assets/stimulus.min-6dffef3d415b06e9a0e43e64748aac6d2a98f87793d6b5b1dc2a00fec5142f21.js", "@hotwired/stimulus-loading": "/assets/stimulus-loading-b6081246c3a026b7ffd648c4b58d9f60146e33573a181eabbf14a484d6e8979e.js", "bootstrap": "/assets/bootstrap.bundle.min-c1916178b069202f2b150fed4b75c3f1d9e4adf156df22a461acf7e64d268568.js", "tinymce": "/assets/tinymce-9883d4ce7abffe2de24c66b8e81edf042f062ad123a132677eb63694bfc793e7.js", "chartkick": "/assets/chartkick-c20eba1b2a7e7591efd43ac5aac663d75fab9a9392fd8c89f84425daca857b8c.js", "Chart.bundle": "/assets/Chart.bundle-ecf72bb23fe48f65dc1eee5ec414f3fdd0cccf607c7d5e1291e569b5ac3f457d.js", "leaflet": "/assets/leaflet-224b432d7ebc13377e0d4952499678c671b104ffbe36dd6c479fc8583f9e5289.js", "bootstrap5-tags": "/assets/bootstrap5-tags-e1181c6570154590ab36498e2e5af7e25cbe063ddc851c9d0bbe158b5d709361.js", "@stimulus-components/rails-nested-form": "/assets/@stimulus-components--rails-nested-form-f89cc67954ecf3397221d0a295e73e636adb8cfb8ff30c730432a9b30a13ceb9.js", "sortablejs": "/assets/sortablejs-e346030bcbec5adc12b5cfde95574d7e708906109843abd30e885b9919976a4c.js", "jquery": "/assets/jquery-ce32ce5ce754b04a94396ebfdbf5fb2c8adeac11e90617dbdc84bedef016b729.js", "jquery-ui": "/assets/jquery-ui-7a70cfac4d0419cd5e3e30d451bed5fb6c1dd0a5cbeb2d5a32734193bc0c388e.js", "bootstrap-datepicker": "/assets/bootstrap-datepicker-05a9a0e2f0b57636a7ada905d081b2af062cffde2b5c69ec1cba848c12e361de.js", "bootstrap-table": "/assets/bootstrap-table-3e59dbc5f8f97be1a28611c6b2f7a6f834c7d889add13843898442f095572366.js", "admin": "/assets/admin-8910ae5e10966a5b8ab9c2f2efd122be86a7a4e37ac8d7632e94851e3cf40a27.js", "library": "/assets/library-adc792cc9e4bee0e876616c97c88bda4d7fe0932b671f2e3971bb8c38cf22eb8.js", "network": "/assets/network-30537bb58853571af515a268cdd789a230008b64ce211b4618aefac11c136c01.js", "oen": "/assets/oen-3e80124a9424a330109be3be381d625214213435471b05a68fe670da6cdb31a9.js", "open": "/assets/open-bfbe344949720e28e643345b827fffba9d6d205ca68270fc396294a63d9fe7af.js", "controllers/hw_combobox_controller": "/assets/controllers/hw_combobox_controller-19619334ddefec3fbfaea85c27863a36bd48e96798740107038db2abc3f3a1f5.js", "hotwire_combobox.esm": "/assets/hotwire_combobox.esm-d7b105771c96a51ebbc0a4e2871b92e596f9b738b5ff56cd4ce4c9883df24b67.js", "hotwire_combobox.umd": "/assets/hotwire_combobox.umd-dcbff27a2bf6ea468397684961a44d38e45fb337037336116531bdc4a71c76f9.js", "hw_combobox/helpers": "/assets/hw_combobox/helpers-34cc45ad2f35aab41074ad6bb06fcc2e4784b1e468d3251d7bc3ab4c37e277a7.js", "hw_combobox/models/combobox": "/assets/hw_combobox/models/combobox-88c476092c277b0697edef97d93b43f9800c9b1e9c09f347d55f81e2f1a0417f.js", "hw_combobox/models/combobox/actors": "/assets/hw_combobox/models/combobox/actors-273f7894c329c4db05cbf51c66dbf7a288e552a4c2a7cbf216616143d0673a42.js", "hw_combobox/models/combobox/announcements": "/assets/hw_combobox/models/combobox/announcements-3443e126bbab33cf28214d91112616ab805864117469c3fcef9be1482d3887f0.js", "hw_combobox/models/combobox/async_loading": "/assets/hw_combobox/models/combobox/async_loading-a4018b0d2a611c32e3c4493e771ca9247848f03ac934b5d599f05586c6acbd21.js", "hw_combobox/models/combobox/autocomplete": "/assets/hw_combobox/models/combobox/autocomplete-1eb4c87725caf270fc5151954fd65dc6ccc46786f5630c2705636618a49d821d.js", "hw_combobox/models/combobox/base": "/assets/hw_combobox/models/combobox/base-6b9b6dd3ad706c59e7638a5c3fd922b1f0c9802d0befda576fee00a63eb2a611.js", "hw_combobox/models/combobox/callbacks": "/assets/hw_combobox/models/combobox/callbacks-69f82e443df196fe1cde8260a5d8584d0d4b90c346264da4a939fd40952e2b3d.js", "hw_combobox/models/combobox/dialog": "/assets/hw_combobox/models/combobox/dialog-665cfeae29141de952ac6369704c342ff79aebbf06fb6888357d194c7f412028.js", "hw_combobox/models/combobox/events": "/assets/hw_combobox/models/combobox/events-3233e5cd44c0f2d7cfc386dea2bc821cfaeedeb3ab1baad18343016bdda3f5cf.js", "hw_combobox/models/combobox/filtering": "/assets/hw_combobox/models/combobox/filtering-b4af5e2794d42681697057293efa4c3378a737399f8af759093f99a4c5771a83.js", "hw_combobox/models/combobox/form_field": "/assets/hw_combobox/models/combobox/form_field-57bb0e27a73fe79717913d8a05d5e190690d937f65ed188eff0ecd14c6e4c40f.js", "hw_combobox/models/combobox/multiselect": "/assets/hw_combobox/models/combobox/multiselect-7220194bbc98cc61240a9ec46bd2562d5c9e225b55d6cf5f3b37b2cc0faf7570.js", "hw_combobox/models/combobox/navigation": "/assets/hw_combobox/models/combobox/navigation-ee5256935e3e0974d04f0ff8f929538e57e4b1087833b4fa5335da3d5c1bb31f.js", "hw_combobox/models/combobox/new_options": "/assets/hw_combobox/models/combobox/new_options-0e610c6d34addb779f720882e9c7153b4fe19a3f997c05dce2f19aa7ae8fa7bb.js", "hw_combobox/models/combobox/options": "/assets/hw_combobox/models/combobox/options-0fadbc18dea42af3988417e8ff0e8f720745a9239708f5515ce5fc0e97faeec8.js", "hw_combobox/models/combobox/selection": "/assets/hw_combobox/models/combobox/selection-4f2e35553d1da268873aa8fa99e5c6e1a9c75a79303b963a967c2d9103cbdd45.js", "hw_combobox/models/combobox/toggle": "/assets/hw_combobox/models/combobox/toggle-0f8fc5acae294d185d6395bd8a57fa4b7f1c1ba016e548e4be928d2e26165f3a.js", "hw_combobox/models/combobox/validity": "/assets/hw_combobox/models/combobox/validity-71aafeaecc050701d898959f4b0721d49d79fc101d567ba2cd19bfdb1538dd03.js", "hw_combobox/vendor/bodyScrollLock": "/assets/hw_combobox/vendor/bodyScrollLock-f0d5fe0c8e690da1b336712cb443b0b5f1e03ae5ba68e4068a057eaee188c67d.js", "hw_combobox/vendor/requestjs": "/assets/hw_combobox/vendor/requestjs-8cc79e2139988237617f6a3aff41d271ab189de3030d112218de4807d876978f.js", "admin/init": "/assets/admin/init-b95579e484e750f244b4e4b415f29272ed233417886e56ec164b2b9c1bbf9bb5.js", "admin/main": "/assets/admin/main-d486bca051f3b6c47d34c2bcbc83beecd18de3b5465fcaf2963c78b642d6bb9d.js", "controllers/admin/calendar_controller": "/assets/controllers/admin/calendar_controller-797098041d34432dd450d5f8626cb71a2d0e0a1b3029c4512cfce094b5dba2ad.js", "controllers/admin/check_column_controller": "/assets/controllers/admin/check_column_controller-b7b7f14dd750fc771bad42c3e0fafc97a5f6bdb415b076050c03a937b2b87eaf.js", "controllers/admin/check_subjects_controller": "/assets/controllers/admin/check_subjects_controller-5bba6a63af9bafea5c92bdd1717c8b60685e42e48ac9717238effe9cb89fe408.js", "controllers/admin/clipboard_controller": "/assets/controllers/admin/clipboard_controller-46e2608e27b58151c3aa68f15107a119763c3e6e46b7805a6c322b8b35ab33f4.js", "controllers/admin/course_controller": "/assets/controllers/admin/course_controller-3041b05ab3e436d7d3c9983bc5cfffbc48dd9f267b463351b9cc7355a0640a33.js", "controllers/admin/datepicker_controller": "/assets/controllers/admin/datepicker_controller-00c83c29de2502fd9434f1129c1fe6ddf9e653eeba9bdff4e29256f5ed9be461.js", "controllers/admin/drag_controller": "/assets/controllers/admin/drag_controller-b86bb2138fe0d7024242fb1a6f616128809ddb39076920fc9af4893c25b6aa45.js", "controllers/admin/enrollment_controller": "/assets/controllers/admin/enrollment_controller-53d0f7c4fb2a10dd3368b0b228c85c2fac5199c43f23e5280a2143e98135da85.js", "controllers/admin/file_upload_controller": "/assets/controllers/admin/file_upload_controller-47839006892d237059674276efbb9cc14af427827c6c19629dc1915c9fe9f903.js", "controllers/admin/form_controller": "/assets/controllers/admin/form_controller-ebe39545fdb125989e221fe1863f3980396b8f4696d801a1e43b3a7b035271c8.js", "controllers/admin/legend_controller": "/assets/controllers/admin/legend_controller-43c692231bf004eab61e1c191e7cfad59dfb213a22a603a44aa383c2226c3fa2.js", "controllers/admin/membership_controller": "/assets/controllers/admin/membership_controller-550e3d8b66518a11d9be20e2d3ed17c15bd024ced5220eeb8c386f02688a15e6.js", "controllers/admin/modal_controller": "/assets/controllers/admin/modal_controller-82e0791e54dd74c8081558907b4fa68f9fbccb1ef320d100dd5639ac1950246d.js", "controllers/admin/popover_controller": "/assets/controllers/admin/popover_controller-25c097a2d03e3e2a0f445fac72ed686cbc59a2dd6b5bbce9aca6632567bc266d.js", "controllers/admin/recipient_table_controller": "/assets/controllers/admin/recipient_table_controller-ebbab91eb66311c8968b03458d72d2c46d03fb3efa5707e6bae2bd98573e7521.js", "controllers/admin/remote_button_controller": "/assets/controllers/admin/remote_button_controller-2f81c148e4050ff077f4d2d6793fde0f16cfc79cdbb0949774e43cadf88cfa6a.js", "controllers/admin/request_form_controller": "/assets/controllers/admin/request_form_controller-b6deb5e56caf6683b83cad22e261b3d30a7b77f41a97b5d7056cec35bca81240.js", "controllers/admin/request_recipient_controller": "/assets/controllers/admin/request_recipient_controller-e860e59e8ab940452b8e9c20f4e5e59afdaa158f302d8df0aac1b82dfa3e11bb.js", "controllers/admin/tab_controller": "/assets/controllers/admin/tab_controller-d47080c654293d9b21a6729d0342329bc4d3262129bcc5f82d6912281e3883fd.js", "controllers/admin/tab_nav_controller": "/assets/controllers/admin/tab_nav_controller-cd9460b3d6e839a542eb669f8de61ef1ed1db001abba23033dbeb7050d0772b0.js", "controllers/admin/table_controller": "/assets/controllers/admin/table_controller-88ef8d7864501d1f485182828935d82db0977aaadb5db13382c93b9be9d56adf.js", "controllers/admin/tag_area_controller": "/assets/controllers/admin/tag_area_controller-b69bfc8991a3bc3471da762ee4b72a4c953ee11524348837fcfefa5fb629a709.js", "controllers/admin/text_area_controller": "/assets/controllers/admin/text_area_controller-4f6ac30adf5c7302b5dffbb8693c895549419965ff1db7c4f25cd2f27ec2d058.js", "controllers/admin/toggleable_controller": "/assets/controllers/admin/toggleable_controller-f5dcf182dba2288dfd4096dc9931f06aa8e0ed00ca2d35db0ef6ba57f3d103bb.js", "controllers/admin/workshop_form_controller": "/assets/controllers/admin/workshop_form_controller-4c969b8236d763ef29176f4e8a588079dfa3f5cac61409afe23875c763bfc282.js", "controllers/application": "/assets/controllers/application-6c5b179927587bf93b8fb2fbf83a17f964d01cc0bdcdd81537fe2f11fea6e07a.js", "controllers/common/accordion_controller": "/assets/controllers/common/accordion_controller-7dc8a1559c1bb5495c2731ff1406e453f5017980b96eb0af7faaeefe19e06571.js", "controllers/common/cover_controller": "/assets/controllers/common/cover_controller-5ad2350622cb8b081a1a088c34599dccb0b336a15025a77d26c1e47f4b631f9f.js", "controllers/common/infinite_scroll_controller": "/assets/controllers/common/infinite_scroll_controller-01e09b65a6f8705212d198f43451588fd7086111296a07b0390a47a90c7d5b78.js", "controllers/common/preview_controller": "/assets/controllers/common/preview_controller-892f05b83bd46366ffd6aee35c9f519fa9a57aa3f63931eae699c2c0bb83e7fb.js", "controllers": "/assets/controllers/index-d50fc38857ec5b80d738c8f000c8f77decfde685e9370ba5e3383152a2f57985.js", "controllers/library/filter_controller": "/assets/controllers/library/filter_controller-b5e44577c5687d34b8cff33a423384dd6ebbdce65ff7f1b53fa9185d08a19c7f.js", "controllers/library/review_controller": "/assets/controllers/library/review_controller-5ddceba71a5e5b1459d2111d9fbdec23ea442a018a2e20026e76f8d9f61eefeb.js", "controllers/oen/map_controller": "/assets/controllers/oen/map_controller-6786a041a058b7fcbf97e99c9f3a3571a9009c7edbc276b24d50fa49dc1511ff.js", "controllers/oen/profiles_controller": "/assets/controllers/oen/profiles_controller-b724513ca3ec38dbae683e975414a1f1f899a9a88bc69039c1222af849dee1dc.js", "controllers/oen/sidebar_controller": "/assets/controllers/oen/sidebar_controller-9fd0a65e647e1284801cc4326380ca25fd1eca5920994ae2f7ed7f397cfbe749.js", "common/listeners": "/assets/common/listeners-be4caf063f51b5c837b171883828ebdcc0e80facad9c679b5ecd084315b7e6d2.js", "common/util": "/assets/common/util-a521fb9fa985ff23462c2a40993a5f4373bffac8a878dbf4bbd55a3bb249920b.js", "library/main": "/assets/library/main-ba88f388a4d24f2c6b3181f2e3ce22e28cf5c1fc2c530a10bd87c4ae59d9c8c9.js", "library/serviceworker-companion": "/assets/library/serviceworker-companion-b556b25eef2b071fb42c147ebc4980bf067c3044a93ba2a98070839b1461546c.js", "network/main": "/assets/network/main-8979d570965002baab5723d1c17a0527843992460a47a2668b7933415b047c87.js" } }</script> <script type="module" nonce="2428adaef46733dc673959f7e27be192">import "library"</script> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="Jv513cDebDTOmjvDoMZF8zTt6MwzUxfS9FQ09nMoyjeLKn5w9CFo7B33V_dZx6XHM88B0SjWXDpqsIf2FcHxCg" /> <meta name="csp-nonce" content="2428adaef46733dc673959f7e27be192" /> </head> <body class='d-flex flex-column h-100'> <noscript> <iframe class='hidden' height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-KVLSPNJ' width='0'></iframe> </noscript> <div id='container'> <a class='skip-to-content-link' href='#main' role='link'>Skip to content</a> <div class='container-sub'> <header> <div class='row'> <div class='col-sm'> <a href='/opentextbooks/'> <picture id="banner"><!-- / %source{srcset: image_path('library/otl_logo_dark.webp'), media: '(prefers-color-scheme: dark)' } --> <img alt="Library Home" title="Open Textbook Library logo" width="1000" height="271" src="/assets/library/otl_logo-23d864367b91dd38b6ef8eeec20ee0ae733b8f3685c53f178fd4ea06f6a95100.webp" /> </picture></a> </div> <search class='col-sm align-self-end'> <form id="search-oer" action="/opentextbooks/textbooks" accept-charset="UTF-8" method="get"><div class='input-group input-group-sm'> <fieldset class="hw-combobox" data-async-id="search" data-controller="hw-combobox" data-hw-combobox-expanded-value="false" data-hw-combobox-name-when-new-value="q" data-hw-combobox-original-name-value="search" data-hw-combobox-autocomplete-value="both" data-hw-combobox-small-viewport-max-width-value="640px" data-hw-combobox-async-src-value="/opentextbooks/textbooks?for_id=search&format=turbo_stream" data-hw-combobox-filterable-attribute-value="data-filterable-as" data-hw-combobox-autocompletable-attribute-value="data-autocompletable-as" data-hw-combobox-selected-class="hw-combobox__option--selected" data-hw-combobox-invalid-class="hw-combobox__input--invalid"> <label class="hw-combobox__label" for="search" hidden="hidden"></label> <input type="hidden" name="search" id="search-hw-hidden-field" data-hw-combobox-target="hiddenField" autocomplete="off" /> <div class="hw-combobox__main__wrapper" data-hw-combobox-target="mainWrapper"> <style nonce="2428adaef46733dc673959f7e27be192"> .hw-combobox__announcer { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .hw_combobox__pagination__wrapper { height: 5px; } </style> <div class="hw-combobox__announcer" aria-live="polite" aria-atomic="true" data-hw-combobox-target="announcer"></div> <input id="search" role="combobox" class="hw-combobox__input" type="text" data-action="focus->hw-combobox#open input->hw-combobox#filterAndSelect keydown->hw-combobox#navigate click@window->hw-combobox#closeOnClickOutside focusin@window->hw-combobox#closeOnFocusOutside turbo:before-stream-render@document->hw-combobox#rerouteListboxStreamToDialog turbo:before-cache@document->hw-combobox#hideChipsForCache turbo:morph-element->hw-combobox#idempotentConnect" data-hw-combobox-target="combobox" data-async-id="search" aria-controls="search-hw-listbox" aria-owns="search-hw-listbox" aria-haspopup="listbox" aria-autocomplete="both" aria-activedescendant="" autocomplete="off" title="Textbook Search" placeholder="Search the Library"> <span class="hw-combobox__handle" data-action="click->hw-combobox#clearOrToggleOnHandleClick" data-hw-combobox-target="handle"></span> <ul id="search-hw-listbox" role="listbox" class="hw-combobox__listbox" hidden="hidden" data-hw-combobox-target="listbox" aria-multiselectable="false"> <li id="search__hw_combobox_pagination__wrapper" class="hw_combobox__pagination__wrapper" data-hw-combobox-target="endOfOptionsStream" aria-hidden="true"> <turbo-frame loading="lazy" id="search__hw_combobox_pagination" src="/opentextbooks/textbooks?for_id=search&format=turbo_stream"></turbo-frame> </li> </ul> <div tabindex="-1" data-hw-combobox-target="dialogFocusTrap"></div> <div class="hw-combobox__dialog__wrapper"> <dialog class="hw-combobox__dialog" role="dialog" data-action="keydown->hw-combobox#navigate" data-hw-combobox-target="dialog"> <label class="hw-combobox__dialog__label" for="search-hw-dialog-combobox">Textbook Search</label> <input id="search-hw-dialog-combobox" role="combobox" class="hw-combobox__dialog__input" autofocus="autofocus" type="text" data-action="input->hw-combobox#filterAndSelect keydown->hw-combobox#navigate click@window->hw-combobox#closeOnClickOutside" data-hw-combobox-target="dialogCombobox" aria-controls="search-hw-dialog-listbox" aria-owns="search-hw-dialog-listbox" aria-autocomplete="both" aria-activedescendant=""> <ul id="search-hw-dialog-listbox" class="hw-combobox__dialog__listbox" role="listbox" data-hw-combobox-target="dialogListbox" aria-multiselectable="false"></ul> </dialog></div> </div></fieldset> <input type="submit" name="commit" value="Go" class="primary search-button btn btn-secondary white input-group-text" data-disable-with="Go" /> </div> </form></search> </div> </header> <div class='border-top'> <nav id='library-nav'> <ul> <li> <a href="/opentextbooks/subjects">Browse Subjects</a> <ul class="subject-directory"><li><a title="137 Business textbooks" data-unhide-mouseover="nav_textbook_subject_2" href="/opentextbooks/subjects/business">Business</a><a class="galaxy" aria-label="Expand Business" data-toggle="nav_textbook_subject_2" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_2" hidden="hidden"><li><a title="16 Accounting textbooks" href="/opentextbooks/subjects/accounting">Accounting</a></li><li><a title="22 Finance textbooks" href="/opentextbooks/subjects/finance">Finance</a></li><li><a title="13 Human Resources textbooks" href="/opentextbooks/subjects/human-resources">Human Resources</a></li><li><a title="54 Management textbooks" href="/opentextbooks/subjects/management">Management</a></li><li><a title="22 Marketing textbooks" href="/opentextbooks/subjects/marketing">Marketing</a></li></ul></li><li><a title="133 Computer Science textbooks" data-unhide-mouseover="nav_textbook_subject_3" href="/opentextbooks/subjects/computer-science-information-systems">Computer Science</a><a class="galaxy" aria-label="Expand Computer Science" data-toggle="nav_textbook_subject_3" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_3" hidden="hidden"><li><a title="5 Databases textbooks" href="/opentextbooks/subjects/databases">Databases</a></li><li><a title="27 Information Systems textbooks" href="/opentextbooks/subjects/information-systems">Information Systems</a></li><li><a title="26 Programming Languages textbooks" href="/opentextbooks/subjects/programming-languages">Programming Languages</a></li></ul></li><li><a title="129 Education textbooks" data-unhide-mouseover="nav_textbook_subject_5" href="/opentextbooks/subjects/education">Education</a><a class="galaxy" aria-label="Expand Education" data-toggle="nav_textbook_subject_5" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_5" hidden="hidden"><li><a title="44 Curriculum & Instruction textbooks" href="/opentextbooks/subjects/curriculum-instruction">Curriculum & Instruction</a></li><li><a title="10 Distance Education textbooks" href="/opentextbooks/subjects/distance-education">Distance Education</a></li><li><a title="16 Early Childhood textbooks" href="/opentextbooks/subjects/early-childhood">Early Childhood</a></li><li><a title="14 Elementary Education textbooks" href="/opentextbooks/subjects/elementary-education">Elementary Education</a></li><li><a title="31 Higher Education textbooks" href="/opentextbooks/subjects/higher-education">Higher Education</a></li><li><a title="10 Secondary Education textbooks" href="/opentextbooks/subjects/secondary-education">Secondary Education</a></li></ul></li><li><a title="114 Engineering & Technology textbooks" data-unhide-mouseover="nav_textbook_subject_13" href="/opentextbooks/subjects/engineering">Engineering & Technology</a><a class="galaxy" aria-label="Expand Engineering & Technology" data-toggle="nav_textbook_subject_13" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_13" hidden="hidden"><li><a title="13 Civil Engineering textbooks" href="/opentextbooks/subjects/civil">Civil Engineering</a></li><li><a title="24 Electrical Engineering textbooks" href="/opentextbooks/subjects/electrical">Electrical Engineering</a></li><li><a title="18 Mechanical Engineering textbooks" href="/opentextbooks/subjects/mechanical">Mechanical Engineering</a></li></ul></li><li><a title="409 Humanities textbooks" data-unhide-mouseover="nav_textbook_subject_6" href="/opentextbooks/subjects/humanities">Humanities</a><a class="galaxy" aria-label="Expand Humanities" data-toggle="nav_textbook_subject_6" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_6" hidden="hidden"><li><a title="55 Arts textbooks" href="/opentextbooks/subjects/arts">Arts</a></li><li><a title="50 History textbooks" href="/opentextbooks/subjects/history">History</a></li><li><a title="121 Languages textbooks" href="/opentextbooks/subjects/languages">Languages</a></li><li><a title="12 Linguistics textbooks" href="/opentextbooks/subjects/linguistics">Linguistics</a></li><li><a title="123 Literature, Rhetoric, and Poetry textbooks" href="/opentextbooks/subjects/literature-rhetoric-and-poetry">Literature, Rhetoric, and Poetry</a></li><li><a title="18 Music textbooks" href="/opentextbooks/subjects/music">Music</a></li><li><a title="40 Philosophy textbooks" href="/opentextbooks/subjects/philosophy">Philosophy</a></li><li><a title="19 Religion textbooks" href="/opentextbooks/subjects/religion">Religion</a></li></ul></li><li><a title="51 Journalism, Media Studies & Communications textbooks" data-unhide-mouseover="nav_textbook_subject_16" href="/opentextbooks/subjects/journalism-media-studies-communications">Journalism, Media Studies & Communications</a><a class="galaxy" aria-label="Expand Journalism, Media Studies & Communications" data-toggle="nav_textbook_subject_16" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_16" hidden="hidden"><li><a title="14 New Media Journalism textbooks" href="/opentextbooks/subjects/new-media-journalism">New Media Journalism</a></li></ul></li><li><a title="95 Law textbooks" data-unhide-mouseover="nav_textbook_subject_11" href="/opentextbooks/subjects/law">Law</a><a class="galaxy" aria-label="Expand Law" data-toggle="nav_textbook_subject_11" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_11" hidden="hidden"><li><a title="14 Administrative Law textbooks" href="/opentextbooks/subjects/administrative-law">Administrative Law</a></li><li><a title="26 Civil Law textbooks" href="/opentextbooks/subjects/law-civil-law">Civil Law</a></li><li><a title="19 Constitutional Law textbooks" href="/opentextbooks/subjects/constitutional-law">Constitutional Law</a></li><li><a title="25 Contract Law textbooks" href="/opentextbooks/subjects/environmental-law">Contract Law</a></li><li><a title="20 Criminal Law textbooks" href="/opentextbooks/subjects/criminal-law">Criminal Law</a></li><li><a title="12 Procedural Law textbooks" href="/opentextbooks/subjects/contract-law">Procedural Law</a></li><li><a title="22 Property Law textbooks" href="/opentextbooks/subjects/property-law">Property Law</a></li></ul></li><li><a title="174 Mathematics textbooks" data-unhide-mouseover="nav_textbook_subject_7" href="/opentextbooks/subjects/mathematics">Mathematics</a><a class="galaxy" aria-label="Expand Mathematics" data-toggle="nav_textbook_subject_7" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_7" hidden="hidden"><li><a title="29 Algebra textbooks" href="/opentextbooks/subjects/algebra">Algebra</a></li><li><a title="8 Analysis textbooks" href="/opentextbooks/subjects/analysis">Analysis</a></li><li><a title="48 Applied textbooks" href="/opentextbooks/subjects/applied">Applied</a></li><li><a title="31 Calculus textbooks" href="/opentextbooks/subjects/calculus">Calculus</a></li><li><a title="10 Geometry and Trigonometry textbooks" href="/opentextbooks/subjects/geometry-and-trigonometry">Geometry and Trigonometry</a></li><li><a title="83 Pure textbooks" href="/opentextbooks/subjects/pure">Pure</a></li><li><a title="28 Statistics textbooks" href="/opentextbooks/subjects/statistics">Statistics</a></li></ul></li><li><a title="101 Medicine textbooks" data-unhide-mouseover="nav_textbook_subject_17" href="/opentextbooks/subjects/medicine">Medicine</a><a class="galaxy" aria-label="Expand Medicine" data-toggle="nav_textbook_subject_17" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_17" hidden="hidden"><li><a title="22 Nursing textbooks" href="/opentextbooks/subjects/nursing">Nursing</a></li><li><a title="12 Nutrition textbooks" href="/opentextbooks/subjects/nutrition">Nutrition</a></li></ul></li><li><a title="244 Natural Sciences textbooks" data-unhide-mouseover="nav_textbook_subject_8" href="/opentextbooks/subjects/natural-sciences">Natural Sciences</a><a class="galaxy" aria-label="Expand Natural Sciences" data-toggle="nav_textbook_subject_8" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_8" hidden="hidden"><li><a title="87 Biology textbooks" href="/opentextbooks/subjects/biology">Biology</a></li><li><a title="30 Chemistry textbooks" href="/opentextbooks/subjects/chemistry">Chemistry</a></li><li><a title="53 Earth Sciences textbooks" href="/opentextbooks/subjects/geology">Earth Sciences</a></li><li><a title="46 Physics textbooks" href="/opentextbooks/subjects/physics">Physics</a></li></ul></li><li><a title="266 Social Sciences textbooks" data-unhide-mouseover="nav_textbook_subject_9" href="/opentextbooks/subjects/social-sciences">Social Sciences</a><a class="galaxy" aria-label="Expand Social Sciences" data-toggle="nav_textbook_subject_9" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_9" hidden="hidden"><li><a title="9 Anthropology textbooks" href="/opentextbooks/subjects/anthropology">Anthropology</a></li><li><a title="26 Cultural & Ethnic Studies textbooks" href="/opentextbooks/subjects/cultural-ethnic-studies">Cultural & Ethnic Studies</a></li><li><a title="39 Economics textbooks" href="/opentextbooks/subjects/economics">Economics</a></li><li><a title="15 Gender & Sexuality Studies textbooks" href="/opentextbooks/subjects/gender-sexuality-studies">Gender & Sexuality Studies</a></li><li><a title="20 Geography textbooks" href="/opentextbooks/subjects/geography">Geography</a></li><li><a title="24 Library Science and Museum Studies textbooks" href="/opentextbooks/subjects/library-science-and-museum-studies">Library Science and Museum Studies</a></li><li><a title="40 Political Science textbooks" href="/opentextbooks/subjects/political-science">Political Science</a></li><li><a title="49 Psychology textbooks" href="/opentextbooks/subjects/psychology">Psychology</a></li><li><a title="30 Sociology textbooks" href="/opentextbooks/subjects/sociology">Sociology</a></li></ul></li><li><a title="62 Student Success textbooks" href="/opentextbooks/subjects/student-success">Student Success</a></li></ul> </li> <li> <a href="/opentextbooks/books">About Open Textbooks</a> <ul> <li><a href="/opentextbooks/faq">FAQ</a></li> <li><a href="/opentextbooks/friends">Friends</a></li> </ul> </li> <li> <a href="/opentextbooks/textbooks/submit">Submit</a> <!-- / %ul --> <!-- / %li= link_to t('library.nav.menu.submit_book'), library_submit_path --> <!-- / %li= link_to t('library.nav.menu.submit_ancillary'), new_library_textbook_ancillary_path --> </li> <li><a href="/opentextbooks/discovery">Discovery</a></li> <li><a data-turbo="false" href="/oen">Open Education Network</a></li> </ul> </nav> </div> <br class='clearfloat'> <main id='main'> <div id='static-copy'> <h1>Open Textbook Criteria</h1> <p>Textbooks in the Open Textbook Library are considered open because they are free to use and distribute, and are licensed to be freely adapted or changed with proper attribution.</p> <p>The criteria for including new textbooks in the Open Textbook Library are:</p> <ol> <li>All content must be openly licensed. We accept textbooks licensed with GNU and Creative Commons (CC) licenses, with the exception of the CC ND (No Derivatives) component. <a data-turbo="false" href="https://open.umn.edu/blog/open-textbook-community-advocates-cc-by-license-for-open-textbooks">CC BY is recommended</a>. Go to <a href="https://creativecommons.org/share-your-work/licensing-examples/">Creative Commons</a> for more information about selecting a license for your work.</li> <li>Must be a complete textbook available as a complete portable file (e.g. PDF, EPUB).</li> <li>Must be in use at multiple higher education institutions, or affiliated with a higher education institution, scholarly society, or professional organization.</li> <li>Must be an original textbook (not a derivative of another textbook). Possible exceptions to this criteria are modifications that reflect the needs or context of an entirely new audience. For example, the textbook has been changed in such a significant way that it is now relevant to a new country, profession, or has been translated into a new language. Authors or publishers will be asked to demonstrate significant changes to the original text.</li> </ol> <h2>More about Open Licenses</h2> <p>Many in the open education community, including the Open Education Network, believe that the most appropriate license for open textbooks is the Creative Commons Attribution International (CC BY) license. The CC BY license means anyone can retain, reuse, revise, remix and redistribute open textbooks. This is commonly referred to as the 5Rs.</p> <p>As part of our commitment to the 5Rs, a textbook with a No Derivatives component to the license (CC BY SA ND or CC BY ND) is not considered an open textbook. This is because ND licenses do not allow for revising and remixing. Although you may find some textbooks in our library with ND licenses, as of November, 2016 we are no longer accepting textbooks with that license.</p> <h3>For further reading about defining open:</h3> <ul> <li><a href="http://opencontent.org/definition">Open Content by David Wiley</a></li> <li><a href="http://opendefinition.org">Open Knowledge Foundation</a></li> </ul> <h2>Submit an Open Textbook</h2> <p>Is there an open textbook you'd like to see included in the Open Textbook Library? Please ensure it meets our criteria above, and then use our form to <a href="/opentextbooks/textbooks/submit">submit it for consideration</a>.</p> </div> </main> <br class='clearfloat'> </div> </div> </body> <footer class='center mt-auto'> <div class='container'> <div class='content px-5 py-3'> <div class='row'> <div class='socials left col-sm'> <p class='header'>Stay Updated</p> <a href="https://mastodon.social/@OpenEd_Network"><i class="fab fa-mastodon " alt="Open Education Network on Mastodon"></i> <p class='sr-only'>Twitter</p> </a><a href="https://www.linkedin.com/company/open-education-network"><i class="fab fa-linkedin " alt="Open Education Network on LinkedIn"></i> <p class='sr-only'>LinkedIn</p> </a><a href="https://www.youtube.com/channel/UC_lf4_Wss_uW0KGny_A3erg"><i class="fab fa-youtube " alt="Open Education Network on YouTube"></i> <p class='sr-only'>YouTube</p> </a></div> <div class='newsletter right col-sm'> <p class='header'>Join Our Newsletter</p> <div class='row'> <div class='col right offset-md-2' id='newsletter'> <form action='https://cl.exct.net/DEManager.aspx' method='post' name='subscribeForm'> <input name='_clientID' type='hidden' value='6329914'> <input name='_deExternalKey' type='hidden' value='BF8CCDC6-9A32-460A-B2A6-F74B89BA62BF'> <input name='_action' type='hidden' value='add'> <input name='_returnXML' type='hidden' value='0'> <input name='_successURL' type='hidden' value='https://open.umn.edu/opentextbooks/news?success=true'> <input name='_errorURL' type='hidden' value='https://open.umn.edu/opentextbooks/news?success=false'> <div class='input-group'> <input aria-label='Email Newsletter Signup' autocomplete='email' class='form-control email' id='newsletter_signup_email' name='Email Address' placeholder='email address' required title='Email Newsletter Signup' type='email'> <input class='btn primary' id='signup-button' type='submit' value='Subscribe'> </div> </form> </div> </div> </div> </div> <br class='clearfix'> <div class='row'> <div class='col center'> <p> CENTER FOR OPEN EDUCATION | The Open Education Network is based in the Center for Open Education in the University of Minnesota鈥檚 College of Education and Human Development. <br> University of Minnesota, 330 Wulling Hall, 86 Pleasant Street S.E., Minneapolis, MN 55455 </p> <p> <a href="http://creativecommons.org/licenses/by/4.0/"><img width="92" height="35" alt="Attribution License" class="license-img" src="/assets/library/licenses/Attribution-cc57bff26f2eb73610d0ffcd514b9aab049fe95712d702c23ba4d69f140bd07d.webp" /></a> Except where otherwise noted, content on this site is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a> </p> </div> </div> </div> </div> </footer> </html>