{
  "title": "OpenDSA Data Structures and Algorithms Modules Collection",
  "desc": "OpenDSA Data Structures and Algorithms Modules Collection",
  "build_dir": "Books",
  "code_dir": "SourceCode/",
  "code_lang": {
    "Java": {
      "ext": [
        "java"
      ],
      "label": "Java",
      "lang": "java"
    },
    "Java_Generic": {
      "ext": [
        "java"
      ],
      "label": "Java (Generic)",
      "lang": "java"
    },
    "C++": {
      "ext": [
        "cpp",
        "h"
      ],
      "label": "C++",
      "lang": "C++"
    }
  },
  "lang": "en",
  "build_JSAV": false,
  "suppress_todo": false,
  "dispModComp": true,
  "glob_exer_options": {
    "JXOP-debug": "true"
  },
  "chapters": {
    "Preface": {
      "Intro": {
        "long_name": "How to Use this System",
        "sections": {}
      },
      "Status": {
        "long_name": "OpenDSA Project Content Status",
        "sections": {
          "Status Report": {}
        }
      }
    },
    "Introduction for Data Structures and Algorithms Courses": {
      "Background/IntroDSA": {
        "long_name": "Data Structures and Algorithms",
        "sections": {
          "Data Structures and Algorithms": {
            "IntroSumm": {
              "long_name": "Introduction Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Background/IntroSumm.html",
              "mod_name": "IntroDSA",
              "threshold": 5
            }
          },
          "Some Software Engineering Topics": {
            "showsection": true
          }
        }
      }
    },
    "Biographies": {
      "Biography/CarlGauss": {
        "long_name": "Spotlight: Carl Friedrich Gauss",
        "sections": {
          "Spotlight: Carl Friedrich Gauss": {}
        }
      },
      "Biography/FrancisBacon": {
        "long_name": "Spotlight: Francis Bacon",
        "sections": {
          "Spotlight: Francis Bacon": {}
        }
      }
    },
    "Programming Tutorials": {
      "Tutorials/cmdline": {
        "long_name": "Command Line Basics",
        "sections": {
          "What's A CLI?": {}
        }
      },
      "Tutorials/parameters": {
        "long_name": "Parsing Command Line Parameters In Your Progam",
        "sections": {
          "Parameters In Programming": {}
        }
      },
      "Tutorials/eclipseparameters": {
        "long_name": "Using Parameters in Eclipse",
        "sections": {
          "Using Parameters in Eclipse": {}
        }
      },
      "Tutorials/webcattools": {
        "long_name": "Installing the Web-CAT Submission Plug-in for Eclipse",
        "sections": {
          "Introduction": {},
          "Installing the Plug-in": {},
          "Installing student.jar": {},
          "Installing formatting support": {}
        }
      },
      "Tutorials/debugmethods": {
        "long_name": "Common Debugging Methods",
        "sections": {
          "Common Debugging Methods": {}
        }
      },
      "Tutorials/debug": {
        "long_name": "Debugging In Eclipse",
        "sections": {
          "Debugging In Eclipse": {}
        }
      },
      "Tutorials/scanning": {
        "long_name": "Reading Input (from Files or Otherwise)",
        "sections": {
          "The Scanner Class": {}
        }
      },
      "Tutorials/randomaccessfile": {
        "long_name": "Random Access Files In Java",
        "sections": {
          "Understanding File I/O": {}
        }
      },
      "Tutorials/junitstart": {
        "long_name": "JUnit Testing And You",
        "sections": {
          "Getting Started": {}
        }
      },
      "Tutorials/junitbasic": {
        "long_name": "Writing JUnit Tests",
        "sections": {
          "Writing JUnit Tests": {}
        }
      },
      "Tutorials/junitcoverage": {
        "long_name": "Code Coverage In JUnit",
        "sections": {
          "Code Coverage In JUnit": {}
        }
      },
      "Testing/TestIntro": {
        "long_name": "Testing",
        "sections": {
          "Testing vs. Debugging": {
            "TriangleApplet": {
              "long_name": "Triangle Testing No Code",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Testing/Triangle/TriangleApplet.html",
              "mod_name": "TestIntro",
              "threshold": 0.9
            }
          }
        }
      },
      "Testing/TestCoverage": {
        "long_name": "Testing for Code Coverage",
        "sections": {
          "Testing for Code Coverage": {
            "TriangleApplet": {
              "long_name": "Triangle Testing With Code",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Testing/Triangle/TriangleApplet.html",
              "mod_name": "TestCoverage",
              "threshold": 0.9,
              "exer_options": {
                "code": "true"
              }
            }
          }
        }
      },
      "Testing/Example2": {
        "long_name": "Another Example",
        "sections": {
          "Another Example": {
            "BowlingApplet": {
              "long_name": "Bowling Testing Without Code",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Testing/Bowling/BowlingApplet.html",
              "mod_name": "Example2",
              "threshold": 0.9
            }
          }
        }
      },
      "Testing/Bowling": {
        "long_name": "Bowling Example",
        "sections": {
          "Bowling Example": {
            "BowlingApplet": {
              "long_name": "Bowling Testing With Code",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Testing/Bowling/BowlingApplet.html",
              "mod_name": "Bowling",
              "threshold": 0.9,
              "exer_options": {
                "code": "true"
              }
            }
          }
        }
      }
    },
    "Design I": {
      "Design/ADT": {
        "long_name": "Abstract Data Types",
        "sections": {
          "Abstract Data Types": {
            "ADTCON": {
              "type": "dgm",
              "mod_name": "ADT"
            },
            "CMdatatypeSumm": {
              "long_name": "Concept map data types exercises",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/CMP/CMdatatypeSumm.html",
              "mod_name": "ADT",
              "threshold": 5
            },
            "IntroADTSumm": {
              "long_name": "ADT Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Design/IntroADTSumm.html",
              "mod_name": "ADT",
              "threshold": 4
            }
          }
        }
      },
      "Design/IntroOO": {
        "long_name": "Introduction to Object Oriented Programming",
        "sections": {
          "Introduction to Object Oriented Programming": {
            "CMoopSumm": {
              "long_name": "Concept map OOP exercises",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/CMP/CMoopSumm.html",
              "mod_name": "IntroOO",
              "threshold": 5
            }
          }
        }
      },
      "Design/IntroUML": {
        "long_name": "The Unified Modeling Language",
        "sections": {
          "The Unified Modeling Language": {}
        }
      },
      "Design/IntroProcess": {
        "long_name": "Software Development Processes",
        "sections": {
          "Software Development Processes": {}
        }
      }
    },
    "Introduction to Pointers in Java": {
      "PointersJava/PointerIntro": {
        "long_name": "Pointers Chapter Introduction",
        "sections": {}
      },
      "PointersJava/BasicPointers1": {
        "long_name": "Basic References Part 1",
        "sections": {
          "Pointers and References": {},
          "Data Types in Java": {
            "primativeVsRefCON": {
              "long_name": "primativeVsRefCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/primativeVsRefCON.css"
              ],
              "scripts": [
                "AV/Pointers/primativeVsRefCON.js"
              ],
              "mod_name": "BasicPointers1"
            }
          },
          "Referencing and Dereferencing": {
            "empRefnullCON": {
              "type": "dgm",
              "mod_name": "BasicPointers1"
            }
          },
          "changePointeeDataDirect": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeDataDirect",
            "points": 2.0,
            "workout_id": "419",
            "type": "extr",
            "mod_name": "BasicPointers1"
          },
          "The Employee Class": {},
          "Reference Assignments": {
            "empRefsecondCON": {
              "type": "dgm",
              "mod_name": "BasicPointers1"
            }
          },
          "circularList1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "circularList1",
            "points": 2.0,
            "workout_id": "421",
            "type": "extr",
            "mod_name": "BasicPointers1"
          }
        }
      },
      "PointersJava/BasicPointers2": {
        "long_name": "Basic References Part 2",
        "sections": {
          "Sharing": {
            "PointerEX1PRO": {
              "long_name": "PointerEX1PRO",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Pointers/PointerEX1PRO.html",
              "mod_name": "BasicPointers2",
              "threshold": 1
            }
          },
          "Shallow and Deep Copying": {
            "shallowdeepCON": {
              "type": "dgm",
              "mod_name": "BasicPointers2"
            },
            "shallowdeepExampleCON": {
              "long_name": "Shallow Deep Copy Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/shallowdeepExampleCON.css"
              ],
              "scripts": [
                "AV/Pointers/shallowdeepExampleCON.js"
              ],
              "mod_name": "BasicPointers2"
            },
            "PointerEX2PRO": {
              "long_name": "PointerEX2PRO",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Pointers/PointerEX2PRO.html",
              "mod_name": "BasicPointers2",
              "threshold": 1
            }
          },
          "Shallow and Deep Comparing": {},
          "Bad References": {
            "empRefnullCON": {
              "type": "dgm",
              "mod_name": "BasicPointers2"
            },
            "badPointerPowCON": {
              "long_name": "badPointerPowCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/badPointerPowCON.css"
              ],
              "scripts": [
                "AV/Pointers/badPointerPowCON.js"
              ],
              "mod_name": "BasicPointers2"
            }
          }
        }
      },
      "PointersJava/Syntax": {
        "long_name": "Pointers Syntax",
        "sections": {
          "Syntax": {
            "employeePtr2CON": {
              "long_name": "employeePtr2CON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/employeePtr2CON.css"
              ],
              "scripts": [
                "AV/Pointers/employeePtr2CON.js"
              ],
              "mod_name": "Syntax"
            },
            "examplePointerCodeCON": {
              "long_name": "examplePointerCodeCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/examplePointerCodeCON.css"
              ],
              "scripts": [
                "AV/Pointers/examplePointerCodeCON.js"
              ],
              "mod_name": "Syntax"
            }
          },
          "changeHeadPointer1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeHeadPointer1",
            "points": 2.0,
            "workout_id": "415",
            "type": "extr",
            "mod_name": "Syntax"
          },
          "Java References vs Pointers": {},
          "How Are References Implemented In The Machine?": {
            "memoryModelCON": {
              "type": "dgm",
              "mod_name": "Syntax"
            }
          }
        }
      },
      "PointersJava/LocalMem": {
        "long_name": "Local Memory",
        "sections": {
          "Local Memory": {
            "simpleLifetimeCON": {
              "long_name": "simpleLifetimeCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/simpleLifetimeCON.css"
              ],
              "scripts": [
                "AV/Pointers/simpleLifetimeCON.js"
              ],
              "mod_name": "LocalMem"
            },
            "T1-T5CON": {
              "long_name": "T1-T5CON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/T1-T5CON.css"
              ],
              "scripts": [
                "AV/Pointers/T1-T5CON.js"
              ],
              "mod_name": "LocalMem"
            }
          }
        }
      },
      "PointersJava/HeapMem": {
        "long_name": "Heap Memory",
        "sections": {
          "Heap Memory": {
            "garbageDisposalCON": {
              "long_name": "garbageDisposalCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/garbageDisposalCON.css"
              ],
              "scripts": [
                "AV/Pointers/garbageDisposalCON.js"
              ],
              "mod_name": "HeapMem"
            },
            "LocalHeapaloc": {
              "type": "dgm",
              "mod_name": "HeapMem"
            },
            "LocalHeapdealoc": {
              "type": "dgm",
              "mod_name": "HeapMem"
            },
            "LocalHeapintptr42": {
              "long_name": "LocalHeapintptr42",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/LocalHeapintptr42.css"
              ],
              "scripts": [
                "AV/Pointers/LocalHeapintptr42.js"
              ],
              "mod_name": "HeapMem"
            }
          }
        }
      },
      "PointersJava/Links1": {
        "long_name": "Link Nodes",
        "sections": {
          "Link Nodes": {
            "linkNodes1CON": {
              "long_name": "linkNodes1CON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/linkNodes1CON.css"
              ],
              "scripts": [
                "AV/Pointers/linkNodes1CON.js"
              ],
              "mod_name": "Links1"
            },
            "linkNodes2CON": {
              "long_name": "linkNodes2CON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Pointers/linkNodes2CON.css"
              ],
              "scripts": [
                "AV/Pointers/linkNodes2CON.js"
              ],
              "mod_name": "Links1"
            },
            "PointerEX3PRO": {
              "long_name": "PointerEX3PRO",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Pointers/PointerEX3PRO.html",
              "mod_name": "Links1",
              "threshold": 1
            }
          }
        }
      },
      "PointersJava/Links2": {
        "long_name": "Link Nodes Practice Exercises",
        "sections": {
          "createList": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "createList",
            "points": 2.0,
            "type": "extr",
            "mod_name": "Links2"
          },
          "iterateOverList": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "iterateOverList",
            "points": 2.0,
            "type": "extr",
            "mod_name": "Links2"
          },
          "changePointeeNext1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeNext1",
            "points": 2.0,
            "type": "extr",
            "mod_name": "Links2"
          },
          "addNodeAtHead": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "addNodeAtHead",
            "points": 2.0,
            "workout_id": "429",
            "type": "extr",
            "mod_name": "Links2"
          }
        }
      },
      "PointersJava/Exercises": {
        "long_name": "Additional Practice Exercises",
        "sections": {
          "changeHeadPointer2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeHeadPointer2",
            "points": 2.0,
            "workout_id": "416",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "changeQPointer": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeQPointer",
            "points": 2.0,
            "workout_id": "417",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "changeRPointer": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeRPointer",
            "points": 2.0,
            "workout_id": "418",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "changePointeeDataInDirect": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeDataInDirect",
            "points": 2.0,
            "workout_id": "420",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "circularList2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "circularList2",
            "points": 2.0,
            "workout_id": "422",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "circularList3": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "circularList3",
            "points": 2.0,
            "workout_id": "423",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "changePointeeNext2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeNext2",
            "points": 2.0,
            "workout_id": "425",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "findValueInList": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "findValueInList",
            "points": 2.0,
            "workout_id": "427",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "addNodeAtTail": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "addNodeAtTail",
            "points": 2.0,
            "workout_id": "430",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "changeNodesOrder1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeNodesOrder1",
            "points": 2.0,
            "workout_id": "431",
            "type": "extr",
            "mod_name": "Exercises"
          },
          "changeNodesOrder2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeNodesOrder2",
            "points": 2.0,
            "workout_id": "432",
            "type": "extr",
            "mod_name": "Exercises"
          }
        }
      }
    },
    "Mathematical Background": {
      "Background/MathpreIntro": {
        "long_name": "Chapter Introduction",
        "sections": {}
      },
      "Background/SetDef": {
        "long_name": "Sets and Relations",
        "sections": {
          "Set Notation": {
            "SetTFrelation": {
              "long_name": "Relations Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Background/SetTFrelation.html",
              "mod_name": "SetDef",
              "threshold": 5
            }
          },
          "Equivalence Relations": {
            "SetTFequivrel": {
              "long_name": "Equivalence Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Background/SetTFequivrel.html",
              "mod_name": "SetDef",
              "threshold": 3
            }
          },
          "Partial Orders": {
            "SetTFpartialorder": {
              "long_name": "PartialOrder Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Background/SetTFpartialorder.html",
              "mod_name": "SetDef",
              "threshold": 3
            }
          }
        }
      },
      "Background/MiscMath": {
        "long_name": "Miscellaneous Notation",
        "sections": {}
      },
      "Background/Logarithms": {
        "long_name": "Logarithms",
        "sections": {
          "Logarithms": {
            "MathLogSumm": {
              "long_name": "Logarithms Practice Questions",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Background/MathLogSumm.html",
              "mod_name": "Logarithms",
              "threshold": 10
            }
          }
        }
      },
      "Background/Summations": {
        "long_name": "Summations",
        "sections": {
          "Summations": {
            "SummationOneToNCON": {
              "long_name": "Summation of the first N Integers visualization",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Background/SummationOneToNCON.css"
              ],
              "scripts": [
                "AV/Background/SummationOneToNCON.js"
              ],
              "mod_name": "Summations"
            },
            "SummationTwoPowerICON": {
              "long_name": "Summation Two Power I visualization",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Background/SummationTwoPowerICON.css"
              ],
              "scripts": [
                "AV/Background/SummationTwoPowerICON.js"
              ],
              "mod_name": "Summations"
            }
          }
        }
      },
      "Background/RecurrenceIntro": {
        "long_name": "Recurrence Relations",
        "sections": {
          "Recurrence Relations": {
            "LinearRecurrencesCON": {
              "long_name": "Linear Recurrences Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Background/LinearRecurrencesCON.css"
              ],
              "scripts": [
                "AV/Background/LinearRecurrencesCON.js"
              ],
              "mod_name": "RecurrenceIntro"
            },
            "LinearRecurrencesNCON": {
              "long_name": "Linear Recurrences Slideshow (n)",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Background/LinearRecurrencesNCON.css"
              ],
              "scripts": [
                "AV/Background/LinearRecurrencesNCON.js"
              ],
              "mod_name": "RecurrenceIntro"
            }
          }
        }
      },
      "Background/Proofs": {
        "long_name": "Mathematical Proof Techniques",
        "sections": {
          "Mathematical Proof Techniques": {
            "twoColorCON": {
              "type": "dgm",
              "mod_name": "Proofs"
            },
            "TwoColoringProofCON": {
              "long_name": "Two Coloring Proof Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Background/TwoColoringProofCON.css"
              ],
              "scripts": [
                "AV/Background/TwoColoringProofCON.js"
              ],
              "mod_name": "Proofs"
            }
          }
        }
      },
      "Background/Estimation": {
        "long_name": "Estimation",
        "sections": {}
      },
      "Background/MathpreSumm": {
        "long_name": "Chapter Summary Questions",
        "sections": {
          "Chapter Summary Questions": {
            "MathBgSumm": {
              "long_name": "Math Background Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Background/MathBgSumm.html",
              "mod_name": "MathpreSumm",
              "threshold": 5
            }
          }
        }
      }
    },
    "Searching I": {
      "Searching/BinarySearch": {
        "long_name": "Searching in an Array",
        "sections": {
          "Searching in an Array": {
            "binarySearchCON": {
              "long_name": "Binary Search Algorithm Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Searching/binarySearchCON.css"
              ],
              "scripts": [
                "AV/Searching/binarySearchCON.js"
              ],
              "mod_name": "BinarySearch"
            },
            "binarySearchPRO": {
              "long_name": "Binary Search Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Searching/binarySearchPRO.html",
              "mod_name": "BinarySearch",
              "threshold": 1.0
            }
          }
        }
      }
    },
    "Algorithm Analysis": {
      "AlgAnal/AnalChap": {
        "long_name": "Chapter Introduction",
        "sections": {}
      },
      "AlgAnal/AnalPrelim": {
        "long_name": "Problems, Algorithms, and Programs",
        "sections": {
          "Problems, Algorithms, and Programs": {
            "ProblemAlgorithmCON": {
              "long_name": "Problem, Algorithm, and Program definitions Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/ProblemAlgorithmCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/ProblemAlgorithmCON.js"
              ],
              "mod_name": "AnalPrelim"
            },
            "AnalPrelimSumm": {
              "long_name": "Problems, Algorithms, Programs Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/AnalPrelimSumm.html",
              "mod_name": "AnalPrelim",
              "threshold": 4
            }
          }
        }
      },
      "AlgAnal/AnalIntro": {
        "long_name": "Comparing Algorithms",
        "sections": {
          "Comparing Algorithms": {
            "GrowthRatesCON": {
              "type": "dgm",
              "mod_name": "AnalIntro"
            },
            "GrowthRatesZoomCON": {
              "type": "dgm",
              "mod_name": "AnalIntro"
            },
            "CompareGrowth": {
              "long_name": "Comparing Growth Rates Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/CompareGrowth.html",
              "mod_name": "AnalIntro",
              "threshold": 3
            }
          },
          "Growth Rates Ordering Exercise": {
            "GrowthRatesPRO": {
              "long_name": "Growth Rates Ordering Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/GrowthRatesPRO.html",
              "mod_name": "AnalIntro",
              "threshold": 3
            }
          }
        }
      },
      "AlgAnal/AnalCases": {
        "long_name": "Best, Worst, and Average Cases",
        "sections": {
          "Best, Worst, and Average Cases": {
            "AnalCasesSameCON": {
              "long_name": "Simple analysis cases slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/AnalCasesCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/AnalCasesSameCON.js"
              ],
              "mod_name": "AnalCases"
            },
            "AnalCasesDiffCON": {
              "long_name": "Best, Worst, and Average cases slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/AnalCasesCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/AnalCasesDiffCON.js"
              ],
              "mod_name": "AnalCases"
            }
          }
        }
      },
      "AlgAnal/AnalCompvsAlg": {
        "long_name": "Faster Computer, or Faster Algorithm?",
        "sections": {
          "Faster Computer, or Faster Algorithm?": {
            "FasterCorASumm": {
              "long_name": "Faster Computer or Faster Algorithm Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/FasterCorASumm.html",
              "mod_name": "AnalCompvsAlg",
              "threshold": 2
            }
          }
        }
      },
      "AlgAnal/AnalAsymptotic": {
        "long_name": "Asymptotic Analysis and Upper Bounds",
        "sections": {
          "Asymptotic Analysis and Upper Bounds": {
            "GrowthRatesCON": {
              "type": "dgm",
              "mod_name": "AnalAsymptotic"
            },
            "GrowthRatesZoomCON": {
              "type": "dgm",
              "mod_name": "AnalAsymptotic"
            },
            "UpperBoundCON": {
              "long_name": "Upper Bounds visualization",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/UpperBoundCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/UpperBoundCON.js"
              ],
              "mod_name": "AnalAsymptotic"
            },
            "SimpleCostsCON": {
              "type": "dgm",
              "mod_name": "AnalAsymptotic"
            },
            "UpperBoundsSumm": {
              "long_name": "Asymptotic Analysis and Upper Bounds Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/UpperBoundsSumm.html",
              "mod_name": "AnalAsymptotic",
              "threshold": 4
            }
          }
        }
      },
      "AlgAnal/AnalLower": {
        "long_name": "Lower Bounds and Theta Notation",
        "sections": {
          "Lower Bounds and Theta Notation": {
            "LowerBoundCON": {
              "long_name": "Lower Bounds visualization",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/LowerBoundCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/LowerBoundCON.js"
              ],
              "mod_name": "AnalLower"
            },
            "LowerThetaSumm": {
              "long_name": "Lower Bounds and Theta Notation Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/LowerThetaSumm.html",
              "mod_name": "AnalLower",
              "threshold": 5
            }
          }
        }
      },
      "AlgAnal/AnalProgram": {
        "long_name": "Calculating Program Running Time",
        "sections": {
          "Calculating Program Running Time": {
            "binarySearchCON": {
              "long_name": "Binary Search Algorithm Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Searching/binarySearchCON.css"
              ],
              "scripts": [
                "AV/Searching/binarySearchCON.js"
              ],
              "mod_name": "AnalProgram"
            },
            "binarySearchPRO": {
              "long_name": "Binary Search Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Searching/binarySearchPRO.html",
              "mod_name": "AnalProgram",
              "threshold": 1.0,
              "exer_options": {
                "JXOP-code": "none"
              }
            },
            "BsearchDandCRecurCON": {
              "long_name": "Binary Search recurrence slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/BsearchDandCRecurCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/BsearchDandCRecurCON.js"
              ],
              "mod_name": "AnalProgram"
            }
          },
          "Summary Exercise": {
            "AnalProgramSumm": {
              "long_name": "Program Code Analysis Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/AnalProgramSumm.html",
              "mod_name": "AnalProgram",
              "threshold": 5
            }
          }
        }
      },
      "AlgAnal/AnalProblem": {
        "long_name": "Analyzing Problems",
        "sections": {
          "Analyzing Problems": {
            "AnalProblemSumm": {
              "long_name": "Problem Analysis Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/AnalProblemSumm.html",
              "mod_name": "AnalProblem",
              "threshold": 5
            }
          }
        }
      },
      "AlgAnal/AnalMisunderstanding": {
        "long_name": "Common Misunderstandings",
        "sections": {
          "Common Misunderstandings": {
            "MisunderstandingsGraphCON": {
              "long_name": "Example's graph Visualization",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/AlgAnal/MisunderstandingsGraphCON.css"
              ],
              "scripts": [
                "AV/AlgAnal/MisunderstandingsGraphCON.js"
              ],
              "mod_name": "AnalMisunderstanding"
            },
            "MisSumm": {
              "long_name": "Common Misconceptions Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/MisSumm.html",
              "mod_name": "AnalMisunderstanding",
              "threshold": 4
            }
          }
        }
      },
      "AlgAnal/AnalMultiple": {
        "long_name": "Multiple Parameters",
        "sections": {}
      },
      "AlgAnal/AnalSpace": {
        "long_name": "Space Bounds",
        "sections": {}
      },
      "AlgAnal/AnalTuning": {
        "long_name": "Code Tuning and Empirical Analysis",
        "sections": {
          "Code Tuning and Empirical Analysis": {}
        }
      },
      "AlgAnal/AlgAnalSummCS2": {
        "long_name": "Algorithm Analysis Summary Exercises",
        "sections": {
          "Summary Exercise: CS2": {
            "AlgAnalCS2Summ": {
              "long_name": "Algorithm Analysis Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/AlgAnalCS2Summ.html",
              "mod_name": "AlgAnalSummCS2",
              "threshold": 5
            }
          }
        }
      },
      "AlgAnal/AlgAnalSummCS3": {
        "long_name": "Algorithm Analysis Summary Exercises",
        "sections": {
          "Summary Exercise: CS3": {
            "AlgAnalCS3Summ": {
              "long_name": "Algorithm Analysis Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/AlgAnal/AlgAnalCS3Summ.html",
              "mod_name": "AlgAnalSummCS3",
              "threshold": 5
            }
          }
        }
      }
    },
    "Linear Structures": {
      "List/ListIntro": {
        "long_name": "Chapter Introduction: Lists",
        "sections": {}
      },
      "List/ListADT": {
        "long_name": "The List ADT",
        "sections": {
          "The List ADT": {
            "listADTposCON": {
              "long_name": "List ADT Positions Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/listADTCON.css"
              ],
              "scripts": [
                "AV/List/listADTposCON.js"
              ],
              "mod_name": "ListADT"
            }
          },
          "List ADT Programming Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "List ADT Programming Exercise",
            "points": 1.0,
            "type": "extr",
            "mod_name": "ListADT"
          }
        }
      },
      "List/ListArray": {
        "long_name": "Array-Based List Implementation",
        "sections": {
          "Array-Based List Implementation": {
            "alistVarsCON": {
              "long_name": "Array-based List Variables Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/alistCON.css"
              ],
              "scripts": [
                "AV/List/alistVarsCON.js"
              ],
              "mod_name": "ListArray"
            },
            "alistIntroCON": {
              "long_name": "Array-based List Intro Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/alistCON.css"
              ],
              "scripts": [
                "AV/List/alistIntroCON.js"
              ],
              "mod_name": "ListArray"
            },
            "alistInsertCON": {
              "long_name": "Array-based List Insertion Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/alistCON.css"
              ],
              "scripts": [
                "AV/List/alistInsertCON.js"
              ],
              "mod_name": "ListArray"
            },
            "AlistInsertPRO": {
              "long_name": "Array-based List Insert Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/AlistInsertPRO.html",
              "mod_name": "ListArray",
              "threshold": 3
            }
          },
          "Append and Remove": {
            "alistAppendCON": {
              "long_name": "Array-based List Append Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/alistCON.css"
              ],
              "scripts": [
                "AV/List/alistAppendCON.js"
              ],
              "mod_name": "ListArray"
            },
            "alistRemoveCON": {
              "long_name": "Array-based List Remove",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/alistCON.css"
              ],
              "scripts": [
                "AV/List/alistRemoveCON.js"
              ],
              "mod_name": "ListArray"
            },
            "AlistRemovePRO": {
              "long_name": "Array-based List Remove Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/AlistRemovePRO.html",
              "mod_name": "ListArray",
              "threshold": 4
            }
          },
          "Array-based List Practice Questions": {
            "ALSumm": {
              "long_name": "Array-based List Summary",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/ALSumm.html",
              "mod_name": "ListArray",
              "threshold": 3
            }
          }
        }
      },
      "List/ListLinked": {
        "long_name": "Linked Lists",
        "sections": {
          "Linked Lists": {
            "llistRepCON": {
              "type": "dgm",
              "mod_name": "ListLinked"
            },
            "llistBadCON": {
              "long_name": "Linked List Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistBadCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "llistBadDelCON": {
              "long_name": "Linked List Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistBadDelCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "llistInitCON": {
              "type": "dgm",
              "mod_name": "ListLinked"
            },
            "llistHeaderCON": {
              "type": "dgm",
              "mod_name": "ListLinked"
            },
            "llistVarsCON": {
              "long_name": "Linked List Variables Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistVarsCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "llistConsCON": {
              "long_name": "Linked List Constructors Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistConsCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "llistInsertCON": {
              "long_name": "Linked List Insert Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistInsertCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "llistSpecialCON": {
              "long_name": "Linked List Special Insert Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistSpecialCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "LlistInsertPRO": {
              "long_name": "Linked List Insert Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/LlistInsertPRO.html",
              "mod_name": "ListLinked",
              "threshold": 5
            }
          },
          "Linked List Remove": {
            "llistRemoveCON": {
              "long_name": "Linked List Remove Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistRemoveCON.js"
              ],
              "mod_name": "ListLinked"
            },
            "LlistRemovePRO": {
              "long_name": "Linked List Remove Exercise",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/List/LlistRemovePRO.html",
              "mod_name": "ListLinked",
              "threshold": 5
            },
            "llistOtherCON": {
              "long_name": "Linked List Position Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/llistCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/llistOtherCON.js"
              ],
              "mod_name": "ListLinked"
            }
          }
        }
      },
      "List/ListAnalysis": {
        "long_name": "Comparison of List Implementations",
        "sections": {
          "Space Comparison": {
            "ListOverhead": {
              "long_name": "Breakeven Point Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/ListOverhead.html",
              "mod_name": "ListAnalysis",
              "threshold": 3
            }
          },
          "Time Comparison": {
            "LLSumm": {
              "long_name": "Linked List Summary Exercise",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/List/LLSumm.html",
              "mod_name": "ListAnalysis",
              "threshold": 6
            }
          }
        }
      },
      "List/ListDouble": {
        "long_name": "Doubly Linked Lists",
        "sections": {
          "Doubly Linked Lists": {
            "dlistDiagramCON": {
              "type": "dgm",
              "mod_name": "ListDouble"
            },
            "dlistInsertCON": {
              "long_name": "Doubly Linked List Insert",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/DoubleLinkList.css",
                "AV/List/dlistCON.css"
              ],
              "scripts": [
                "DataStructures/DoubleLinkList.js",
                "AV/List/dlist.js",
                "AV/List/dlistInsertCON.js"
              ],
              "mod_name": "ListDouble"
            },
            "dlistAppendCON": {
              "long_name": "Doubly Linked List Append",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/DoubleLinkList.css",
                "AV/List/dlistCON.css"
              ],
              "scripts": [
                "DataStructures/DoubleLinkList.js",
                "AV/List/dlist.js",
                "AV/List/dlistAppendCON.js"
              ],
              "mod_name": "ListDouble"
            },
            "dlistRemoveCON": {
              "long_name": "Doubly Linked List Remove",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/DoubleLinkList.css",
                "AV/List/dlistCON.css"
              ],
              "scripts": [
                "DataStructures/DoubleLinkList.js",
                "AV/List/dlist.js",
                "AV/List/dlistRemoveCON.js"
              ],
              "mod_name": "ListDouble"
            },
            "dlistPrevCON": {
              "long_name": "Doubly Linked List Prev",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/DoubleLinkList.css",
                "AV/List/dlistCON.css"
              ],
              "scripts": [
                "DataStructures/DoubleLinkList.js",
                "AV/List/dlist.js",
                "AV/List/dlistPrevCON.js"
              ],
              "mod_name": "ListDouble"
            }
          }
        }
      },
      "List/ListElement": {
        "long_name": "List Element Implementations",
        "sections": {
          "List Element Implementations": {
            "listElementDataCON": {
              "long_name": "List Element Data",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/listElementCON.css"
              ],
              "scripts": [
                "AV/List/listElementDataCON.js"
              ],
              "mod_name": "ListElement"
            },
            "listElementTypeCON": {
              "long_name": "List Element Type",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/listElementCON.css"
              ],
              "scripts": [
                "AV/List/listElementTypeCON.js"
              ],
              "mod_name": "ListElement"
            },
            "listElementDeleteCON": {
              "long_name": "List Element Delete",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/listElementCON.css"
              ],
              "scripts": [
                "AV/List/listElementDeleteCON.js"
              ],
              "mod_name": "ListElement"
            },
            "ListSumm": {
              "long_name": "List Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/ListSumm.html",
              "mod_name": "ListElement",
              "threshold": 3
            }
          }
        }
      },
      "List/StackArray": {
        "long_name": "Stacks",
        "sections": {
          "Stack Terminology and Implementation": {
            "astackVarCON": {
              "long_name": "Array stack variables slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/astackCON.css"
              ],
              "scripts": [
                "AV/List/astackVarCON.js"
              ],
              "mod_name": "StackArray"
            },
            "astackTopCON": {
              "long_name": "Array stack top position slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/astackCON.css"
              ],
              "scripts": [
                "AV/List/astackTopCON.js"
              ],
              "mod_name": "StackArray"
            },
            "astackPushCON": {
              "long_name": "Array stack push slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/astackCON.css"
              ],
              "scripts": [
                "AV/List/astackPushCON.js"
              ],
              "mod_name": "StackArray"
            },
            "AstackPushPRO": {
              "long_name": "Array-based Stack Push Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/AstackPushPRO.html",
              "mod_name": "StackArray",
              "threshold": 5
            }
          },
          "Pop": {
            "astackPopCON": {
              "long_name": "Array stack pop slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/astackCON.css"
              ],
              "scripts": [
                "AV/List/astackPopCON.js"
              ],
              "mod_name": "StackArray"
            },
            "AstackPopPRO": {
              "long_name": "Array-based Stack Pop Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/AstackPopPRO.html",
              "mod_name": "StackArray",
              "threshold": 5
            }
          }
        }
      },
      "List/StackLinked": {
        "long_name": "Linked Stacks",
        "sections": {
          "Linked Stack Implementation": {
            "lstackDiagramCON": {
              "type": "dgm",
              "mod_name": "StackLinked"
            },
            "lstackPushCON": {
              "long_name": "Linked stack push",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/lstackCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/lstackPushCON.js"
              ],
              "mod_name": "StackLinked"
            },
            "LstackPushPRO": {
              "long_name": "Linked Stack Push Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/LstackPushPRO.html",
              "mod_name": "StackLinked",
              "threshold": 5
            }
          },
          "Linked Stack Pop": {
            "lstackPopCON": {
              "long_name": "Linked stack pop",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/lstackCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/lstackPopCON.js"
              ],
              "mod_name": "StackLinked"
            },
            "LstackPopPRO": {
              "long_name": "Linked Stack Pop Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/LstackPopPRO.html",
              "mod_name": "StackLinked",
              "threshold": 5
            },
            "lstackTwostackCON": {
              "type": "dgm",
              "mod_name": "StackLinked"
            }
          }
        }
      },
      "List/Freelist": {
        "long_name": "Freelists",
        "sections": {
          "Freelists": {
            "listFreeCON": {
              "long_name": "Freelist Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/listFreeCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/listFreeCON.js"
              ],
              "mod_name": "Freelist"
            }
          }
        }
      },
      "List/StackRecur": {
        "long_name": "Implementing Recursion",
        "sections": {}
      },
      "List/Queue": {
        "long_name": "Queues",
        "sections": {
          "Queue Terminology and Implementation": {
            "aqueueFirstCON": {
              "long_name": "Array-based Queue Positions Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/aqueueCON.css"
              ],
              "scripts": [
                "AV/List/aqueueFirstCON.js"
              ],
              "mod_name": "Queue"
            },
            "aqueueDriftCON": {
              "long_name": "Array-based Queue Drift Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/aqueueCON.css"
              ],
              "scripts": [
                "AV/List/aqueueDriftCON.js"
              ],
              "mod_name": "Queue"
            },
            "aqueueBadCON": {
              "long_name": "Array-based Queue Bad Representation Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/aqueueCON.css"
              ],
              "scripts": [
                "AV/List/aqueueBadCON.js"
              ],
              "mod_name": "Queue"
            },
            "aqueueCircularCON": {
              "long_name": "Circular Array-based Queue Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/aqueueCON.css"
              ],
              "scripts": [
                "DataStructures/CircularQueue.js",
                "AV/List/aqueueCircularCON.js"
              ],
              "mod_name": "Queue"
            },
            "aqueueEmptyCON": {
              "long_name": "Empty Circular Array-based Queue Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/aqueueCON.css"
              ],
              "scripts": [
                "DataStructures/CircularQueue.js",
                "AV/List/aqueueEmptyCON.js"
              ],
              "mod_name": "Queue"
            },
            "aqueueVarCON": {
              "long_name": "Array-based Queue Variables Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/aqueueCON.css"
              ],
              "scripts": [
                "AV/List/aqueueVarCON.js"
              ],
              "mod_name": "Queue"
            },
            "AqueueEnqueuePRO": {
              "long_name": "Array-based Queue Enqueue Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/AqueueEnqueuePRO.html",
              "mod_name": "Queue",
              "threshold": 5
            }
          },
          "Array-based Dequeue Practice": {
            "AqueueDequeuePRO": {
              "long_name": "Array-based Queue Dequeue Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/AqueueDequeuePRO.html",
              "mod_name": "Queue",
              "threshold": 5
            }
          }
        }
      },
      "List/QueueLinked": {
        "long_name": "Linked Queues",
        "sections": {
          "Linked Queues": {
            "lqueueIntroCON": {
              "long_name": "Linked Queue Intro",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/lqueueCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/lqueueIntroCON.js"
              ],
              "mod_name": "QueueLinked"
            },
            "lqueueEnqueueCON": {
              "long_name": "Linked Queue Enqueue",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/lqueueCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/lqueueEnqueueCON.js"
              ],
              "mod_name": "QueueLinked"
            },
            "LqueueEnqueuePRO": {
              "long_name": "Linked Queue Enqueue Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/LqueueEnqueuePRO.html",
              "mod_name": "QueueLinked",
              "threshold": 5
            }
          },
          "Linked Dequeue": {
            "lqueueDequeueCON": {
              "long_name": "Linked Queue Dequeue",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/lqueueCON.css"
              ],
              "scripts": [
                "AV/List/llist.js",
                "AV/List/lqueueDequeueCON.js"
              ],
              "mod_name": "QueueLinked"
            },
            "LqueueDequeuePRO": {
              "long_name": "Linked Queue Dequeue Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/LqueueDequeuePRO.html",
              "mod_name": "QueueLinked",
              "threshold": 5
            }
          },
          "Comparison of Array-Based and Linked Queues": {
            "StackQSumm": {
              "long_name": "Stack/Queue Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/List/StackQSumm.html",
              "mod_name": "QueueLinked",
              "threshold": 5
            }
          }
        }
      },
      "List/ListSumm": {
        "long_name": "Linear Structure Summary Exercises",
        "sections": {
          "Practice Questions": {
            "ListdsSumm": {
              "long_name": "List Data Structures General Questions",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/List/ListdsSumm.html",
              "mod_name": "ListSumm",
              "threshold": 5
            }
          },
          "Chapter Review Questions": {
            "ListChapterSumm": {
              "long_name": "List Chapter Summary",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/List/ListChapterSumm.html",
              "mod_name": "ListSumm",
              "threshold": 10
            }
          }
        }
      }
    },
    "Recursion": {
      "RecurTutor/RecIntro": {
        "long_name": "Introduction",
        "sections": {
          "Introduction": {
            "recurIntroDelegateCON": {
              "long_name": "Recursion Introduction Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurIntroCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurIntroDelegateCON.js"
              ],
              "mod_name": "RecIntro"
            },
            "recurIntroDetailsCON": {
              "long_name": "Recursion Introduction Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurIntroCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurIntroDetailsCON.js"
              ],
              "mod_name": "RecIntro"
            }
          }
        }
      },
      "RecurTutor/Write": {
        "long_name": "Writing a recursive function",
        "sections": {
          "Writing a recursive function": {
            "recurWriteStepsCON": {
              "long_name": "Recursion Code Writing Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurWriteCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurWriteStepsCON.js"
              ],
              "mod_name": "Write"
            },
            "recurWriteSumCON": {
              "long_name": "Recursion Code Writing Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurWriteCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurWriteSumCON.js"
              ],
              "mod_name": "Write"
            }
          }
        }
      },
      "RecurTutor/CodeCompletionEx": {
        "long_name": "Code Completion Practice Exercises",
        "sections": {
          "Introduction": {},
          "Recursion Programming Exercise: Largest": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Largest",
            "points": 1.0,
            "workout_id": "46",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Multiply": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Multiply",
            "points": 1.0,
            "workout_id": "47",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: GCD": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: GCD",
            "points": 1.0,
            "workout_id": "48",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: log": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: log",
            "points": 1.0,
            "workout_id": "49",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Cummulative Sum": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Cummulative Sum",
            "points": 1.0,
            "workout_id": "51",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Add odd values": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Add odd values",
            "points": 2.0,
            "workout_id": "52",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Sum Of the Digits": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Sum Of the Digits",
            "points": 1.0,
            "workout_id": "53",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Count Characters": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Count Characters",
            "points": 1.0,
            "workout_id": "54",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          }
        }
      },
      "RecurTutor/HarderWrite": {
        "long_name": "Writing More Sophisticated Recursive Functions",
        "sections": {}
      },
      "RecurTutor/HarderCodeCompletionEx": {
        "long_name": "Harder Code Completion Practice Exercises",
        "sections": {
          "Recursion Programming Exercise: Minimum of array": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Minimum of array",
            "points": 1.0,
            "workout_id": "55",
            "type": "extr",
            "mod_name": "HarderCodeCompletionEx"
          },
          "Recursion Programming Exercise: Is Reverse": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Is Reverse",
            "points": 1.0,
            "workout_id": "56",
            "type": "extr",
            "mod_name": "HarderCodeCompletionEx"
          },
          "Recursion Programming Exercise: Decimal to Binary": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Decimal to Binary",
            "points": 1.0,
            "workout_id": "57",
            "type": "extr",
            "mod_name": "HarderCodeCompletionEx"
          }
        }
      },
      "RecurTutor/WritingEx": {
        "long_name": "Writing Practice Exercises",
        "sections": {
          "Recursion Programming Exercise: Cannonballs": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Cannonballs",
            "points": 1.0,
            "workout_id": "58",
            "type": "extr",
            "mod_name": "WritingEx"
          },
          "Recursion Programming Exercise: Check Palindrome": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Check Palindrome",
            "points": 1.0,
            "workout_id": "59",
            "type": "extr",
            "mod_name": "WritingEx"
          },
          "Recursion Programming Exercise: Subset Sum": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Subset Sum",
            "points": 1.0,
            "workout_id": "60",
            "type": "extr",
            "mod_name": "WritingEx"
          },
          "Recursion Programming Exercise: Pascal Triangle": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Pascal Triangle",
            "points": 1.0,
            "workout_id": "61",
            "type": "extr",
            "mod_name": "WritingEx"
          }
        }
      },
      "RecurTutor/Trace": {
        "long_name": "Tracing Recursive Code",
        "sections": {
          "Tracing Recursive Code": {
            "recurTraceWindCON": {
              "long_name": "Recursion Tracing Winding and Unwinding",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurTraceCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurTraceWindCON.js"
              ],
              "mod_name": "Trace"
            },
            "recurTraceFactCON": {
              "long_name": "Recursion Tracing Factorial Function",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurTraceCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurTraceFactCON.js"
              ],
              "mod_name": "Trace"
            },
            "recurTraceSumCON": {
              "long_name": "Recursion Tracing Sum Function",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurTraceCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurTraceSumCON.js"
              ],
              "mod_name": "Trace"
            },
            "recurTraceDmnCON": {
              "long_name": "Recursion Tracing General Domino Effect",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurTraceCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurTraceDmnCON.js"
              ],
              "mod_name": "Trace"
            },
            "TOHfigCON": {
              "type": "dgm",
              "mod_name": "Trace"
            },
            "recurTraceTOHCON": {
              "long_name": "Recursion Tracing Towers of Hanoi",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/RecurTutor/recurTraceCON.css"
              ],
              "scripts": [
                "AV/RecurTutor/recurTraceTOHCON.js"
              ],
              "mod_name": "Trace"
            }
          }
        }
      },
      "RecurTutor/TracingEx": {
        "long_name": "Tracing Practice Exercises",
        "sections": {
          "Forward Flow Tracing Exercises": {
            "RecTraceSummFwdFlow": {
              "long_name": "Recursion Tracing Exercises Set 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecTraceSummFwdFlow.html",
              "mod_name": "TracingEx",
              "threshold": 1.0
            }
          },
          "Backward Flow Tracing Exercises": {
            "RecTraceSummbckwrdFlow": {
              "long_name": "Recursion Tracing Exercises Set 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecTraceSummbckwrdFlow.html",
              "mod_name": "TracingEx",
              "threshold": 1.0
            }
          },
          "Find Error Tracing Exercises": {
            "RecTraceSummFuncErr": {
              "long_name": "Recursion Tracing Exercises Set 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecTraceSummFuncErr.html",
              "mod_name": "TracingEx",
              "threshold": 1.0
            }
          },
          "Two Recursive Calls Tracing Exercises": {
            "RecTraceSummTwoRC": {
              "long_name": "Recursion Tracing Exercises Set 4",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecTraceSummTwoRC.html",
              "mod_name": "TracingEx",
              "threshold": 1.0
            }
          },
          "How Many Times Tracing Exercises": {
            "RecTraceSummHowmany": {
              "long_name": "Recursion Tracing Exercises Set 5",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecTraceSummHowmany.html",
              "mod_name": "TracingEx",
              "threshold": 1.0
            }
          },
          "Harder Tracing Exercises": {
            "RecTraceSummHard": {
              "long_name": "Recursion Tracing Exercises Set 6",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecTraceSummHard.html",
              "mod_name": "TracingEx",
              "threshold": 1.0
            }
          }
        }
      },
      "RecurTutor/RecSummaryEx": {
        "long_name": "Summary Exercises",
        "sections": {
          "Summary Questions": {
            "RecChapterSumm": {
              "long_name": "Recursion Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecChapterSumm.html",
              "mod_name": "RecSummaryEx",
              "threshold": 5
            }
          }
        }
      }
    },
    "Design II": {
      "Design/DesignPatterns": {
        "long_name": "Design Patterns",
        "sections": {
          "Design Patterns": {
            "DesignPatternSumm": {
              "long_name": "Design Patterns Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Design/DesignPatternSumm.html",
              "mod_name": "DesignPatterns",
              "threshold": 4
            }
          }
        }
      },
      "Design/DesignAltList": {
        "long_name": "Alternative List ADT Designs",
        "sections": {}
      },
      "Design/Comparison": {
        "long_name": "Comparing Records",
        "sections": {
          "Comparing Records": {
            "CompareSumm": {
              "long_name": "Record Comparison Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Design/CompareSumm.html",
              "mod_name": "Comparison",
              "threshold": 5
            }
          }
        }
      },
      "Design/Dictionary": {
        "long_name": "The Dictionary ADT",
        "sections": {
          "The Dictionary ADT": {
            "DesignDictionarySumm": {
              "long_name": "Dictionary Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Design/DesignDictionarySumm.html",
              "mod_name": "Dictionary",
              "threshold": 3
            }
          }
        }
      }
    },
    "Binary Trees": {
      "Binary/BinaryTreeIntro": {
        "long_name": "Binary Trees Chapter Introduction",
        "sections": {}
      },
      "Binary/BinaryTree": {
        "long_name": "Binary Trees",
        "sections": {
          "Definitions and Properties": {
            "BinExampCON": {
              "type": "dgm",
              "mod_name": "BinaryTree"
            },
            "BinDiffCON": {
              "type": "dgm",
              "mod_name": "BinaryTree"
            },
            "FullCompCON": {
              "type": "dgm",
              "mod_name": "BinaryTree"
            },
            "DefSumm": {
              "long_name": "Tree Definition Summary Exercises",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/Binary/DefSumm.html",
              "mod_name": "BinaryTree",
              "threshold": 8
            }
          },
          "Practice Questions": {
            "Treeprobs": {
              "long_name": "Tree/Node Exercises",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Binary/Treeprobs.html",
              "mod_name": "BinaryTree",
              "threshold": 4
            }
          }
        }
      },
      "Binary/RecursiveDS": {
        "long_name": "Binary Tree as a Recursive Data Structure",
        "sections": {
          "Binary Tree as a Recursive Data Structure": {
            "ListRecDSCON": {
              "type": "dgm",
              "mod_name": "RecursiveDS"
            },
            "BinRecDSCON": {
              "type": "dgm",
              "mod_name": "RecursiveDS"
            },
            "SumBinaryTreeCON": {
              "long_name": "Sum values in a Binary Tree Slide Show",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/RecursiveDSCON.css"
              ],
              "scripts": [
                "AV/Binary/SumBinaryTreeCON.js"
              ],
              "mod_name": "RecursiveDS"
            }
          }
        }
      },
      "Binary/BinaryTreeFullThm": {
        "long_name": "The Full Binary Tree Theorem",
        "sections": {}
      },
      "Binary/BinaryTreeTraversal": {
        "long_name": "Binary Tree Traversals",
        "sections": {
          "Binary Tree Traversals": {
            "BinExampCON": {
              "type": "dgm",
              "mod_name": "BinaryTreeTraversal"
            },
            "preorderCON": {
              "long_name": "Preorder Traversal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BTCON.css"
              ],
              "scripts": [
                "AV/Binary/preorderCON.js"
              ],
              "mod_name": "BinaryTreeTraversal"
            },
            "postorderCON": {
              "long_name": "Postorder Traversal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BTCON.css"
              ],
              "scripts": [
                "AV/Binary/postorderCON.js"
              ],
              "mod_name": "BinaryTreeTraversal"
            },
            "inorderCON": {
              "long_name": "Inorder Traversal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BTCON.css"
              ],
              "scripts": [
                "AV/Binary/inorderCON.js"
              ],
              "mod_name": "BinaryTreeTraversal"
            },
            "btTravPreorderPRO": {
              "long_name": "Binary Tree Preorder Traversal Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Binary/btTravPreorderPRO.html",
              "mod_name": "BinaryTreeTraversal",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            }
          },
          "Postorder Traversal Practice": {
            "btTravPostorderPRO": {
              "long_name": "Binary Tree Postorder Traversal Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Binary/btTravPostorderPRO.html",
              "mod_name": "BinaryTreeTraversal",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            }
          },
          "Inorder Traversal Practice": {
            "btTravInorderPRO": {
              "long_name": "Binary Tree Inorder Traversal Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Binary/btTravInorderPRO.html",
              "mod_name": "BinaryTreeTraversal",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            }
          },
          "Summary Questions": {
            "TravSumm": {
              "long_name": "Tree Traversal Summary Questions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Binary/TravSumm.html",
              "mod_name": "BinaryTreeTraversal",
              "threshold": 3
            }
          }
        }
      },
      "Binary/WritingTraversals": {
        "long_name": "Implementing Tree Traversals",
        "sections": {
          "Implementing Tree Traversals": {},
          "Binary Tree Increment By One Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Increment By One Exercise",
            "points": 1.0,
            "workout_id": "80",
            "type": "extr",
            "mod_name": "WritingTraversals"
          }
        }
      },
      "BTRecurTutor/BinaryTreeInfFlw": {
        "long_name": "Information Flow in Recursive Functions",
        "sections": {
          "Information Flow in Recursive Functions": {},
          "Binary Tree Set Depth Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Set Depth Exercise",
            "points": 2.0,
            "workout_id": "66",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Collect-and-return": {
            "BinaryTreeMistakesCON": {
              "long_name": "Binary Tree Common Mistakes Slideshow",
              "required": false,
              "points": 1.0,
              "threshold": 0.9,
              "type": "ss",
              "links": [
                "AV/Binary/WriteTrav.css"
              ],
              "scripts": [
                "AV/Binary/BinaryTreeMistakesCON.js"
              ],
              "mod_name": "BinaryTreeInfFlw"
            }
          },
          "Binary Tree Check Sum Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Check Sum Exercise",
            "points": 2.0,
            "workout_id": "71",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Leaf Nodes Count Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Leaf Nodes Count Exercise",
            "points": 2.0,
            "workout_id": "72",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Sum Nodes Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Sum Nodes Exercise",
            "points": 2.0,
            "workout_id": "68",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Combining Information Flows": {},
          "Binary Tree Check Value Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Check Value Exercise",
            "points": 2.0,
            "workout_id": "65",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Combination Problems": {},
          "Binary Tree Height Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Height Exercise",
            "points": 2.0,
            "workout_id": "70",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Get Difference Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Get Difference Exercise",
            "points": 2.0,
            "workout_id": "73",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Has Path Sum Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Has Path Sum Exercise",
            "points": 2.0,
            "workout_id": "67",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          }
        }
      },
      "Binary/BinaryTreeImpl": {
        "long_name": "Binary Tree Node Implementations",
        "sections": {
          "Binary Tree Node Implementations": {
            "BTnullpointerCON": {
              "type": "dgm",
              "mod_name": "BinaryTreeImpl"
            },
            "expressionTreeCON": {
              "type": "dgm",
              "mod_name": "BinaryTreeImpl"
            },
            "expressionTraversalCON": {
              "long_name": "Expression Tree Traversal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BTCON.css"
              ],
              "scripts": [
                "AV/Binary/expressionTraversalCON.js"
              ],
              "mod_name": "BinaryTreeImpl"
            }
          }
        }
      },
      "Binary/Composite": {
        "long_name": "Composite-based Expression Tree",
        "sections": {
          "Composite-based Expression Tree": {}
        }
      },
      "Binary/BinaryTreeNodeSpace": {
        "long_name": "Binary Tree Space Requirements",
        "sections": {
          "Binary Tree Space Requirements": {
            "TreeOverheadFIB": {
              "long_name": "Tree Overhead Exercise",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/Binary/TreeOverheadFIB.html",
              "mod_name": "BinaryTreeNodeSpace",
              "threshold": 5
            }
          }
        }
      },
      "Binary/BST": {
        "long_name": "Binary Search Trees",
        "sections": {
          "Binary Search Tree Definition": {
            "BSTShapeCON": {
              "type": "dgm",
              "mod_name": "BST"
            },
            "BSTsearchCON": {
              "long_name": "BST Search Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BSTCON.css"
              ],
              "scripts": [
                "AV/Binary/BSTsearchCON.js"
              ],
              "mod_name": "BST"
            },
            "BSTsearchPRO": {
              "long_name": "BST Search Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Binary/BSTsearchPRO.html",
              "mod_name": "BST",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none",
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "undo"
              }
            }
          },
          "BST Insert": {
            "BSTinsertCON": {
              "long_name": "BST Insert Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BSTCON.css"
              ],
              "scripts": [
                "AV/Binary/BSTinsertCON.js"
              ],
              "mod_name": "BST"
            },
            "BSTinsertPRO": {
              "long_name": "BST Insert Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Binary/BSTinsertPRO.html",
              "mod_name": "BST",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none",
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "undo"
              }
            }
          },
          "BST Remove": {
            "BSTdeletemaxCON": {
              "long_name": "BST deletemax Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BSTCON.css"
              ],
              "scripts": [
                "AV/Binary/BSTdeletemaxCON.js"
              ],
              "mod_name": "BST"
            },
            "BSTremoveCON": {
              "long_name": "BST remove Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/BSTCON.css"
              ],
              "scripts": [
                "AV/Binary/BSTremoveCON.js"
              ],
              "mod_name": "BST"
            },
            "BSTremovePRO": {
              "long_name": "BST Remove Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Binary/BSTremovePRO.html",
              "mod_name": "BST",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none",
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "undo"
              }
            }
          },
          "BST Analysis": {
            "BSTSumm": {
              "long_name": "BST Question Summary",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Binary/BSTSumm.html",
              "mod_name": "BST",
              "threshold": 2
            }
          }
        }
      },
      "Binary/BSTDict": {
        "long_name": "Dictionary Implementation Using a BST",
        "sections": {}
      },
      "BTRecurTutor/BinaryTreeGuidedInfFlw": {
        "long_name": "Binary Tree Guided Information Flow",
        "sections": {
          "Binary Tree Guided Information Flow": {
            "IneffBinaryTreeRangeCON": {
              "long_name": "Inefficient Binary Tree Traversal on Range Slide Show",
              "required": false,
              "points": 1.0,
              "threshold": 0.9,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/BTRecurTutor/IneffBinaryTreeRangeCON.js"
              ],
              "mod_name": "BinaryTreeGuidedInfFlw"
            }
          },
          "Binary Search Tree Small Count Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Search Tree Small Count Exercise",
            "points": 2.0,
            "workout_id": "64",
            "type": "extr",
            "mod_name": "BinaryTreeGuidedInfFlw"
          }
        }
      },
      "BTRecurTutor/MultipleBinaryTrees": {
        "long_name": "Multiple Binary Trees",
        "sections": {
          "Mirror Image Binary Trees Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Mirror Image Binary Trees Exercise",
            "points": 2.0,
            "workout_id": "74",
            "type": "extr",
            "mod_name": "MultipleBinaryTrees"
          },
          "Same Binary Tree Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Same Binary Tree Exercise",
            "points": 2.0,
            "workout_id": "69",
            "type": "extr",
            "mod_name": "MultipleBinaryTrees"
          },
          "Structurally Identical Binary Trees Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Structurally Identical Binary Trees Exercise",
            "points": 2.0,
            "workout_id": "75",
            "type": "extr",
            "mod_name": "MultipleBinaryTrees"
          }
        }
      },
      "BTRecurTutor/BSTCheck": {
        "long_name": "A Hard Information Flow Problem",
        "sections": {}
      },
      "Binary/CompleteTree": {
        "long_name": "Array Implementation for Complete Binary Trees",
        "sections": {
          "Array Implementation for Complete Binary Trees": {
            "CompleteFIB": {
              "long_name": "Complete Tree Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Binary/CompleteFIB.html",
              "mod_name": "CompleteTree",
              "threshold": 5
            }
          }
        }
      },
      "Binary/Heaps": {
        "long_name": "Heaps and Priority Queues",
        "sections": {
          "Heaps and Priority Queues": {
            "heapinsertCON": {
              "long_name": "Heap insert Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Binary/heapinsertCON.js"
              ],
              "mod_name": "Heaps"
            },
            "heapinsertPRO": {
              "long_name": "Heap Insert Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Binary/heapinsertPRO.html",
              "mod_name": "Heaps",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            }
          },
          "Building a Heap": {
            "HeapBldChoiceCON": {
              "long_name": "Heap Build Choices",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/HeapBldChoiceCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Binary/HeapBldChoiceCON.js"
              ],
              "mod_name": "Heaps"
            },
            "HeapsIndCON": {
              "type": "dgm",
              "mod_name": "Heaps"
            },
            "heapbuildCON": {
              "long_name": "Heapbuild Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Binary/heapbuildCON.js"
              ],
              "mod_name": "Heaps"
            },
            "heapbuildPRO": {
              "long_name": "Heap Build Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Binary/heapbuildPRO.html",
              "mod_name": "Heaps",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            },
            "heapbuildProofCON": {
              "long_name": "Heap build analysis proof Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Binary/heapbuildProofCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Binary/heapbuildProofCON.js"
              ],
              "mod_name": "Heaps"
            }
          },
          "Removing from the heap or updating an object's priority": {
            "heapmaxCON": {
              "long_name": "Remove Max Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Binary/heapmaxCON.js"
              ],
              "mod_name": "Heaps"
            },
            "heapremovePRO": {
              "long_name": "Heap Remove Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Binary/heapremovePRO.html",
              "mod_name": "Heaps",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            },
            "heapremoveCON": {
              "long_name": "Remove Any Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Binary/heapremoveCON.js"
              ],
              "mod_name": "Heaps"
            }
          },
          "Priority Queues": {
            "HeapSumm": {
              "long_name": "Heap Question Summary",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Binary/HeapSumm.html",
              "mod_name": "Heaps",
              "threshold": 5
            }
          }
        }
      },
      "Binary/Huffman": {
        "long_name": "Huffman Coding Trees",
        "sections": {
          "Huffman Coding Trees": {
            "huffmanBuildCON": {
              "long_name": "Huffman Coding Tree Slideshow: Build",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/huffman.css",
                "AV/Binary/huffmanCON.css"
              ],
              "scripts": [
                "DataStructures/huffman.js",
                "AV/Binary/huffmanBuildCON.js"
              ],
              "mod_name": "Huffman"
            },
            "huffmanLabelCON": {
              "long_name": "Huffman Coding Tree Slideshow: Label Edges",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/huffman.css",
                "AV/Binary/huffmanCON.css"
              ],
              "scripts": [
                "DataStructures/huffman.js",
                "AV/Binary/huffmanLabelCON.js"
              ],
              "mod_name": "Huffman"
            },
            "huffmanCodesCON": {
              "long_name": "Huffman Coding Tree Slideshow: Setting Codes",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/huffman.css",
                "AV/Binary/huffmanCON.css"
              ],
              "scripts": [
                "DataStructures/huffman.js",
                "AV/Binary/huffmanCodesCON.js"
              ],
              "mod_name": "Huffman"
            },
            "huffmanDecodeCON": {
              "long_name": "Huffman Coding Tree Slideshow: Decoding",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/huffman.css",
                "AV/Binary/huffmanCON.css"
              ],
              "scripts": [
                "DataStructures/huffman.js",
                "AV/Binary/huffmanDecodeCON.js"
              ],
              "mod_name": "Huffman"
            },
            "HuffmanDecodePRO": {
              "long_name": "Huffman Decoding Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Binary/HuffmanDecodePRO.html",
              "mod_name": "Huffman",
              "threshold": 5
            },
            "huffmanCustomBuildAV": {
              "long_name": "huffmanCustomBuildAV",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Binary/huffmanCustomBuildAV.html",
              "mod_name": "Huffman",
              "threshold": 1
            }
          }
        }
      },
      "Binary/TreeTrie": {
        "long_name": "Trees versus Tries",
        "sections": {
          "Trees versus Tries": {
            "TreeTimelineCON": {
              "long_name": "Tree timeline Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Development/TreeTrieCON.css"
              ],
              "scripts": [
                "AV/Development/TreeTimelineCON.js"
              ],
              "mod_name": "TreeTrie"
            },
            "TrieTimelineCON": {
              "long_name": "Trie timeline Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Development/TreeTrieCON.css"
              ],
              "scripts": [
                "AV/Development/TrieTimelineCON.js"
              ],
              "mod_name": "TreeTrie"
            }
          }
        }
      },
      "Binary/HuffProof": {
        "long_name": "Proof of Optimality for Huffman Coding",
        "sections": {
          "Proof of Optimality for Huffman Coding": {
            "HuffProofCON": {
              "type": "dgm",
              "mod_name": "HuffProof"
            }
          }
        }
      },
      "Binary/BinaryChapSumm": {
        "long_name": "Binary Tree Chapter Summary",
        "sections": {
          "Summary Questions": {
            "BinaryChapSumm": {
              "long_name": "BinaryChapSumm",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Binary/BinaryChapSumm.html",
              "mod_name": "BinaryChapSumm",
              "threshold": 10
            }
          }
        }
      }
    },
    "Sorting": {
      "Sorting/InSort": {
        "long_name": "Chapter Introduction: Sorting",
        "sections": {}
      },
      "Sorting/SortNotation": {
        "long_name": "Sorting Terminology and Notation",
        "sections": {
          "Sorting Terminology and Notation": {
            "SortNotationS1CON": {
              "long_name": "Sorting Terminology and Notation Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/SortNotationS1CON.css"
              ],
              "scripts": [
                "AV/Sorting/SortNotationS1CON.js"
              ],
              "mod_name": "SortNotation"
            },
            "SortIntroSumm": {
              "long_name": "Sorting Intro Summary",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/SortIntroSumm.html",
              "mod_name": "SortNotation",
              "threshold": 3
            }
          }
        }
      },
      "Sorting/InsertionSort": {
        "long_name": "Insertion Sort",
        "sections": {
          "Insertion Sort": {
            "insertionsortCON": {
              "long_name": "Insertion Sort Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/insertionsortCON.js"
              ],
              "mod_name": "InsertionSort"
            },
            "insertionsortAV": {
              "long_name": "Insertion Sort Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/insertionsortAV.html",
              "mod_name": "InsertionSort",
              "threshold": 1
            },
            "InssortPRO": {
              "long_name": "Insertion Sort Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/InssortPRO.html",
              "mod_name": "InsertionSort",
              "threshold": 5
            }
          },
          "Insertion Sort Analysis": {
            "InsertionSortWorstCaseCON": {
              "long_name": "Insertion Sort Worst Case Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/InsertionSortWorstCaseCON.css"
              ],
              "scripts": [
                "AV/Sorting/InsertionSortWorstCaseCON.js"
              ],
              "mod_name": "InsertionSort"
            },
            "InsertionSortBestCaseCON": {
              "long_name": "Insertion Sort Best Case Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/InsertionSortBestCaseCON.css"
              ],
              "scripts": [
                "AV/Sorting/InsertionSortBestCaseCON.js"
              ],
              "mod_name": "InsertionSort"
            },
            "InsertionSortAverageCaseCON": {
              "long_name": "Insertion Sort Average Case Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/InsertionSortAverageCaseCON.css"
              ],
              "scripts": [
                "AV/Sorting/InsertionSortAverageCaseCON.js"
              ],
              "mod_name": "InsertionSort"
            },
            "InssortSumm": {
              "long_name": "Insertion Sort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/InssortSumm.html",
              "mod_name": "InsertionSort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/BubbleSort": {
        "long_name": "Bubble Sort",
        "sections": {
          "Bubble Sort": {
            "bubblesortS1CON": {
              "long_name": "Bubble Sort Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/bubblesortS1CON.js"
              ],
              "mod_name": "BubbleSort"
            },
            "bubblesortS2CON": {
              "long_name": "Bubble Sort Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/bubblesortS2CON.js"
              ],
              "mod_name": "BubbleSort"
            },
            "bubblesortAV": {
              "long_name": "Bubble Sort Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/bubblesortAV.html",
              "mod_name": "BubbleSort",
              "threshold": 1
            },
            "BubsortPRO": {
              "long_name": "Bubble Sort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/BubsortPRO.html",
              "mod_name": "BubbleSort",
              "threshold": 3
            }
          },
          "Bubble Sort Analysis": {
            "BubbleSortAnalysisCON": {
              "long_name": "Bubble Sort Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/BubbleSortAnalysisCON.css"
              ],
              "scripts": [
                "AV/Sorting/BubbleSortAnalysisCON.js"
              ],
              "mod_name": "BubbleSort"
            },
            "BubsortSumm": {
              "long_name": "Bubble Sort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/BubsortSumm.html",
              "mod_name": "BubbleSort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/SelectionSort": {
        "long_name": "Selection Sort",
        "sections": {
          "Selection Sort": {
            "selectionsortS1CON": {
              "long_name": "Selection Sort Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/selectionsortS1CON.js"
              ],
              "mod_name": "SelectionSort"
            },
            "selectionsortS2CON": {
              "long_name": "Selection Sort Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/selectionsortS2CON.js"
              ],
              "mod_name": "SelectionSort"
            },
            "selectionsortAV": {
              "long_name": "Selection Sort Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/selectionsortAV.html",
              "mod_name": "SelectionSort",
              "threshold": 1
            },
            "SelsortPRO": {
              "long_name": "Selection Sort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/SelsortPRO.html",
              "mod_name": "SelectionSort",
              "threshold": 5
            }
          },
          "Selection Sort Analysis": {
            "SelectionSortAnalysisCON": {
              "long_name": "Selection Sort Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/SelectionSortAnalysisCON.css"
              ],
              "scripts": [
                "AV/Sorting/SelectionSortAnalysisCON.js"
              ],
              "mod_name": "SelectionSort"
            },
            "ptrSwapCON": {
              "long_name": "Selection Sort Pointer Swap",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/ptrSwapCON.css"
              ],
              "scripts": [
                "AV/Sorting/ptrSwapCON.js"
              ],
              "mod_name": "SelectionSort"
            },
            "SelsortSumm": {
              "long_name": "Selection Sort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/SelsortSumm.html",
              "mod_name": "SelectionSort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/ExchangeSort": {
        "long_name": "The Cost of Exchange Sorting",
        "sections": {
          "The Cost of Exchange Sorting": {
            "FindInversionsPRO": {
              "long_name": "Inversions Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/FindInversionsPRO.html",
              "mod_name": "ExchangeSort",
              "threshold": 5
            }
          },
          "Analysis": {
            "ExchangeSortCON": {
              "long_name": "Exchange Sort Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/ExchangeSortCON.css"
              ],
              "scripts": [
                "AV/Sorting/ExchangeSortCON.js"
              ],
              "mod_name": "ExchangeSort"
            },
            "ExchangeSumm": {
              "long_name": "Exchange Sorting Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/ExchangeSumm.html",
              "mod_name": "ExchangeSort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/SortOpt": {
        "long_name": "Optimizing Sort Algorithms with Code Tuning",
        "sections": {
          "Code Tuning for Simple Sorting Algorithms": {
            "insertionSortWithoutSwapPRO": {
              "long_name": "Insertion Sort Without Swap Proficiency Exercise",
              "required": true,
              "points": 0.0,
              "type": "pe",
              "av_address": "AV/Sorting/insertionSortWithoutSwapPRO.html",
              "mod_name": "SortOpt",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-code": "none"
              }
            }
          }
        }
      },
      "Sorting/Shellsort": {
        "long_name": "Shellsort",
        "sections": {
          "Shellsort": {
            "shellsortCON1": {
              "long_name": "Shellsort Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/shellsortCON1.js"
              ],
              "mod_name": "Shellsort"
            },
            "shellsortCON2": {
              "long_name": "Shellsort Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/shellsortCODE.js",
                "AV/Sorting/shellsortCON2.js"
              ],
              "mod_name": "Shellsort"
            },
            "shellsortCON3": {
              "type": "dgm",
              "mod_name": "Shellsort"
            },
            "shellsortCON4": {
              "long_name": "Shellsort Slideshow 3",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/shellsortCON4.js"
              ],
              "mod_name": "Shellsort"
            },
            "shellsortCON5": {
              "long_name": "Shellsort Slideshow 4",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/shellsortCODE.js",
                "AV/Sorting/shellsortCON5.js"
              ],
              "mod_name": "Shellsort"
            },
            "shellsortCON6": {
              "type": "dgm",
              "mod_name": "Shellsort"
            },
            "shellsortCON7": {
              "long_name": "Shellsort Slideshow 5",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/shellsortCODE.js",
                "AV/Sorting/shellsortCON7.js"
              ],
              "mod_name": "Shellsort"
            },
            "shellsortCON8": {
              "type": "dgm",
              "mod_name": "Shellsort"
            },
            "shellsortCON9": {
              "long_name": "Shellsort Slideshow 6",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/shellsortCODE.js",
                "AV/Sorting/shellsortCON9.js"
              ],
              "mod_name": "Shellsort"
            },
            "ShellsortSublistSumm": {
              "long_name": "Shellsort Sublist Proficency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/ShellsortSublistSumm.html",
              "mod_name": "Shellsort",
              "threshold": 5
            }
          },
          "Putting It Together": {
            "shellsortAV": {
              "long_name": "Shellsort Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/shellsortAV.html",
              "mod_name": "Shellsort",
              "threshold": 1
            },
            "ShellsortSeries": {
              "long_name": "Shellsort Series Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/ShellsortSeries.html",
              "mod_name": "Shellsort",
              "threshold": 5
            }
          },
          "Shellsort Practice Exercise": {
            "shellsortPRO": {
              "long_name": "Shellsort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Sorting/shellsortPRO.html",
              "mod_name": "Shellsort",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            }
          },
          "Optimizing Shellsort": {
            "shellsortPerf": {
              "long_name": "Shellsort Performance Activity",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Sorting/shellsortPerf.html",
              "mod_name": "Shellsort",
              "threshold": 1.0
            }
          },
          "Shellsort Summary Questions": {
            "ShellsortSumm": {
              "long_name": "Shellsort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/ShellsortSumm.html",
              "mod_name": "Shellsort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/Mergesort": {
        "long_name": "Mergesort Concepts",
        "sections": {
          "Mergesort Concepts": {
            "mergesortAV": {
              "long_name": "Mergesort Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/mergesortAV.html",
              "mod_name": "Mergesort",
              "threshold": 1
            },
            "mergesortCON": {
              "long_name": "Merging Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/mergesortCON.js"
              ],
              "mod_name": "Mergesort"
            },
            "MergesortMergePRO": {
              "long_name": "Mergesort Merging Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/MergesortMergePRO.html",
              "mod_name": "Mergesort",
              "threshold": 5
            }
          },
          "Mergesort Practice Exercise": {
            "mergesortPRO": {
              "long_name": "Mergesort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Sorting/mergesortPRO.html",
              "mod_name": "Mergesort",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            },
            "MergeSortAnalysisCON": {
              "long_name": "Mergesort Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/MergeSortAnalysisCON.css"
              ],
              "scripts": [
                "AV/Sorting/MergeSortAnalysisCON.js"
              ],
              "mod_name": "Mergesort"
            }
          }
        }
      },
      "Sorting/MergesortImpl": {
        "long_name": "Implementing Mergesort",
        "sections": {
          "Implementing Mergesort": {
            "mergeImplS1CON": {
              "long_name": "Mergesort Implementation Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/mergeImplS1CON.js"
              ],
              "mod_name": "MergesortImpl"
            },
            "mergeImplS2CON": {
              "long_name": "Mergesort Implementation Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/mergeImplS2CON.js"
              ],
              "mod_name": "MergesortImpl"
            },
            "MergesortSumm": {
              "long_name": "Mergesort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/MergesortSumm.html",
              "mod_name": "MergesortImpl",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/Quicksort": {
        "long_name": "Quicksort",
        "sections": {
          "Introduction": {
            "QuicksortPivotPRO": {
              "long_name": "Quicksort Pivot Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/QuicksortPivotPRO.html",
              "mod_name": "Quicksort",
              "threshold": 5
            }
          },
          "Partition": {
            "quicksortCON": {
              "long_name": "Quicksort Partition Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/quicksortCON.css"
              ],
              "scripts": [
                "AV/Sorting/quicksortCODE.js",
                "AV/Sorting/quicksortCON.js"
              ],
              "mod_name": "Quicksort"
            },
            "QuicksortPartitPRO": {
              "long_name": "Quicksort Partition Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/QuicksortPartitPRO.html",
              "mod_name": "Quicksort",
              "threshold": 5
            },
            "QuickSortPartitionAnalysisCON": {
              "long_name": "Quicksort Partition Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/QuickSortPartitionAnalysisCON.css"
              ],
              "scripts": [
                "AV/Sorting/QuickSortPartitionAnalysisCON.js"
              ],
              "mod_name": "Quicksort"
            }
          },
          "Putting It Together": {
            "quicksortAV": {
              "long_name": "Quicksort Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/quicksortAV.html",
              "mod_name": "Quicksort",
              "threshold": 1
            },
            "quicksortPRO": {
              "long_name": "Quicksort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Sorting/quicksortPRO.html",
              "mod_name": "Quicksort",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            }
          },
          "Quicksort Analysis": {
            "QuickSortWorstCaseCON": {
              "long_name": "Quicksort Worst Case Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/QuickSortWorstCaseCON.css"
              ],
              "scripts": [
                "AV/Sorting/QuickSortWorstCaseCON.js"
              ],
              "mod_name": "Quicksort"
            },
            "QuickSortBestCaseCON": {
              "long_name": "Quicksort Best Case Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/QuickSortBestCaseCON.css"
              ],
              "scripts": [
                "AV/Sorting/QuickSortBestCaseCON.js"
              ],
              "mod_name": "Quicksort"
            },
            "QuickSortAverageCaseCON": {
              "long_name": "Quicksort Average Case Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/QuickSortAverageCaseCON.css"
              ],
              "scripts": [
                "AV/Sorting/QuickSortAverageCaseCON.js"
              ],
              "mod_name": "Quicksort"
            },
            "QuicksortSumm": {
              "long_name": "Quicksort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/QuicksortSumm.html",
              "mod_name": "Quicksort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/Heapsort": {
        "long_name": "Heapsort",
        "sections": {
          "Heapsort": {
            "heapsortCON": {
              "long_name": "Heapsort Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Sorting/heapsortCON.js"
              ],
              "mod_name": "Heapsort"
            },
            "HeapsortStepPRO": {
              "long_name": "Heapsort RemoveMax Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/HeapsortStepPRO.html",
              "mod_name": "Heapsort",
              "threshold": 5
            }
          },
          "Heapsort Proficiency Practice": {
            "heapsortPRO": {
              "long_name": "Heapsort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Sorting/heapsortPRO.html",
              "mod_name": "Heapsort",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            }
          },
          "Heapsort Analysis": {
            "HeapSortAnalysisCON": {
              "long_name": "Heapsort Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/HeapSortAnalysisCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Sorting/HeapSortAnalysisCON.js"
              ],
              "mod_name": "Heapsort"
            },
            "HeapsortSumm": {
              "long_name": "Heapsort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/HeapsortSumm.html",
              "mod_name": "Heapsort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/BinSort": {
        "long_name": "Binsort",
        "sections": {
          "Binsort": {
            "binsortS1CON": {
              "long_name": "Binsort Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/binsortS1CON.js"
              ],
              "mod_name": "BinSort"
            },
            "binsortS2CON": {
              "long_name": "Binsort Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Sorting/binsortS2CON.js"
              ],
              "mod_name": "BinSort"
            }
          }
        }
      },
      "Sorting/RadixSort": {
        "long_name": "Radix Sort",
        "sections": {
          "Radix Sort": {
            "radixLinkAV": {
              "long_name": "Radix Sort Linked Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/radixLinkAV.html",
              "mod_name": "RadixSort",
              "threshold": 1
            },
            "RadixsortPRO": {
              "long_name": "Radix Sort Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/RadixsortPRO.html",
              "mod_name": "RadixSort",
              "threshold": 4
            }
          },
          "Array-based Radix Sort": {
            "radixArrayAV": {
              "long_name": "Radix Sort Array Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Sorting/radixArrayAV.html",
              "mod_name": "RadixSort",
              "threshold": 1
            },
            "RadixSortAnalysisCON": {
              "long_name": "Radix Sort Analysis Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/RadixSortAnalysisCON.css"
              ],
              "scripts": [
                "AV/Sorting/RadixSortAnalysisCON.js"
              ],
              "mod_name": "RadixSort"
            },
            "RadixSortSumm": {
              "long_name": "Radix Sort Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/RadixSortSumm.html",
              "mod_name": "RadixSort",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/SortingEmpirical": {
        "long_name": "An Empirical Comparison of Sorting Algorithms",
        "sections": {
          "An Empirical Comparison of Sorting Algorithms": {
            "SortAlgCompSumm": {
              "long_name": "Sort Comparison Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/SortAlgCompSumm.html",
              "mod_name": "SortingEmpirical",
              "threshold": 5
            }
          }
        }
      },
      "Sorting/SortingLowerBound": {
        "long_name": "Lower Bounds for Sorting",
        "sections": {
          "Lower Bounds for Sorting": {
            "SortingLowerBoundCON": {
              "long_name": "Sorting Lower Bound Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/SortingLowerBoundCON.css"
              ],
              "scripts": [
                "AV/Sorting/SortingLowerBoundCON.js"
              ],
              "mod_name": "SortingLowerBound"
            },
            "SortBoundSumm": {
              "long_name": "Lower Bounds Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/SortBoundSumm.html",
              "mod_name": "SortingLowerBound",
              "threshold": 4
            }
          }
        }
      },
      "Sorting/SortSumm": {
        "long_name": "Sorting Summary Exercises",
        "sections": {
          "Sorting Summary Exercises": {
            "SortChapterSumm": {
              "long_name": "Sorting Chapter Summary Exercise",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/Sorting/SortChapterSumm.html",
              "mod_name": "SortSumm",
              "threshold": 10
            }
          }
        }
      }
    },
    "File Processing": {
      "Files/FileProc": {
        "long_name": "Chapter Introduction: File Processing",
        "sections": {}
      },
      "Files/Secondary": {
        "long_name": "Primary versus Secondary Storage",
        "sections": {}
      },
      "Files/Diskdrive": {
        "long_name": "Disk Drives",
        "sections": {
          "Disk Drives": {
            "diskSector": {
              "type": "dgm",
              "mod_name": "Diskdrive"
            }
          }
        }
      },
      "Files/BuffPool": {
        "long_name": "Buffer Pools",
        "sections": {
          "Buffer Pools": {
            "buffintroCON": {
              "long_name": "Buffer Pool Introduction Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/buffpoolCON.css"
              ],
              "scripts": [
                "AV/Files/buffintroCON.js"
              ],
              "mod_name": "BuffPool"
            },
            "LRUCON": {
              "long_name": "LRU Replacement Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/buffpoolCON.css"
              ],
              "scripts": [
                "AV/Files/LRUCON.js"
              ],
              "mod_name": "BuffPool"
            },
            "LRUwriteCON": {
              "long_name": "LRU Replacement with write Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/buffpoolCON.css"
              ],
              "scripts": [
                "AV/Files/LRUwriteCON.js"
              ],
              "mod_name": "BuffPool"
            },
            "BufferPoolAV": {
              "long_name": "Buffer Pool Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Files/BufferPoolAV.html",
              "mod_name": "BuffPool",
              "threshold": 1
            }
          }
        }
      },
      "Files/FileProg": {
        "long_name": "The Programmer's View of Files",
        "sections": {}
      },
      "Files/ExternalSort": {
        "long_name": "External Sorting",
        "sections": {
          "External Sorting": {
            "extMergeSortCON": {
              "long_name": "External Merge Sort Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/extsortCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Files/extMergeSortCON.js"
              ],
              "mod_name": "ExternalSort"
            },
            "extMergeSortExampCON": {
              "long_name": "External Merge Sort Example Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/extsortCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Files/extMergeSortExampCON.js"
              ],
              "mod_name": "ExternalSort"
            },
            "extSortOverCON": {
              "type": "dgm",
              "mod_name": "ExternalSort"
            },
            "extRSCON": {
              "long_name": "External Replacement Selection Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/extsortCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Files/extRSCON.js"
              ],
              "mod_name": "ExternalSort"
            },
            "extSortSnowCON": {
              "type": "dgm",
              "mod_name": "ExternalSort"
            },
            "extRSPRO": {
              "long_name": "Replacement Selection Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Files/extRSPRO.html",
              "mod_name": "ExternalSort",
              "threshold": 1.0
            }
          },
          "Multiway Merging": {
            "extMultiMergeCON": {
              "long_name": "Multiway Merge Example Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Files/extsortCON.css"
              ],
              "scripts": [
                "DataStructures/binaryheap.js",
                "AV/Files/extMultiMergeCON.js"
              ],
              "mod_name": "ExternalSort"
            },
            "extMultiMergePRO": {
              "long_name": "Multi-way Merge Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Files/extMultiMergePRO.html",
              "mod_name": "ExternalSort",
              "threshold": 0.9
            }
          }
        }
      }
    },
    "Hashing": {
      "Hashing/HashIntro": {
        "long_name": "Introduction",
        "sections": {
          "Introduction": {
            "hashIntroCON": {
              "long_name": "Hashing Intro Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/hashIntroCON.css"
              ],
              "scripts": [
                "AV/Hashing/hashIntroCON.js"
              ],
              "mod_name": "HashIntro"
            }
          }
        }
      },
      "Hashing/HashFunc": {
        "long_name": "Hash Function Principles",
        "sections": {
          "Hash Function Principles": {
            "Birthday": {
              "long_name": "Birthday Problem Calculator",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Hashing/Birthday.html",
              "mod_name": "HashFunc",
              "threshold": 1
            },
            "BirthdayFIB": {
              "long_name": "Birthday Problem Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/BirthdayFIB.html",
              "mod_name": "HashFunc",
              "threshold": 3
            }
          }
        }
      },
      "Hashing/HashFuncExamp": {
        "long_name": "Sample Hash Functions",
        "sections": {
          "Sample Hash Functions": {
            "hashFuncExCON1": {
              "long_name": "Hash Function Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Hashing/hashFuncExCON1.js"
              ],
              "mod_name": "HashFuncExamp"
            },
            "hashFuncExCON2": {
              "long_name": "Hash Function Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Hashing/hashFuncExCON2.js"
              ],
              "mod_name": "HashFuncExamp"
            },
            "MidSquare": {
              "long_name": "Mid-Square Calculator",
              "required": true,
              "points": 0.5,
              "type": "pe",
              "av_address": "AV/Hashing/MidSquare.html",
              "mod_name": "HashFuncExamp",
              "threshold": 1.0
            }
          },
          "A Simple Hash Function for Strings": {
            "StringSimple": {
              "long_name": "Simple String Folding Calculator",
              "required": true,
              "points": 0.5,
              "type": "pe",
              "av_address": "AV/Hashing/StringSimple.html",
              "mod_name": "HashFuncExamp",
              "threshold": 1.0
            }
          },
          "String Folding": {
            "StringSfold": {
              "long_name": "Improved String Folding Calculator",
              "required": true,
              "points": 0.5,
              "type": "pe",
              "av_address": "AV/Hashing/StringSfold.html",
              "mod_name": "HashFuncExamp",
              "threshold": 1.0
            }
          },
          "Hash Function Practice": {
            "HashFuncFIBSumm": {
              "long_name": "Hash Function Pick Slot Summary",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashFuncFIBSumm.html",
              "mod_name": "HashFuncExamp",
              "threshold": 5
            }
          },
          "Hash Function Review Questions": {
            "HashFuncSumm": {
              "long_name": "Hash Function Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashFuncSumm.html",
              "mod_name": "HashFuncExamp",
              "threshold": 5
            }
          }
        }
      },
      "Hashing/OpenHash": {
        "long_name": "Open Hashing",
        "sections": {
          "Open Hashing": {
            "openhashCON": {
              "type": "dgm",
              "mod_name": "OpenHash"
            },
            "OpenHashPRO": {
              "long_name": "Open Hashing Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/OpenHashPRO.html",
              "mod_name": "OpenHash",
              "threshold": 5
            }
          }
        }
      },
      "Hashing/BucketHash": {
        "long_name": "Bucket Hashing",
        "sections": {
          "Bucket Hashing": {
            "buckethashCON1": {
              "long_name": "Bucket Hashing Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/buckethashCON.css"
              ],
              "scripts": [
                "AV/Hashing/buckethashCON1.js"
              ],
              "mod_name": "BucketHash"
            },
            "HashBucketPRO": {
              "long_name": "Bucket Hashing Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashBucketPRO.html",
              "mod_name": "BucketHash",
              "threshold": 5
            }
          },
          "An Alternate Approach": {
            "buckethashCON2": {
              "long_name": "Bucket Hashing Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/buckethashCON.css"
              ],
              "scripts": [
                "AV/Hashing/buckethashCON2.js"
              ],
              "mod_name": "BucketHash"
            },
            "HashBucket2PRO": {
              "long_name": "Alternate Bucket Hashing Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashBucket2PRO.html",
              "mod_name": "BucketHash",
              "threshold": 5
            }
          }
        }
      },
      "Hashing/HashCSimple": {
        "long_name": "Collision Resolution",
        "sections": {
          "Collision Resolution": {
            "linProbeCON1": {
              "long_name": "Linear Probing Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/linProbeCON.css"
              ],
              "scripts": [
                "AV/Hashing/linProbeCON1.js"
              ],
              "mod_name": "HashCSimple"
            },
            "linProbeCON2": {
              "long_name": "Linear Probing Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/linProbeCON.css"
              ],
              "scripts": [
                "AV/Hashing/linProbeCON2.js"
              ],
              "mod_name": "HashCSimple"
            },
            "HashLinearPPRO": {
              "long_name": "Linear Probing Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashLinearPPRO.html",
              "mod_name": "HashCSimple",
              "threshold": 5
            }
          }
        }
      },
      "Hashing/HashCImproved": {
        "long_name": "Improved Collision Resolution",
        "sections": {
          "Linear Probing by Steps": {
            "collisionCON1": {
              "long_name": "Linear Probing By Steps Slideshow 1",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON1.js"
              ],
              "mod_name": "HashCImproved"
            },
            "collisionCON2": {
              "long_name": "Linear Probing By Steps Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON2.js"
              ],
              "mod_name": "HashCImproved"
            },
            "HashLinearStepPPRO": {
              "long_name": "Linear Probing By Steps Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashLinearStepPPRO.html",
              "mod_name": "HashCImproved",
              "threshold": 5
            }
          },
          "Pseudo-Random Probing": {
            "collisionCON3": {
              "long_name": "Pseudo-Random Probing Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON3.js"
              ],
              "mod_name": "HashCImproved"
            },
            "HashPseudoRandomPPRO": {
              "long_name": "Pseudo-Random Probing Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashPseudoRandomPPRO.html",
              "mod_name": "HashCImproved",
              "threshold": 5
            },
            "collisionCON4": {
              "long_name": "Avoiding the Train",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON4.js"
              ],
              "mod_name": "HashCImproved"
            }
          },
          "Quadratic Probing": {
            "collisionCON5": {
              "long_name": "Quadratic Probing Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON5.js"
              ],
              "mod_name": "HashCImproved"
            },
            "HashQuadraticPPRO": {
              "long_name": "Quadratic Probing Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashQuadraticPPRO.html",
              "mod_name": "HashCImproved",
              "threshold": 5
            },
            "collisionCON6": {
              "long_name": "Quadratic Probing Problem",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON6.js"
              ],
              "mod_name": "HashCImproved"
            }
          },
          "Double Hashing": {
            "collisionCON7": {
              "long_name": "Double Hashing Slideshow 2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON7.js"
              ],
              "mod_name": "HashCImproved"
            },
            "collisionCON8": {
              "long_name": "Double Hashing Slideshow 3",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Hashing/collisionCON.css"
              ],
              "scripts": [
                "AV/Hashing/collisionCON8.js"
              ],
              "mod_name": "HashCImproved"
            },
            "HashDoublePPRO": {
              "long_name": "Double Hashing Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashDoublePPRO.html",
              "mod_name": "HashCImproved",
              "threshold": 5
            }
          }
        }
      },
      "Hashing/HashAnal": {
        "long_name": "Analysis of Closed Hashing",
        "sections": {
          "Analysis of Closed Hashing": {
            "HashAnalSumm": {
              "long_name": "Analysis of Closed Hashing Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashAnalSumm.html",
              "mod_name": "HashAnal",
              "threshold": 5
            }
          }
        }
      },
      "Hashing/HashDel": {
        "long_name": "Deletion",
        "sections": {
          "Deletion": {
            "hashdelCON": {
              "long_name": "Hash Deletion Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/Hashing/hashdelCON.js"
              ],
              "mod_name": "HashDel"
            },
            "HashingDelPRO": {
              "long_name": "Hash Deletion Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Hashing/HashingDelPRO.html",
              "mod_name": "HashDel",
              "threshold": 0.9
            }
          },
          "Hashing Deletion Summary Questions": {
            "HashDelSumm": {
              "long_name": "Hash Deletion Summary Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashDelSumm.html",
              "mod_name": "HashDel",
              "threshold": 3
            }
          }
        }
      },
      "Hashing/HashSumm": {
        "long_name": "Hashing Chapter Summary Exercises",
        "sections": {
          "Hashing Review": {
            "HashChapterSumm": {
              "long_name": "Hashing Chapter Summary Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Hashing/HashChapterSumm.html",
              "mod_name": "HashSumm",
              "threshold": 10
            }
          }
        }
      }
    },
    "Memory Management": {
      "MemManage/MemmanIntro": {
        "long_name": "Chapter Introduction: Memory Management",
        "sections": {}
      },
      "MemManage/Dynamic": {
        "long_name": "Dynamic Storage Allocation",
        "sections": {
          "Dynamic Storage Allocation": {
            "freeblocklistCON": {
              "type": "dgm",
              "mod_name": "Dynamic"
            },
            "fragCON": {
              "type": "dgm",
              "mod_name": "Dynamic"
            }
          }
        }
      },
      "MemManage/SequentialFit": {
        "long_name": "Sequential-Fit Methods",
        "sections": {
          "Sequential-Fit Methods": {
            "seqFitCON": {
              "type": "dgm",
              "mod_name": "SequentialFit"
            }
          }
        }
      },
      "MemManage/FirstFit": {
        "long_name": "First Fit",
        "sections": {
          "First Fit": {
            "firstFitAV": {
              "long_name": "First Fit Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/MemManage/firstFitAV.html",
              "mod_name": "FirstFit",
              "threshold": 1
            },
            "firstFitPRO": {
              "long_name": "First Fit Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/MemManage/firstFitPRO.html",
              "mod_name": "FirstFit",
              "threshold": 0.9
            }
          }
        }
      },
      "MemManage/CircularFit": {
        "long_name": "Circular First Fit",
        "sections": {
          "Circular First Fit": {
            "firstFitAV": {
              "long_name": "Circular First Fit Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/MemManage/firstFitAV.html",
              "mod_name": "CircularFit",
              "threshold": 1
            }
          }
        }
      },
      "MemManage/BestFit": {
        "long_name": "Best Fit",
        "sections": {
          "Best Fit": {
            "firstFitAV": {
              "long_name": "Best Fit Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/MemManage/firstFitAV.html",
              "mod_name": "BestFit",
              "threshold": 1
            }
          }
        }
      },
      "MemManage/WorstFit": {
        "long_name": "Worst Fit",
        "sections": {
          "Worst Fit": {
            "firstFitAV": {
              "long_name": "Worst Fit Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/MemManage/firstFitAV.html",
              "mod_name": "WorstFit",
              "threshold": 1
            }
          }
        }
      },
      "MemManage/MMPerformance": {
        "long_name": "Sequential Fit Peformance",
        "sections": {
          "Sequential Fit Peformance": {
            "firstFitAV": {
              "long_name": "Sequential Fit Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/MemManage/firstFitAV.html",
              "mod_name": "MMPerformance",
              "threshold": 1
            }
          }
        }
      },
      "MemManage/Buddy": {
        "long_name": "Other Memory Allocation Methods",
        "sections": {
          "Other Memory Allocation Methods": {
            "buddyCON": {
              "type": "dgm",
              "mod_name": "Buddy"
            },
            "BuddyAV": {
              "long_name": "Buddy Method Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/MemManage/BuddyAV.html",
              "mod_name": "Buddy",
              "threshold": 1
            }
          }
        }
      },
      "MemManage/Garbage": {
        "long_name": "Failure Policies and Garbage Collection",
        "sections": {}
      }
    },
    "Indexing": {
      "Indexing/IndexIntro": {
        "long_name": "Indexing Chapter Introduction",
        "sections": {}
      },
      "Indexing/LinearIndexing": {
        "long_name": "Linear Indexing",
        "sections": {
          "Linear Indexing": {
            "varindexCON": {
              "long_name": "Simple linear index Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/linearIndexingCON.css"
              ],
              "scripts": [
                "AV/Indexing/varindexCON.js"
              ],
              "mod_name": "LinearIndexing"
            },
            "linindexCON": {
              "long_name": "Two-level linear index Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/linearIndexingCON.css"
              ],
              "scripts": [
                "AV/Indexing/linindexCON.js"
              ],
              "mod_name": "LinearIndexing"
            },
            "linearIndexingPRO": {
              "long_name": "Linear Indexing Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Indexing/linearIndexingPRO.html",
              "mod_name": "LinearIndexing",
              "threshold": 0.9
            },
            "TwoDArrCON": {
              "type": "dgm",
              "mod_name": "LinearIndexing"
            },
            "InvertedCON": {
              "type": "dgm",
              "mod_name": "LinearIndexing"
            },
            "InvListCON": {
              "type": "dgm",
              "mod_name": "LinearIndexing"
            }
          }
        }
      },
      "Indexing/ISAM": {
        "long_name": "ISAM",
        "sections": {}
      },
      "Indexing/TreeIndexing": {
        "long_name": "Tree-based Indexing",
        "sections": {
          "Tree-based Indexing": {
            "pagedBSTCON": {
              "long_name": "Paged BST Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/treeIndexingCON.css"
              ],
              "scripts": [
                "AV/Indexing/pagedBSTCON.js"
              ],
              "mod_name": "TreeIndexing"
            },
            "rebalanceBSTCON": {
              "long_name": "Paged BST With Disk Accesses Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/treeIndexingCON.css"
              ],
              "scripts": [
                "AV/Indexing/rebalanceBSTCON.js"
              ],
              "mod_name": "TreeIndexing"
            },
            "TreeIndexing": {
              "long_name": "Tree Indexing Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Indexing/TreeIndexing.html",
              "mod_name": "TreeIndexing",
              "threshold": 5
            }
          }
        }
      },
      "Indexing/TwoThreeTree": {
        "long_name": "2-3 Trees",
        "sections": {
          "2-3 Trees": {
            "twoThreedgmCON": {
              "type": "dgm",
              "mod_name": "TwoThreeTree"
            },
            "simpleInsertCON": {
              "long_name": "2-3 Tree Insert Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/twoThreeTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/twoThreeTreeCON.js",
                "AV/Indexing/simpleInsertCON.js"
              ],
              "mod_name": "TwoThreeTree"
            },
            "promoteCON": {
              "long_name": "2-3 Tree Insert Promotion Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/twoThreeTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/twoThreeTreeCON.js",
                "AV/Indexing/promoteCON.js"
              ],
              "mod_name": "TwoThreeTree"
            },
            "splitCON": {
              "long_name": "2-3 Tree Insert Split Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/twoThreeTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/twoThreeTreeCON.js",
                "AV/Indexing/splitCON.js"
              ],
              "mod_name": "TwoThreeTree"
            }
          }
        }
      },
      "Indexing/BTree": {
        "long_name": "B-Trees",
        "sections": {
          "B-Trees": {
            "BTreedgmCON": {
              "type": "dgm",
              "mod_name": "BTree"
            },
            "TTPbuildCON": {
              "long_name": "TTPbuildCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/TTPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/TTPbuildCON.js"
              ],
              "mod_name": "BTree"
            },
            "TTPfindCON": {
              "long_name": "TTPfindCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/TTPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/TTPfindCON.js"
              ],
              "mod_name": "BTree"
            },
            "TTPdeleteCON": {
              "long_name": "TTPdeleteCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/TTPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/TTPdeleteCON.js"
              ],
              "mod_name": "BTree"
            },
            "BPfindCON": {
              "long_name": "BPfindCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/BPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/BPfindCON.js"
              ],
              "mod_name": "BTree"
            },
            "BPbuildCON": {
              "long_name": "BPbuildCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/BPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/BPbuildCON.js"
              ],
              "mod_name": "BTree"
            },
            "bPlusTreeInsertPRO": {
              "long_name": "B+ Tree Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Indexing/bPlusTreeInsertPRO.html",
              "mod_name": "BTree",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous"
              }
            },
            "BPdeleteCON": {
              "long_name": "BPdeleteCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/BPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/BPdeleteCON.js"
              ],
              "mod_name": "BTree"
            },
            "BPbuild5CON": {
              "long_name": "BPbuild5CON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Indexing/BPTree.css",
                "AV/Indexing/BPTreeCON.css"
              ],
              "scripts": [
                "AV/Indexing/BPlusTreeNode.js",
                "AV/Indexing/BPlusTree.js",
                "AV/Indexing/BPbuild5CON.js"
              ],
              "mod_name": "BTree"
            }
          }
        }
      },
      "Indexing/IndexingSumm": {
        "long_name": "Indexing Summary Exercises",
        "sections": {
          "Indexing Summary": {
            "IndexChoice": {
              "long_name": "Choosing an Index",
              "required": true,
              "points": 2,
              "type": "ka",
              "av_address": "Exercises/Indexing/IndexChoice.html",
              "mod_name": "IndexingSumm",
              "threshold": 5
            }
          }
        }
      }
    },
    "General Trees": {
      "General/GenTreeIntro": {
        "long_name": "General Trees",
        "sections": {
          "General Trees": {
            "GenTreeCON": {
              "type": "dgm",
              "mod_name": "GenTreeIntro"
            },
            "GenTreePreTravCON": {
              "long_name": "General Tree Preorder Traversal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/GenTreeCON.css"
              ],
              "scripts": [
                "AV/General/GenTreePreTravCON.js"
              ],
              "mod_name": "GenTreeIntro"
            },
            "GenTreePostTravCON": {
              "long_name": "General Tree Postorder Traversal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/GenTreeCON.css"
              ],
              "scripts": [
                "AV/General/GenTreePostTravCON.js"
              ],
              "mod_name": "GenTreeIntro"
            }
          }
        }
      },
      "General/UnionFind": {
        "long_name": "Union/Find and the Parent Pointer Implementation",
        "sections": {
          "The Union/Find Problem": {
            "UFfigCON": {
              "type": "dgm",
              "mod_name": "UnionFind"
            },
            "UFconcomCON": {
              "type": "dgm",
              "mod_name": "UnionFind"
            },
            "ufCON": {
              "long_name": "Union/Find Example",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/UFCON.css"
              ],
              "scripts": [
                "AV/General/ufCON.js"
              ],
              "mod_name": "UnionFind"
            },
            "pathcompCON": {
              "long_name": "Union/Find Path Compression Example",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/UFCON.css"
              ],
              "scripts": [
                "AV/General/pathcompCON.js"
              ],
              "mod_name": "UnionFind"
            },
            "UnionFindPRO": {
              "long_name": "Union/Find Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/General/UnionFindPRO.html",
              "mod_name": "UnionFind",
              "threshold": 0.9
            }
          }
        }
      },
      "General/SequentialRep": {
        "long_name": "Sequential Tree Representations",
        "sections": {
          "Sequential Tree Representations": {
            "BinExampCON": {
              "type": "dgm",
              "mod_name": "SequentialRep"
            },
            "SequentialTreeCON": {
              "long_name": "First sequential representation Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/SequentialTreeCON.css"
              ],
              "scripts": [
                "AV/General/SequentialTreeCON.js"
              ],
              "mod_name": "SequentialRep"
            },
            "SequentialTreePRO": {
              "long_name": "First Sequential Representation Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/General/SequentialTreePRO.html",
              "mod_name": "SequentialRep",
              "threshold": 5
            }
          },
          "Alternative Sequential Representation": {
            "SequentialTreeAltCON": {
              "long_name": "Second sequential representation Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/SequentialTreeCON.css"
              ],
              "scripts": [
                "AV/General/SequentialTreeAltCON.js"
              ],
              "mod_name": "SequentialRep"
            },
            "SequentialTreeAltPRO": {
              "long_name": "Alternate Sequential Representation Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/General/SequentialTreeAltPRO.html",
              "mod_name": "SequentialRep",
              "threshold": 5
            }
          },
          "Bit Vector Representation": {
            "SequentialTreeBitsCON": {
              "long_name": "Bit vector sequential representation Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/SequentialTreeCON.css"
              ],
              "scripts": [
                "AV/General/SequentialTreeBitsCON.js"
              ],
              "mod_name": "SequentialRep"
            },
            "SequentialTreeBitVectorPRO": {
              "long_name": "Bit Vector Sequential Representation Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/General/SequentialTreeBitVectorPRO.html",
              "mod_name": "SequentialRep",
              "threshold": 5
            }
          },
          "General Tree Sequential Representation": {
            "SequentialGenTreeCON": {
              "long_name": "General Tree sequential representation Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/General/SequentialTreeCON.css"
              ],
              "scripts": [
                "AV/General/SequentialGenTreeCON.js"
              ],
              "mod_name": "SequentialRep"
            },
            "SequentialTreeGenTreePRO": {
              "long_name": "General Tree Sequential Representation Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/General/SequentialTreeGenTreePRO.html",
              "mod_name": "SequentialRep",
              "threshold": 5
            }
          }
        }
      }
    },
    "Graphs": {
      "Graph/GraphIntro": {
        "long_name": "Graphs Chapter Introduction",
        "sections": {
          "Graph Terminology and Implementation": {
            "GdirundirCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GneighborCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GpathDefCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GconcomCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GsparseDefCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GacyclicDefCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GdirRepCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GundirRepCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GweightedCON": {
              "type": "dgm",
              "mod_name": "GraphIntro"
            },
            "GspaceCalcSumm": {
              "long_name": "Graph Space Requirements Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Graph/GspaceCalcSumm.html",
              "mod_name": "GraphIntro",
              "threshold": 5
            }
          },
          "Graph Terminology Questions": {
            "GraphIntroSumm": {
              "long_name": "Graph Terminology Summary Exercise",
              "required": true,
              "points": 3.0,
              "type": "ka",
              "av_address": "Exercises/Graph/GraphIntroSumm.html",
              "mod_name": "GraphIntro",
              "threshold": 10
            }
          }
        }
      },
      "Graph/GraphImpl": {
        "long_name": "Graph Implementations",
        "sections": {}
      },
      "Graph/GraphTraversal": {
        "long_name": "Graph Traversals",
        "sections": {
          "Graph Traversals": {
            "DFSCON": {
              "long_name": "Depth-First Search Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/DFSCON.css"
              ],
              "scripts": [
                "AV/Graph/DFSCON.js"
              ],
              "mod_name": "GraphTraversal"
            },
            "DFSPE": {
              "long_name": "DFS Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Graph/DFSPE.html",
              "mod_name": "GraphTraversal",
              "threshold": 0.9
            }
          },
          "Breadth-First Search": {
            "BFSCON": {
              "long_name": "Breadth-First Search Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/BFSCON.css"
              ],
              "scripts": [
                "AV/Graph/BFSCON.js"
              ],
              "mod_name": "GraphTraversal"
            },
            "BFSAV": {
              "long_name": "BFS AV",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Graph/BFSAV.html",
              "mod_name": "GraphTraversal",
              "threshold": 1
            },
            "BFSPE": {
              "long_name": "BFS Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Graph/BFSPE.html",
              "mod_name": "GraphTraversal",
              "threshold": 0.9
            }
          }
        }
      },
      "Graph/GraphTopsort": {
        "long_name": "Topological Sort",
        "sections": {
          "Topological Sort": {
            "topSortCON": {
              "type": "dgm",
              "mod_name": "GraphTopsort"
            },
            "topSortDFSCON": {
              "long_name": "TopSort Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/topSortDFSCON.css"
              ],
              "scripts": [
                "AV/Graph/topSortDFSCON.js"
              ],
              "mod_name": "GraphTopsort"
            },
            "topSortQCON": {
              "long_name": "topSortQCON Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/topSortQCON.css"
              ],
              "scripts": [
                "AV/Graph/topSortQCON.js"
              ],
              "mod_name": "GraphTopsort"
            }
          }
        }
      },
      "Graph/GraphShortest": {
        "long_name": "Shortest-Paths Problems",
        "sections": {
          "Shortest-Paths Problems": {
            "DistanceExampCON": {
              "type": "dgm",
              "mod_name": "GraphShortest"
            },
            "DijkstraCON": {
              "long_name": "Dijkstra Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/DijkstraCON.css"
              ],
              "scripts": [
                "AV/Graph/DijkstraCON.js"
              ],
              "mod_name": "GraphShortest"
            },
            "DijkstraPE": {
              "long_name": "Dijkstra's Algorithm Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Graph/DijkstraPE.html",
              "mod_name": "GraphShortest",
              "threshold": 0.9
            }
          }
        }
      },
      "Graph/MCST": {
        "long_name": "Minimal Cost Spanning Trees",
        "sections": {
          "Minimal Cost Spanning Trees": {
            "MCSTCON": {
              "type": "dgm",
              "mod_name": "MCST"
            },
            "primCON": {
              "long_name": "Prim's Minimum Cost Spanning Tree Algorithm Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/primCON.css"
              ],
              "scripts": [
                "AV/Graph/primCON.js"
              ],
              "mod_name": "MCST"
            },
            "PrimPE": {
              "long_name": "Prim's Algorithm Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Graph/PrimPE.html",
              "mod_name": "MCST",
              "threshold": 0.9
            }
          }
        }
      },
      "Graph/Kruskal": {
        "long_name": "Kruskal's Algorithm",
        "sections": {
          "Kruskal's Algorithm": {
            "kruskalCON": {
              "long_name": "Kruskal Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/kruskalCON.css"
              ],
              "scripts": [
                "AV/Graph/kruskalCON.js"
              ],
              "mod_name": "Kruskal"
            },
            "KruskalPE": {
              "long_name": "Kruskal's Algorithm Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/Graph/KruskalPE.html",
              "mod_name": "Kruskal",
              "threshold": 0.9
            }
          }
        }
      },
      "Graph/Floyd": {
        "long_name": "All-Pairs Shortest Paths",
        "sections": {}
      }
    },
    "Spatial Data Structures": {
      "Spatial/Spatial": {
        "long_name": "Spatial Data Structures",
        "sections": {
          "Spatial Data Structures": {}
        }
      },
      "Spatial/PRquadtree": {
        "long_name": "The PR Quadtree",
        "sections": {
          "The PR Quadtree": {
            "PRquadtreeAV": {
              "long_name": "PRquadtreeAV",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Spatial/PRquadtreeAV.html",
              "mod_name": "PRquadtree",
              "threshold": 1
            },
            "PRquadtree2ptAV": {
              "long_name": "PRquadtree2ptAV",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Spatial/PRquadtree2ptAV.html",
              "mod_name": "PRquadtree",
              "threshold": 1
            },
            "PRquadtreeInter": {
              "long_name": "PRquadtreeInter",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Spatial/PRquadtreeInter.html",
              "mod_name": "PRquadtree",
              "threshold": 1
            }
          }
        }
      },
      "Spatial/KDtree": {
        "long_name": "KD Trees",
        "sections": {
          "KD Trees": {
            "kd-treeAV": {
              "long_name": "kd-treeAV",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/kd-treeAV.html",
              "mod_name": "KDtree",
              "threshold": 1
            }
          }
        }
      },
      "Spatial/Bintree": {
        "long_name": "The Bintree",
        "sections": {
          "The Bintree": {
            "bintreeCON": {
              "type": "dgm",
              "mod_name": "Bintree"
            },
            "BintreeAV": {
              "long_name": "BintreeAV",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Spatial/BintreeAV.html",
              "mod_name": "Bintree",
              "threshold": 1
            },
            "BintreeInter": {
              "long_name": "BintreeInter",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Spatial/BintreeInter.html",
              "mod_name": "Bintree",
              "threshold": 1
            }
          }
        }
      },
      "Spatial/OtherSpatial": {
        "long_name": "Other Spatial Data Structures",
        "sections": {}
      }
    },
    "Senior Algorithms Course": {
      "SeniorAlgAnal/AAIntro": {
        "long_name": "Data and Algorithm Analysis",
        "sections": {
          "Introduction": {}
        }
      },
      "SeniorAlgAnal/ProblemSolving": {
        "long_name": "An Introduction to Problem Solving",
        "sections": {
          "An Introduction to Problem Solving": {}
        }
      },
      "SeniorAlgAnal/AAOverview": {
        "long_name": "Semester Overview",
        "sections": {
          "Semester Overview": {}
        }
      },
      "SeniorAlgAnal/TOH": {
        "long_name": "Introduction to Analyzing a Problem",
        "sections": {
          "Towers of Hanoi": {
            "TOHfigCON": {
              "type": "dgm",
              "mod_name": "TOH"
            }
          }
        }
      },
      "SeniorAlgAnal/BoundsReview": {
        "long_name": "Bounds Review",
        "sections": {
          "Bounds Review": {
            "SimpleCostsCON": {
              "type": "dgm",
              "mod_name": "BoundsReview"
            }
          }
        }
      },
      "SeniorAlgAnal/GrowthRate": {
        "long_name": "Growth Rates Review",
        "sections": {
          "Growth Rates Review": {}
        }
      },
      "SeniorAlgAnal/AdvSumm": {
        "long_name": "Summation Techniques",
        "sections": {}
      },
      "SeniorAlgAnal/Recurrence": {
        "long_name": "Solving Recurrence Relations",
        "sections": {
          "Solving Recurrence Relations": {
            "ExpandRecurrenceCON": {
              "long_name": "Divide-and-Conquer Expansion Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV//SeniorAlgAnal/ExpandRecurrenceCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/ExpandRecurrenceCON.js"
              ],
              "mod_name": "Recurrence"
            },
            "DandCRecurrenceCON": {
              "long_name": "Divide-and-Conquer Expansion Slideshow2",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/DandCRecurrenceCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/DandCRecurrenceCON.js"
              ],
              "mod_name": "Recurrence"
            }
          }
        }
      }
    },
    "Searching": {
      "Searching/SearchIntro": {
        "long_name": "Chapter Introduction: Search",
        "sections": {}
      },
      "Searching/UnsortedSearch": {
        "long_name": "Analyzing Search in Unsorted Lists",
        "sections": {
          "Analyzing Search in Unsorted Lists": {
            "PosetCON": {
              "long_name": "PosetCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/PosetCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/PosetCON.js"
              ],
              "mod_name": "UnsortedSearch"
            }
          }
        }
      },
      "Searching/SortedSearch": {
        "long_name": "Search in Sorted Arrays",
        "sections": {
          "Analysis": {
            "binarySearchCON": {
              "long_name": "binarySearchCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Searching/binarySearchCON.css"
              ],
              "scripts": [
                "AV/Searching/binarySearchCON.js"
              ],
              "mod_name": "SortedSearch"
            }
          }
        }
      },
      "Searching/SelfOrg": {
        "long_name": "Self-Organizing Lists",
        "sections": {
          "Introduction": {
            "SelforgCON1": {
              "long_name": "Self-organizing List Slideshow: Frequency Count",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Searching/selforgCON.css"
              ],
              "scripts": [
                "AV/Searching/selforgCON.js"
              ],
              "mod_name": "SelfOrg"
            },
            "SelfOrgCounterPRO": {
              "long_name": "Self-organizing List Counter Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Searching/SelfOrgCounterPRO.html",
              "mod_name": "SelfOrg",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            }
          },
          "Move to Front": {
            "SelforgCON2": {
              "long_name": "Self-organizing List Slideshow: Move-to-front",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Searching/selforgCON.css"
              ],
              "scripts": [
                "AV/Searching/selforgCON.js"
              ],
              "mod_name": "SelfOrg"
            },
            "SelfOrgM2FPRO": {
              "long_name": "Self-organizing List Move-to-front Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Searching/SelfOrgM2FPRO.html",
              "mod_name": "SelfOrg",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            }
          },
          "Transpose": {
            "SelforgCON3": {
              "long_name": "Self-organizing List Slideshow: Transpose",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Searching/selforgCON.css"
              ],
              "scripts": [
                "AV/Searching/selforgCON.js"
              ],
              "mod_name": "SelfOrg"
            },
            "SelfOrgTransposePRO": {
              "long_name": "Self-organizing List Transpose Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Searching/SelfOrgTransposePRO.html",
              "mod_name": "SelfOrg",
              "threshold": 0.9,
              "exer_options": {
                "JXOP-feedback": "continuous",
                "JXOP-fixmode": "fix"
              }
            }
          }
        }
      },
      "Development/SetSearch": {
        "long_name": "Bit Vectors for Representing Sets",
        "sections": {}
      },
      "Development/PerfectHash": {
        "long_name": "Perfect Hashing",
        "sections": {
          "Perfect Hashing": {
            "perfectHashAV": {
              "long_name": "Perfect Hashing Visualization",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/perfectHashAV.html",
              "mod_name": "PerfectHash",
              "threshold": 1
            }
          }
        }
      }
    },
    "Lower Bounds": {
      "Bounds/BoundMax": {
        "long_name": "Finding the Maximum Value",
        "sections": {
          "Finding the Maximum Value": {}
        }
      },
      "Bounds/BoundAdversary": {
        "long_name": "Adversarial Lower Bounds Proofs",
        "sections": {}
      },
      "Bounds/BoundState": {
        "long_name": "State Space Lower Bounds Proofs",
        "sections": {}
      },
      "Bounds/BoundiBest": {
        "long_name": "Finding the i th Best Element",
        "sections": {}
      },
      "Bounds/SortingOptimal": {
        "long_name": "Optimal Sorting",
        "sections": {}
      }
    },
    "Number Problems": {
      "SeniorAlgAnal/Numeric": {
        "long_name": "Number Problems",
        "sections": {
          "Number Problems": {}
        }
      },
      "SeniorAlgAnal/Transform": {
        "long_name": "The Transformation Concept",
        "sections": {
          "The Transformation Concept: Integer Multiplication": {},
          "Polynomial Multiplication": {
            "polynomialCON": {
              "long_name": "fft slideshow 1 polynomial",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/polynomialCON.css"
              ],
              "scripts": [
                "DataStructures/Plot.js",
                "AV/SeniorAlgAnal/polynomialCON.js"
              ],
              "mod_name": "Transform"
            },
            "EvalandInterpolationCON": {
              "long_name": "fft slideshow 2 evaluation and interpolation",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/EvalandInterpolationCON.css"
              ],
              "scripts": [
                "DataStructures/Plot.js",
                "AV/SeniorAlgAnal/EvalandInterpolationCON.js"
              ],
              "mod_name": "Transform"
            },
            "ProductCON": {
              "long_name": "fft slideshow 3 polynomial product",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/ProductCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/ProductCON.js"
              ],
              "mod_name": "Transform"
            },
            "EvaluationCON": {
              "long_name": "fft slideshow 4 evaluation of polynomial product",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/EvaluationCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/EvaluationCON.js"
              ],
              "mod_name": "Transform"
            },
            "Polynomial_multiplication": {
              "long_name": "Polynomial_multiplication",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/SeniorAlgAnal/Polynomial_multiplication.html",
              "mod_name": "Transform",
              "threshold": 5
            }
          }
        }
      },
      "SeniorAlgAnal/FFT": {
        "long_name": "The Fast Fourier Transform",
        "sections": {
          "The Fast Fourier Transform": {
            "EvenOddCON": {
              "long_name": "fft slideshow 1 even and odd polynomials",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/EvenOddCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/EvenOddCON.js"
              ],
              "mod_name": "FFT"
            },
            "fftCON": {
              "type": "dgm",
              "mod_name": "FFT"
            },
            "Nth_root": {
              "long_name": "Nth_root",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/SeniorAlgAnal/Nth_root.html",
              "mod_name": "FFT",
              "threshold": 5
            },
            "arrayCON": {
              "type": "dgm",
              "mod_name": "FFT"
            },
            "DFTmatrixCON": {
              "long_name": "fft slideshow 4 DFT matrix",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/DFTmatrixCON.css"
              ],
              "scripts": [
                "DataStructures/Plot.js",
                "AV/SeniorAlgAnal/DFTmatrixCON.js"
              ],
              "mod_name": "FFT"
            },
            "DFTpropCON": {
              "long_name": "DFT matrix properties",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/DFTpropCON.css"
              ],
              "scripts": [
                "AV/SeniorAlgAnal/DFTpropCON.js"
              ],
              "mod_name": "FFT"
            },
            "FFTprocedureCON": {
              "long_name": "fft slideshow 6 FFT procedure",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/SeniorAlgAnal/FFTprocedureCON.css",
                "AV/SeniorAlgAnal/FFTprocedureCON.json"
              ],
              "scripts": [
                "lib/complex.js",
                "AV/SeniorAlgAnal/FFTprocedureCON.js"
              ],
              "mod_name": "FFT"
            },
            "FFTAlg": {
              "long_name": "FFTAlg",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/SeniorAlgAnal/FFTAlg.html",
              "mod_name": "FFT",
              "threshold": 5
            }
          }
        }
      }
    },
    "Probabilistic Algorithms": {
      "SeniorAlgAnal/Probabilistic": {
        "long_name": "Introduction to Probabilistic Algorithms",
        "sections": {
          "Probabilistic Algorithms": {}
        }
      },
      "SeniorAlgAnal/Primes": {
        "long_name": "Finding Prime Numbers",
        "sections": {}
      },
      "SeniorAlgAnal/RandomNums": {
        "long_name": "Random Numbers",
        "sections": {
          "Random Numbers": {}
        }
      },
      "SearchStruct/SkipList": {
        "long_name": "Skip Lists",
        "sections": {
          "Skip Lists": {
            "SkipListIntroCON": {
              "long_name": "SkipListIntroCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/SkipList.css",
                "AV/SearchStruct/SkipListIntroCON.css"
              ],
              "scripts": [
                "DataStructures/SkipList.js",
                "AV/SearchStruct/SkipListIntroCON.js"
              ],
              "mod_name": "SkipList"
            },
            "SkipListInsertCON": {
              "long_name": "SkipListInsertCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/SkipList.css",
                "AV/SearchStruct/SkipListInsertCON.css"
              ],
              "scripts": [
                "DataStructures/SkipList.js",
                "AV/SearchStruct/SkipListInsertCON.js"
              ],
              "mod_name": "SkipList"
            },
            "SkipListRmvCON": {
              "long_name": "SkipListRmvCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "DataStructures/SkipList.css",
                "AV/SearchStruct/SkipListRmvCON.css"
              ],
              "scripts": [
                "DataStructures/SkipList.js",
                "AV/SearchStruct/SkipListRmvCON.js"
              ],
              "mod_name": "SkipList"
            }
          }
        }
      }
    },
    "Search Structures": {
      "SearchStruct/BalancedTree": {
        "long_name": "Balanced Trees",
        "sections": {}
      },
      "SearchStruct/AVL": {
        "long_name": "The AVL Tree",
        "sections": {}
      },
      "SearchStruct/Splay": {
        "long_name": "The Splay Tree",
        "sections": {}
      },
      "SearchStruct/RedBlack": {
        "long_name": "The Red-Black Tree",
        "sections": {
          "Exercise 1": {
            "redBlackTreeColoring": {
              "long_name": "Red-Black Tree Coloring Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Development/redBlackTreeColoring.html",
              "mod_name": "RedBlack",
              "threshold": 0.9
            }
          },
          "Exercise 2": {
            "redBlackTreePRO": {
              "long_name": "Red-Black Tree Proficiency Exercise",
              "required": true,
              "points": 1.0,
              "type": "pe",
              "av_address": "AV/Development/redBlackTreePRO.html",
              "mod_name": "RedBlack",
              "threshold": 0.9
            }
          }
        }
      }
    },
    "Miscellaneous": {
      "SearchStruct/Sparse": {
        "long_name": "The Sparse Matrix",
        "sections": {}
      },
      "SeniorAlgAnal/DynamicProgramming": {
        "long_name": "Dynamic Programming",
        "sections": {
          "Dynamic Programming": {},
          "Computing Fibonacci Numbers": {
            "FibTreeCON": {
              "long_name": "FibTreeCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "/AV/SeniorAlgAnal/FibTreeCON.css"
              ],
              "scripts": [
                "/AV/SeniorAlgAnal/FibTreeCON.js"
              ],
              "mod_name": "DynamicProgramming"
            },
            "FibGraphCON": {
              "type": "dgm",
              "mod_name": "DynamicProgramming"
            }
          },
          "The Knapsack Problem": {
            "KnapGraphCON": {
              "type": "dgm",
              "mod_name": "DynamicProgramming"
            }
          },
          "Chained Matrix Multiplication": {
            "MatMulCON": {
              "long_name": "MatMulCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "/AV/SeniorAlgAnal/MatMulCON.css"
              ],
              "scripts": [
                "/AV/SeniorAlgAnal/MatMulCON.js"
              ],
              "mod_name": "DynamicProgramming"
            }
          }
        }
      },
      "SeniorAlgAnal/AmortAnal": {
        "long_name": "Amortized Analysis",
        "sections": {}
      },
      "Development/Knapsack": {
        "long_name": "0/1 Knapsack Problem",
        "sections": {
          "0/1 Knapsack Problem": {
            "sackCallTree": {
              "long_name": "Knapsack Call Tree",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/sackCallTree.html",
              "mod_name": "Knapsack",
              "threshold": 1
            },
            "sackTreePluck": {
              "long_name": "Knapsack Call Tree Pluck",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/sackTreePluck.html",
              "mod_name": "Knapsack",
              "threshold": 1
            },
            "sackTraceBack": {
              "long_name": "Knapsack Tree Reduction",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/sackTraceBack.html",
              "mod_name": "Knapsack",
              "threshold": 1
            },
            "knapsackSelect": {
              "long_name": "Knapsack Select",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/knapsackSelect.html",
              "mod_name": "Knapsack",
              "threshold": 5
            }
          },
          "Exercise 2": {
            "knapsackFillRow": {
              "long_name": "Knapsack Fill Row",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/knapsackFillRow.html",
              "mod_name": "Knapsack",
              "threshold": 5
            }
          },
          "Exercise 3": {
            "knapsackSolution": {
              "long_name": "Knapsack Solution",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/knapsackSolution.html",
              "mod_name": "Knapsack",
              "threshold": 5
            }
          },
          "Exercise 4": {
            "sackProficiency": {
              "long_name": "Knapsack Proficiency",
              "required": true,
              "points": 1,
              "type": "pe",
              "av_address": "AV/Development/sackProficiency.html",
              "mod_name": "Knapsack",
              "threshold": 0.9
            }
          }
        }
      },
      "Development/EditDistance": {
        "long_name": "Edit Distance",
        "sections": {
          "Edit Distance": {
            "editRCT": {
              "long_name": "Edit RCT",
              "required": false,
              "points": 1,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/editRCT.html",
              "mod_name": "EditDistance",
              "threshold": 0.9
            },
            "editPrune": {
              "long_name": "Edit Prune",
              "required": false,
              "points": 1,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/editPrune.html",
              "mod_name": "EditDistance",
              "threshold": 0.9
            },
            "editOptimal": {
              "long_name": "Edit Optimal",
              "required": false,
              "points": 1,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/editOptimal.html",
              "mod_name": "EditDistance",
              "threshold": 0.9
            }
          },
          "Exercise 1": {
            "edit-KA1": {
              "long_name": "Edit KA1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/edit-KA1.html",
              "mod_name": "EditDistance",
              "threshold": 5
            }
          },
          "Exercise 2": {
            "edit-KA2": {
              "long_name": "Edit KA2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/edit-KA2.html",
              "mod_name": "EditDistance",
              "threshold": 5
            }
          }
        }
      },
      "Development/StringSearchKMP": {
        "long_name": "KMP String Search Algorithm",
        "sections": {
          "KMP String Search Algorithm": {
            "KMP_Slideshow": {
              "long_name": "KMP_Slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/KMP_Slideshow.html",
              "mod_name": "StringSearchKMP",
              "threshold": 1
            },
            "KMP_Exercise": {
              "long_name": "KMP_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/KMP_Exercise.html",
              "mod_name": "StringSearchKMP",
              "threshold": 5
            },
            "KMP_align_array_slideshow": {
              "long_name": "KMP_align_array_slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/KMP_align_array_slideshow.html",
              "mod_name": "StringSearchKMP",
              "threshold": 1
            },
            "KMP_Alignment_Array_Exercise": {
              "long_name": "KMP_Alignment_Array_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/KMP_Alignment_Array_Exercise.html",
              "mod_name": "StringSearchKMP",
              "threshold": 5
            },
            "KMP_Compares_Shifts_Exercise": {
              "long_name": "KMP_Compares_Shifts_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/KMP_Compares_Shifts_Exercise.html",
              "mod_name": "StringSearchKMP",
              "threshold": 5
            },
            "KMP_Users_Choice": {
              "long_name": "KMP_Users_Choice",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/KMP_Users_Choice.html",
              "mod_name": "StringSearchKMP",
              "threshold": 5
            }
          }
        }
      },
      "Development/StringSearchBoyerMoore": {
        "long_name": "Boyer-Moore String Search Algorithm",
        "sections": {
          "Boyer-Moore String Search Algorithm": {
            "Boyer_Moore_Algorithm_Slideshow": {
              "long_name": "Boyer_Moore_Algorithm_Slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/Boyer_Moore_Algorithm_Slideshow.html",
              "mod_name": "StringSearchBoyerMoore",
              "threshold": 1
            },
            "Boyer_Moore_MMC_Slideshow": {
              "long_name": "Boyer_Moore_MMC_Slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/Boyer_Moore_MMC_Slideshow.html",
              "mod_name": "StringSearchBoyerMoore",
              "threshold": 1
            },
            "Boyer_Moore_Align_Table_Slideshow": {
              "long_name": "Boyer_Moore_Align_Table_Slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/Boyer_Moore_Align_Table_Slideshow.html",
              "mod_name": "StringSearchBoyerMoore",
              "threshold": 1
            },
            "Boyer_Moore_Next_Step_Exercise": {
              "long_name": "Boyer_Moore_Next_Step_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/Boyer_Moore_Next_Step_Exercise.html",
              "mod_name": "StringSearchBoyerMoore",
              "threshold": 5
            },
            "Boyer_Moore_MMC_Exercise": {
              "long_name": "Boyer_Moore_MMC_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/Boyer_Moore_MMC_Exercise.html",
              "mod_name": "StringSearchBoyerMoore",
              "threshold": 5
            },
            "Boyer_Moore_Alignment_Exercise": {
              "long_name": "Boyer_Moore_Alignment_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/Boyer_Moore_Alignment_Exercise.html",
              "mod_name": "StringSearchBoyerMoore",
              "threshold": 5
            }
          }
        }
      },
      "Development/StringSearchRabinKarp": {
        "long_name": "Rabin-Karp String Search Algorithm [Draft]",
        "sections": {
          "Rabin-Karp String Search Algorithm [Draft]": {
            "Rabin_Karp_Horner_Slideshow": {
              "long_name": "Rabin_Karp_Horner_Slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/Rabin_Karp_Horner_Slideshow.html",
              "mod_name": "StringSearchRabinKarp",
              "threshold": 1
            },
            "Rabin_Karp_Horners_Exercise": {
              "long_name": "Rabin_Karp_Horners_Exercise",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/Rabin_Karp_Horners_Exercise.html",
              "mod_name": "StringSearchRabinKarp",
              "threshold": 5
            },
            "Rabin_Karp_Algorithm_Slideshow": {
              "long_name": "Rabin_Karp_Algorithm_Slideshow",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/Development/StringMatch/Rabin_Karp_Algorithm_Slideshow.html",
              "mod_name": "StringSearchRabinKarp",
              "threshold": 1
            },
            "Rabin_Karp_Next_Step": {
              "long_name": "Rabin_Karp_Next_Step",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Development/StringMatch/Rabin_Karp_Next_Step.html",
              "mod_name": "StringSearchRabinKarp",
              "threshold": 5
            }
          }
        }
      },
      "Development/GenTreeImplement": {
        "long_name": "General Tree Implementations",
        "sections": {
          "General Tree Implementations": {}
        }
      },
      "Development/Kary": {
        "long_name": "K-ary Tree Implementations",
        "sections": {
          "K-ary Tree Implementations": {}
        }
      }
    },
    "Limits to Computing": {
      "NP/LimComp": {
        "long_name": "Limits to Computing",
        "sections": {
          "Limits to Computing": {}
        }
      },
      "NP/Reduction": {
        "long_name": "Reductions",
        "sections": {
          "Reductions": {
            "SortingProblemCON": {
              "long_name": "Sorting Problem",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/SortingProblemCON.css"
              ],
              "scripts": [
                "AV/NP/SortingProblemCON.js"
              ],
              "mod_name": "Reduction"
            },
            "pairToSortCON": {
              "long_name": "Pair to Sorting Reduction Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/pairToSortCON.css"
              ],
              "scripts": [
                "AV/NP/pairToSortCON.js"
              ],
              "mod_name": "Reduction"
            },
            "sortToPairCON": {
              "long_name": "Sorting to Pairing Reduction Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/sortToPairCON.css"
              ],
              "scripts": [
                "AV/NP/sortToPairCON.js"
              ],
              "mod_name": "Reduction"
            },
            "matrixMulCON": {
              "long_name": "Matrix Multiplication",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/matrixMulCON.css"
              ],
              "scripts": [
                "AV/NP/matrixMulCON.js"
              ],
              "mod_name": "Reduction"
            },
            "ReduceSimpPCON": {
              "type": "dgm",
              "mod_name": "Reduction"
            }
          }
        }
      },
      "NP/NPComplete": {
        "long_name": "NP-Completeness",
        "sections": {
          "NP-Completeness": {
            "SalesCON": {
              "type": "dgm",
              "mod_name": "NPComplete"
            },
            "cliqueCON": {
              "long_name": "Clique Problem",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/cliqueCON.css"
              ],
              "scripts": [
                "AV/NP/cliqueCON.js"
              ],
              "mod_name": "NPComplete"
            },
            "ComplexCON": {
              "type": "dgm",
              "mod_name": "NPComplete"
            }
          }
        }
      },
      "NP/circuitSAT": {
        "long_name": "Circuit Satisfiability",
        "sections": {
          "Circuit Satisfiability": {
            "circuitSATCON": {
              "long_name": "Circuit Satisfiability",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/circuitSATCON.css"
              ],
              "scripts": [
                "AV/NP/circuit.js",
                "AV/NP/circuitSATCON.js"
              ],
              "mod_name": "circuitSAT"
            }
          }
        }
      },
      "NP/SAT": {
        "long_name": "Formula Satisfiability",
        "sections": {
          "Formula Satisfiability": {
            "SATCON": {
              "long_name": "Formula Satisfiability",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV//NP/SATCON.css"
              ],
              "scripts": [
                "AV/NP/SATCON.js"
              ],
              "mod_name": "SAT"
            }
          }
        }
      },
      "NP/threeSAT": {
        "long_name": "3-CNF Satisfiability",
        "sections": {
          "3-CNF Satisfiability": {
            "threeSATCON": {
              "long_name": "3-Satisfiability",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/threeSATCON.css"
              ],
              "scripts": [
                "AV/NP/threeSATCON.js"
              ],
              "mod_name": "threeSAT"
            },
            "threeSATPRO": {
              "long_name": "Practice Exercise for 3-SAT",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/NP/threeSATPRO.html",
              "mod_name": "threeSAT",
              "threshold": 1.0
            }
          }
        }
      },
      "NP/clique": {
        "long_name": "The Clique Problem",
        "sections": {
          "The Clique Problem": {
            "cliqueCON": {
              "long_name": "Clique",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/cliqueCON.css"
              ],
              "scripts": [
                "AV/NP/cliqueCON.js"
              ],
              "mod_name": "clique"
            },
            "cliquePRO": {
              "long_name": "Practice Exercise for Clique",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/NP/cliquePRO.html",
              "mod_name": "clique",
              "threshold": 1.0
            }
          }
        }
      },
      "NP/independentSet": {
        "long_name": "The Independent Set Problem",
        "sections": {
          "Independent Set": {
            "independentSetCON": {
              "long_name": "Independent Set",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/independentSetCON.css"
              ],
              "scripts": [
                "AV/NP/independentSetCON.js"
              ],
              "mod_name": "independentSet"
            },
            "independentSetPRO": {
              "long_name": "Practice Exercise for Independent Set",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/NP/independentSetPRO.html",
              "mod_name": "independentSet",
              "threshold": 1.0
            }
          }
        }
      },
      "NP/vertexCover": {
        "long_name": "The Vertex Cover Problem",
        "sections": {
          "Vertex Cover": {
            "vertexCoverCON": {
              "long_name": "Vertex Cover",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/vertexCoverCON.css"
              ],
              "scripts": [
                "AV/NP/vertexCoverCON.js"
              ],
              "mod_name": "vertexCover"
            },
            "vertexCoverPRO": {
              "long_name": "Practice Exercise for Vertex Cover",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/NP/vertexCoverPRO.html",
              "mod_name": "vertexCover",
              "threshold": 1.0
            }
          }
        }
      },
      "NP/hamiltonianCycle": {
        "long_name": "The Hamiltonian Cycle Problem",
        "sections": {
          "Hamiltonian Cycle": {
            "hamiltonianCycleCON": {
              "long_name": "Hamiltonian Cycle",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/hamiltonianCycleCON.css"
              ],
              "scripts": [
                "AV/NP/hamiltonianCycleCON.js"
              ],
              "mod_name": "hamiltonianCycle"
            },
            "hamiltonianCycPRO": {
              "long_name": "Practice Exercise for Hamiltonian Cycle",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/NP/hamiltonianCycPRO.html",
              "mod_name": "hamiltonianCycle",
              "threshold": 1.0
            }
          }
        }
      },
      "NP/TSP": {
        "long_name": "The Traveling Salesman Problem",
        "sections": {
          "Traveling Salesman": {
            "TSPCON": {
              "long_name": "Traveling Salesman",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/TSPCON.css"
              ],
              "scripts": [
                "AV/NP/TSPCON.js"
              ],
              "mod_name": "TSP"
            },
            "TSPPRO": {
              "long_name": "Practice Exercise for Traveling Salesman Problem",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/NP/TSPPRO.html",
              "mod_name": "TSP",
              "threshold": 1.0
            }
          }
        }
      },
      "NP/provingNPC": {
        "long_name": "NP-Completeness Proofs",
        "sections": {
          "NP-Completeness Proofs": {
            "NPCProofDiagramCON": {
              "type": "dgm",
              "mod_name": "provingNPC"
            }
          }
        }
      },
      "NP/circuitSAT_to_SAT": {
        "long_name": "Reduction of Circuit SAT to SAT",
        "sections": {
          "Reduction of Circuit SAT to SAT": {
            "circuitSATtoSATCON": {
              "long_name": "Circuit SAT to SAT",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/circuitSATtoSATCON.css"
              ],
              "scripts": [
                "AV/NP/circuit.js",
                "AV/NP/circuitSATtoSATCON.js"
              ],
              "mod_name": "circuitSAT_to_SAT"
            }
          }
        }
      },
      "NP/SAT_to_threeSAT": {
        "long_name": "Reduction of SAT to 3-SAT",
        "sections": {
          "Reduction of SAT to 3-SAT": {
            "SATto3SATCON": {
              "long_name": "SATto3SATCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/SATto3SATCON.css"
              ],
              "scripts": [
                "AV/NP/SATto3SATCON.js"
              ],
              "mod_name": "SAT_to_threeSAT"
            }
          }
        }
      },
      "NP/threeSAT_to_clique": {
        "long_name": "Reduction of 3-SAT to Clique",
        "sections": {
          "Reduction of 3-SAT to Clique": {
            "threeSATtoCliqueCON": {
              "long_name": "threeSATtoCliqueCON",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/threeSATtoCliqueCON.css"
              ],
              "scripts": [
                "AV/NP/threeSATtoCliqueCON.js"
              ],
              "mod_name": "threeSAT_to_clique"
            }
          }
        }
      },
      "NP/clique_to_independentSet": {
        "long_name": "Reduction of Clique to Independent Set",
        "sections": {
          "Clique to Independent Set": {
            "cliqueToISCON": {
              "long_name": "Clique to IS Reduction",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/cliqueToISCON.css"
              ],
              "scripts": [
                "AV/NP/cliqueToISCON.js"
              ],
              "mod_name": "clique_to_independentSet"
            }
          }
        }
      },
      "NP/independentSet_to_vertexCover": {
        "long_name": "Reduction of Independent Set to Vertex Cover",
        "sections": {
          "Independent Set to Vertex Cover": {
            "IStoVCCON": {
              "long_name": "IS to VC Reduction",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/IStoVCCON.css"
              ],
              "scripts": [
                "AV/NP/IStoVCCON.js"
              ],
              "mod_name": "independentSet_to_vertexCover"
            }
          }
        }
      },
      "NP/threeSAT_to_hamiltonianCycle": {
        "long_name": "Reduction of 3-SAT to Hamiltonian Cycle",
        "sections": {
          "3-SAT to Hamiltonian Cycle": {
            "threeSATtoHCCON": {
              "long_name": "3-SAT to HC Reduction",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/threeSATtoHCCON.css"
              ],
              "scripts": [
                "AV/NP/threeSATtoHCCON.js"
              ],
              "mod_name": "threeSAT_to_hamiltonianCycle"
            }
          }
        }
      },
      "NP/hamiltonianCycle_to_TSP": {
        "long_name": "Reduction of Hamiltonian Cycle to Traveling Salesman",
        "sections": {
          "Hamiltonian Cycle to Traveling Salesman": {
            "HCtoTSPCON": {
              "long_name": "HC to TSP Reduction",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/NP/HCtoTSPCON.css"
              ],
              "scripts": [
                "AV/NP/HCtoTSPCON.js"
              ],
              "mod_name": "hamiltonianCycle_to_TSP"
            }
          }
        }
      },
      "NP/NPCoping": {
        "long_name": "Coping with NP-Complete Problems",
        "sections": {}
      },
      "SeniorAlgAnal/Impossible": {
        "long_name": "Unsolveable Problems",
        "sections": {
          "Unsolveable Problems": {
            "FuncBinCON": {
              "type": "dgm",
              "mod_name": "Impossible"
            },
            "FuncDiagCON": {
              "type": "dgm",
              "mod_name": "Impossible"
            }
          }
        }
      },
      "SeniorAlgAnal/Turing": {
        "long_name": "Turing Machines",
        "sections": {
          "Turing Machines": {
            "Turing1CON": {
              "type": "dgm",
              "mod_name": "Turing"
            },
            "Turing2CON": {
              "type": "dgm",
              "mod_name": "Turing"
            },
            "Turing3CON": {
              "type": "dgm",
              "mod_name": "Turing"
            },
            "TuringCopyCON": {
              "type": "dgm",
              "mod_name": "Turing"
            },
            "TuringShiftCON": {
              "type": "dgm",
              "mod_name": "Turing"
            }
          }
        }
      }
    },
    "Appendix": {
      "Glossary": {
        "long_name": "Glossary",
        "sections": {}
      },
      "Bibliography": {
        "long_name": "Bibliography",
        "sections": {}
      }
    }
  }
}