bplist00,_WebSubresources_WebMainResource $( _WebResourceResponse_WebResourceData^WebResourceURL_WebResourceMIMETypeO`bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthTEtag\Content-Type_Apache/2.0.54 (Fedora)_Mon, 21 Aug 2006 19:29:09 GMTUbytesUclose_Sat, 11 Nov 2006 19:06:57 GMTU15554_"ea093e-3cc2-1fc1ab40"12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13lqz   *8CHW\i !=BFZlhO= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) ) }; function isDigit (c) { return ((c >= "0") && (c <= "9")) }; function stripCharsInBag (s, bag) { var i; var returnString = ""; // Search through string's characters one by one. // If character is not in bag, append to returnString. for (i = 0; i < s.length; i++) { // Check that current character isn't whitespace. var c = s.charAt(i); if (bag.indexOf(c) == -1) returnString += c; } return returnString; }; function stripWhitespace (s) { return stripCharsInBag (s, whitespace) }; function isAlphanumeric (s) { var i; if (isEmpty(s)) if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK; else return (isAlphanumeric.arguments[1] == true); // Search through string's characters one by one // until we find a non-alphanumeric character. // When we do, return false; if we don't, return true. for (i = 0; i < s.length; i++) { // Check that current character is number or letter. var c = s.charAt(i); if (! (isLetter(c) || isDigit(c) ) ) return false; } // All characters are numbers or letters. return true; }; function setCookie(cValue, cookieID) { var NameOfCookie = cookieID; document.cookie = NameOfCookie + "=" + escape(cValue); }; function unsetCookie(cookieID) { setCookie (null, cookieID); }; function getCookie(cookieID) { var dc = document.cookie, prefix = cookieID + "=", begin = dc.indexOf("; " + prefix); if (begin == -1) { begin = dc.indexOf(prefix); if (begin != 0) return null; } else begin += 2; var end = document.cookie.indexOf(";", begin); if (end == -1) end = dc.length; return unescape(dc.substring(begin + prefix.length, end)); }; /*********************************************************************** * csshover.htc * For security reasons, IE blocks .htc files accessed from a remote * site (a site other than the hosting web site). So we include it here * instead. ***********************************************************************/ /** * Pseudos - V1.30.050121 - hover & active * --------------------------------------------- * Peterned - http://www.xs4all.nl/~peterned/ * (c) 2005 - Peter Nederlof * * Credits - Arnoud Berendsen * - Martin Reurings * - Robert Hanson * * howto: body { behavior:url("csshover.htc"); } * --------------------------------------------- */ var currentSheet, doc = window.document, activators = { onhover:{on:'onmouseover', off:'onmouseout'}, onactive:{on:'onmousedown', off:'onmouseup'} }; function parseStylesheets() { if( avoidParsingStylesheets ) return; if( !doc.styleSheets ) return; // non IE browsers don't need this anyway. var sheets = doc.styleSheets, l = sheets.length; for(var i=0; i?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthTEtag\Content-Type_Apache/2.0.54 (Fedora)_Tue, 24 Oct 2006 20:40:42 GMTUbytesUclose_Sat, 11 Nov 2006 19:06:57 GMTT4155_"ea00da-103b-957ba680"12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13inw#.3BGTm ',0DlRO;@import url(alllevels.css); #Wrapper { background-color: #e6e5d0; } /************************************************************************************************** Breadcrumb: appears just below the department bar **************************************************************************************************/ ul#Breadcrumb { position: relative; display: block; margin-left: 10px; margin-right: 10px; margin-top: 5px; margin-bottom: 5px; padding: 0; list-style-type: none; font-family: Arial, Helvetica, sans-serif; font-size: 11px; } ul#Breadcrumb li { display: inline; font-weight: bold; } ul#Breadcrumb li a { padding-right: 7px; background-image: url(../images/rightArrow.gif); background-position: right; background-repeat: no-repeat; text-decoration: underline; font-weight: normal; } /************************************************************************************************** Navigation: the list of links on the left of the content on the web page **************************************************************************************************/ #Navigation { position: relative; display: block; float: left; margin: 0; margin-left: 10px; margin-top: 7px; padding: 0; width: 17%; } #Navigation h2, #Navigation ul { margin-left: 0px; width: 100%; } #Navigation h2 { margin-top: 11px; margin-bottom: -25px; padding: 0; color: #a98c4b; font-family: arial, helvetica, sans-serif; font-size: 12px; /*text-transform: uppercase; font-weight: normal;*/ } #Navigation ul + h2 { margin-top: -13px; } #Navigation ul { margin-top: 29px; margin-bottom: 1.5em; padding-left: 0px; padding-top: 2px; border-top-width: 1px; border-top-color: #C5AF7D; border-top-style: solid; border-bottom-width: 1px; border-bottom-color: #C5AF7D; border-bottom-style: solid; font-family: arial, helvetica, sans-serif; text-align: left; } #Navigation ul li { list-style-type: none; list-style-image: none; line-height: 125%; color: #333333; font-size: 12px; font-weight: bold; text-indent: -15px; padding-left: 15px; padding-bottom: 0px; } #Navigation ul li a { font-weight: normal; text-decoration: none; } #Navigation ul li a:hover { text-decoration: underline; } #Navigation ul li ul { border: none; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; } #Navigation ul li ul li { padding-left: 0px; text-indent: 0px; list-style-image: url(../images/tanBoxPlain.gif); } /************************************************************************************************** Body: the content area of the page **************************************************************************************************/ #Content { position: relative; /*z-index: 1;*/ width: 77%; float: right; margin: 5pt; color: #333333; font-size: small; } #Content, #Content a { font-family: Arial, Helvetica, sans-serif; } #Content a { color: #003c96; text-decoration: underline; } #Content img { /*margin: 5pt;*/ } #Content h1 { margin-top: 0; margin-bottom: 13pt; padding: 0; font-weight: bold; border-bottom: 1px solid #405679; } /* Make all headers the same font-family and color */ #Content h1, #Content h2, #Content h3, #Content h4, #Content h5, #Content h6 { color: #405679; } /* Make every other heading level tan color. If you just comment this out, then all the headings will be blue, per the rule above. */ #Content h2, #Content h4, #Content h6 { color: #A98C4B; } /* Make the heading tags the right sizes, relatively speaking. */ #Content h1 { font-size: x-large; } #Content h2 { font-size: large; } #Content h3 { font-size: medium; } #Content h4 { font-size: small; } #Content h5 { font-size: x-small; } #Content h6 { font-size: xx-small; } /************************************************************************************************** Printing styles **************************************************************************************************/ @media print { #BigLeftArea, #Navigation, #Content { float: none; } #BigLeftArea, #Content { width: 100%; } #Navigation { display: none; } } _3http://csaa.byu.edu/themes/mosaic/styles/level3.cssXtext/cssOMbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthTEtag\Content-Type_Apache/2.0.54 (Fedora)_Tue, 24 Oct 2006 20:40:42 GMTUbytesUclose_Sat, 11 Nov 2006 19:06:57 GMTT4139_"ea00d7-102b-957ba680"12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13lqz &16EJWp */3GlUO+/* Customized stylesheet for CS website only styles. */ @import url(advanced.css); #Content th, #Content td { text-align: left; vertical-align: top; } img.floatRight, div.floatRight { float: right; margin: 0 0 5px 10px; } #Content .CenteredText { text-align: center; } #Content td.right, #Content th.right { text-align: right; } #Content td.center, #Content th.center { text-align: center; } #Content td.vbot, #Content th.vbot { vertical-align: bottom; } #Content .Story { margin-bottom: 1em; } #Navigation ul ul ul { margin-left: 1em; } #Navigation li.selected a.selected, #Navigation li a.active { font-weight: bold; } #Navigation li.leaf a.active { color: #000; } /* Drupal-specific CSS */ form#user_register .form-item, form#user_edit .form-item { margin-top: .25em; margin-bottom: .25em; } #aggregator .feed-category-description { background: #e6e5d0; padding: 0 .25em; margin-bottom: 1em; border: 1px solid #C5AF7D; } #aggregator .feed-item, .node { margin: .25em 0; padding: 0 0 .5em 0; border-bottom: 1px solid #C5AF7D; } #aggregator .feed-item-title { margin: 0; padding: 0; } #aggregator .feed-item-title a, #Content .node h2 a{ text-decoration: none; } #aggregator .feed-item-title a:hover, #Content .node h2 a:hover { text-decoration: underline; } #aggregator .feed-item-meta, #aggregator .feed-item-categories, .node .info, .node .terms, .node .links { font-size: .8em; color: #A98C4B } #aggregator .feed-item-categories { text-align: right; } .node { padding-bottom: 1.5em; } .node-page { border-bottom: 0px solid #fff; } .node .links { font-size: .9em; float: left; } .node .terms { font-size: .9em; float: right; } #node-admin-filter ul li { list-style-image: none; } /* Calendar */ .event-calendar table { width: 100%; } #Content .event-calendar th { font-size: 1.2em; background: #001e4c; color: #fff; text-align: center; } #Content .event-calendar th a { color: #fff; text-decoration: none; } #Content .event-calendar th a:hover { color: #ccc; text-decoration: underline; } .event-calendar td { height: 3em; width: 14%; } .event-calendar .today{ background: #e6e5d0; } .event-calendar .today .day{ font-weight: bold; } .event-calendar td.days { font-weight: bold; background: #e6e5d0; height: 1em; } div.ical-link { margin-top: .25em; } .event-info { float: right; background: #e6e5d0; padding: 5px; border: 1px solid #c5af7d; margin: 0 0 .5em .5em; } .event-info h3, #Content .event-info h3 { margin-top: 0; margin-bottom: 5px; font-family: "Times New Roman", Times, serif; font-size: medium; border-bottom: 1px solid #c5af7d; color: #a98c4b; } /* Faculty Directory */ div.view-faculty ul { list-style-type: none; } div.view-faculty li { list-style-type: none; display: inline; } div.view-faculty li div { display: inline; } div.view-faculty li img { vertical-align: middle; margin: .6em; } div.view-faculty li div.view-item-faculty { display: block; background-color: #E6E5D0; } div.view-faculty li div.view-data-node_title { margin-right: 1em; font-size: 14pt; } div.view-faculty li div.view-data-node_data_field_position_field_position_value { margin-top: 1.5em; font-weight: bold; display: block; } div.view-faculty li div.view-data-node_data_field_professorial_status_field_professorial_status_value { font-style: italic; } div.field h3 { margin-bottom: .2em; } table#attachments { margin-top: 2em; } div.node-footer { margin-top: 1em; } input#edit-end_date, input#edit-start_date { display: inline; } .view-content-Internships ul { list-style: none; padding: 0px; margin: 0px; } .view-item-Internships { border-top: 1px solid black; margin-bottom: 1em; } .view-item-Internships .view-label { font-weight: bold; background-color: #E6E5D0; margin-top: 2px; padding: 2px; } .view-item-Internships .view-field { margin-top: 2px; margin-left: 1em; padding: 2px; } .view-item-Internships .view-field { margin-top: 2px; margin-left: 1em; padding: 2px; } .view-item-Internships .view-data-node_title { font-size: large; margin-left: 0px; }_6http://csaa.byu.edu/themes/mosaic/styles/cs_level3.css OPbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthTEtag\Content-Type_Apache/2.0.54 (Fedora)_Tue, 24 Oct 2006 21:13:11 GMTUbytesUclose_Sat, 11 Nov 2006 19:06:58 GMTU61894_"ea00cc-f1c6-9a707c0"12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13]bkvz )49HMZs -26JlXO/* Prototype JavaScript framework, version 1.5.0_rc1 * (c) 2005 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://prototype.conio.net/ * /*--------------------------------------------------------------------------*/ var Prototype = { Version: '1.5.0_rc1', ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', emptyFunction: function() {}, K: function(x) {return x} } var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } var Abstract = new Object(); Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } Object.extend(Object, { inspect: function(object) { try { if (object == undefined) return 'undefined'; if (object == null) return 'null'; return object.inspect ? object.inspect() : object.toString(); } catch (e) { if (e instanceof RangeError) return '...'; throw e; } }, keys: function(object) { var keys = []; for (var property in object) keys.push(property); return keys; }, values: function(object) { var values = []; for (var property in object) values.push(object[property]); return values; }, clone: function(object) { return Object.extend({}, object); } }); Function.prototype.bind = function() { var __method = this, args = $A(arguments), object = args.shift(); return function() { return __method.apply(object, args.concat($A(arguments))); } } Function.prototype.bindAsEventListener = function(object) { var __method = this, args = $A(arguments), object = args.shift(); return function(event) { return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); } } Object.extend(Number.prototype, { toColorPart: function() { var digits = this.toString(16); if (this < 16) return '0' + digits; return digits; }, succ: function() { return this + 1; }, times: function(iterator) { $R(0, this, true).each(iterator); return this; } }); var Try = { these: function() { var returnValue; for (var i = 0; i < arguments.length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) {} } return returnValue; } } /*--------------------------------------------------------------------------*/ var PeriodicalExecuter = Class.create(); PeriodicalExecuter.prototype = { initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, stop: function() { if (!this.timer) return; clearInterval(this.timer); this.timer = null; }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.callback(this); } finally { this.currentlyExecuting = false; } } } } Object.extend(String.prototype, { gsub: function(pattern, replacement) { var result = '', source = this, match; replacement = arguments.callee.prepareReplacement(replacement); while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += (replacement(match) || '').toString(); source = source.slice(match.index + match[0].length); } else { result += source, source = ''; } } return result; }, sub: function(pattern, replacement, count) { replacement = this.gsub.prepareReplacement(replacement); count = count === undefined ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); }, scan: function(pattern, iterator) { this.gsub(pattern, iterator); return this; }, truncate: function(length, truncation) { length = length || 30; truncation = truncation === undefined ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : this; }, strip: function() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); }, stripTags: function() { return this.replace(/<\/?[^>]+>/gi, ''); }, stripScripts: function() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); }, extractScripts: function() { var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); }, evalScripts: function() { return this.extractScripts().map(function(script) { return eval(script) }); }, escapeHTML: function() { var div = document.createElement('div'); var text = document.createTextNode(this); div.appendChild(text); return div.innerHTML; }, unescapeHTML: function() { var div = document.createElement('div'); div.innerHTML = this.stripTags(); return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; }, toQueryParams: function() { var pairs = this.match(/^\??(.*)$/)[1].split('&'); return pairs.inject({}, function(params, pairString) { var pair = pairString.split('='); var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; params[decodeURIComponent(pair[0])] = value; return params; }); }, toArray: function() { return this.split(''); }, camelize: function() { var oStringList = this.split('-'); if (oStringList.length == 1) return oStringList[0]; var camelizedString = this.indexOf('-') == 0 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0]; for (var i = 1, len = oStringList.length; i < len; i++) { var s = oStringList[i]; camelizedString += s.charAt(0).toUpperCase() + s.substring(1); } return camelizedString; }, inspect: function(useDoubleQuotes) { var escapedString = this.replace(/\\/g, '\\\\'); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; else return "'" + escapedString.replace(/'/g, '\\\'') + "'"; } }); String.prototype.gsub.prepareReplacement = function(replacement) { if (typeof replacement == 'function') return replacement; var template = new Template(replacement); return function(match) { return template.evaluate(match) }; } String.prototype.parseQuery = String.prototype.toQueryParams; var Template = Class.create(); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; Template.prototype = { initialize: function(template, pattern) { this.template = template.toString(); this.pattern = pattern || Template.Pattern; }, evaluate: function(object) { return this.template.gsub(this.pattern, function(match) { var before = match[1]; if (before == '\\') return match[2]; return before + (object[match[3]] || '').toString(); }); } } var $break = new Object(); var $continue = new Object(); var Enumerable = { each: function(iterator) { var index = 0; try { this._each(function(value) { try { iterator(value, index++); } catch (e) { if (e != $continue) throw e; } }); } catch (e) { if (e != $break) throw e; } }, all: function(iterator) { var result = true; this.each(function(value, index) { result = result && !!(iterator || Prototype.K)(value, index); if (!result) throw $break; }); return result; }, any: function(iterator) { var result = false; this.each(function(value, index) { if (result = !!(iterator || Prototype.K)(value, index)) throw $break; }); return result; }, collect: function(iterator) { var results = []; this.each(function(value, index) { results.push(iterator(value, index)); }); return results; }, detect: function (iterator) { var result; this.each(function(value, index) { if (iterator(value, index)) { result = value; throw $break; } }); return result; }, findAll: function(iterator) { var results = []; this.each(function(value, index) { if (iterator(value, index)) results.push(value); }); return results; }, grep: function(pattern, iterator) { var results = []; this.each(function(value, index) { var stringValue = value.toString(); if (stringValue.match(pattern)) results.push((iterator || Prototype.K)(value, index)); }) return results; }, include: function(object) { var found = false; this.each(function(value) { if (value == object) { found = true; throw $break; } }); return found; }, inject: function(memo, iterator) { this.each(function(value, index) { memo = iterator(memo, value, index); }); return memo; }, invoke: function(method) { var args = $A(arguments).slice(1); return this.collect(function(value) { return value[method].apply(value, args); }); }, max: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value >= result) result = value; }); return result; }, min: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value < result) result = value; }); return result; }, partition: function(iterator) { var trues = [], falses = []; this.each(function(value, index) { ((iterator || Prototype.K)(value, index) ? trues : falses).push(value); }); return [trues, falses]; }, pluck: function(property) { var results = []; this.each(function(value, index) { results.push(value[property]); }); return results; }, reject: function(iterator) { var results = []; this.each(function(value, index) { if (!iterator(value, index)) results.push(value); }); return results; }, sortBy: function(iterator) { return this.collect(function(value, index) { return {value: value, criteria: iterator(value, index)}; }).sort(function(left, right) { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); }, toArray: function() { return this.collect(Prototype.K); }, zip: function() { var iterator = Prototype.K, args = $A(arguments); if (typeof args.last() == 'function') iterator = args.pop(); var collections = [this].concat(args).map($A); return this.map(function(value, index) { return iterator(collections.pluck(index)); }); }, inspect: function() { return '#'; } } Object.extend(Enumerable, { map: Enumerable.collect, find: Enumerable.detect, select: Enumerable.findAll, member: Enumerable.include, entries: Enumerable.toArray }); var $A = Array.from = function(iterable) { if (!iterable) return []; if (iterable.toArray) { return iterable.toArray(); } else { var results = []; for (var i = 0; i < iterable.length; i++) results.push(iterable[i]); return results; } } Object.extend(Array.prototype, Enumerable); if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; Object.extend(Array.prototype, { _each: function(iterator) { for (var i = 0; i < this.length; i++) iterator(this[i]); }, clear: function() { this.length = 0; return this; }, first: function() { return this[0]; }, last: function() { return this[this.length - 1]; }, compact: function() { return this.select(function(value) { return value != undefined || value != null; }); }, flatten: function() { return this.inject([], function(array, value) { return array.concat(value && value.constructor == Array ? value.flatten() : [value]); }); }, without: function() { var values = $A(arguments); return this.select(function(value) { return !values.include(value); }); }, indexOf: function(object) { for (var i = 0; i < this.length; i++) if (this[i] == object) return i; return -1; }, reverse: function(inline) { return (inline !== false ? this : this.toArray())._reverse(); }, reduce: function() { return this.length > 1 ? this : this[0]; }, uniq: function() { return this.inject([], function(array, value) { return array.include(value) ? array : array.concat([value]); }); }, inspect: function() { return '[' + this.map(Object.inspect).join(', ') + ']'; } }); var Hash = { _each: function(iterator) { for (var key in this) { var value = this[key]; if (typeof value == 'function') continue; var pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } }, keys: function() { return this.pluck('key'); }, values: function() { return this.pluck('value'); }, merge: function(hash) { return $H(hash).inject($H(this), function(mergedHash, pair) { mergedHash[pair.key] = pair.value; return mergedHash; }); }, toQueryString: function() { return this.map(function(pair) { return pair.map(encodeURIComponent).join('='); }).join('&'); }, inspect: function() { return '#'; } } function $H(object) { var hash = Object.extend({}, object || {}); Object.extend(hash, Enumerable); Object.extend(hash, Hash); return hash; } ObjectRange = Class.create(); Object.extend(ObjectRange.prototype, Enumerable); Object.extend(ObjectRange.prototype, { initialize: function(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; }, _each: function(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } }, include: function(value) { if (value < this.start) return false; if (this.exclusive) return value < this.end; return value <= this.end; } }); var $R = function(start, end, exclusive) { return new ObjectRange(start, end, exclusive); } var Ajax = { getTransport: function() { return Try.these( function() {return new XMLHttpRequest()}, function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')} ) || false; }, activeRequestCount: 0 } Ajax.Responders = { responders: [], _each: function(iterator) { this.responders._each(iterator); }, register: function(responderToAdd) { if (!this.include(responderToAdd)) this.responders.push(responderToAdd); }, unregister: function(responderToRemove) { this.responders = this.responders.without(responderToRemove); }, dispatch: function(callback, request, transport, json) { this.each(function(responder) { if (responder[callback] && typeof responder[callback] == 'function') { try { responder[callback].apply(responder, [request, transport, json]); } catch (e) {} } }); } }; Object.extend(Ajax.Responders, Enumerable); Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++; }, onComplete: function() { Ajax.activeRequestCount--; } }); Ajax.Base = function() {}; Ajax.Base.prototype = { setOptions: function(options) { this.options = { method: 'post', asynchronous: true, contentType: 'application/x-www-form-urlencoded', parameters: '' } Object.extend(this.options, options || {}); }, responseIsSuccess: function() { return this.transport.status == undefined || this.transport.status == 0 || (this.transport.status >= 200 && this.transport.status < 300); }, responseIsFailure: function() { return !this.responseIsSuccess(); } } Ajax.Request = Class.create(); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Request.prototype = Object.extend(new Ajax.Base(), { initialize: function(url, options) { this.transport = Ajax.getTransport(); this.setOptions(options); this.request(url); }, request: function(url) { var parameters = this.options.parameters || ''; if (parameters.length > 0) parameters += '&_='; /* Simulate other verbs over post */ if (this.options.method != 'get' && this.options.method != 'post') { parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method; this.options.method = 'post'; } try { this.url = url; if (this.options.method == 'get' && parameters.length > 0) this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; Ajax.Responders.dispatch('onCreate', this, this.transport); this.transport.open(this.options.method, this.url, this.options.asynchronous); if (this.options.asynchronous) setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); var body = this.options.postBody ? this.options.postBody : parameters; this.transport.send(this.options.method == 'post' ? body : null); /* Force Firefox to handle ready state 4 for synchronous requests */ if (!this.options.asynchronous && this.transport.overrideMimeType) this.onStateChange(); } catch (e) { this.dispatchException(e); } }, setRequestHeaders: function() { var requestHeaders = ['X-Requested-With', 'XMLHttpRequest', 'X-Prototype-Version', Prototype.Version, 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*']; if (this.options.method == 'post') { requestHeaders.push('Content-type', this.options.contentType); /* Force "Connection: close" for Mozilla browsers to work around * a bug where XMLHttpReqeuest sends an incorrect Content-length * header. See Mozilla Bugzilla #246651. */ if (this.transport.overrideMimeType) requestHeaders.push('Connection', 'close'); } if (this.options.requestHeaders) requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); for (var i = 0; i < requestHeaders.length; i += 2) this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); }, onStateChange: function() { var readyState = this.transport.readyState; if (readyState != 1) this.respondToReadyState(this.transport.readyState); }, header: function(name) { try { return this.transport.getResponseHeader(name); } catch (e) {} }, evalJSON: function() { try { return eval('(' + this.header('X-JSON') + ')'); } catch (e) {} }, evalResponse: function() { try { return eval(this.transport.responseText); } catch (e) { this.dispatchException(e); } }, respondToReadyState: function(readyState) { var event = Ajax.Request.Events[readyState]; var transport = this.transport, json = this.evalJSON(); if (event == 'Complete') { try { (this.options['on' + this.transport.status] || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(transport, json); } catch (e) { this.dispatchException(e); } if ((this.header('Content-type') || '').match(/^text\/javascript/i)) this.evalResponse(); } try { (this.options['on' + event] || Prototype.emptyFunction)(transport, json); Ajax.Responders.dispatch('on' + event, this, transport, json); } catch (e) { this.dispatchException(e); } /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ if (event == 'Complete') this.transport.onreadystatechange = Prototype.emptyFunction; }, dispatchException: function(exception) { (this.options.onException || Prototype.emptyFunction)(this, exception); Ajax.Responders.dispatch('onException', this, exception); } }); Ajax.Updater = Class.create(); Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { initialize: function(container, url, options) { this.containers = { success: container.success ? $(container.success) : $(container), failure: container.failure ? $(container.failure) : (container.success ? null : $(container)) } this.transport = Ajax.getTransport(); this.setOptions(options); var onComplete = this.options.onComplete || Prototype.emptyFunction; this.options.onComplete = (function(transport, object) { this.updateContent(); onComplete(transport, object); }).bind(this); this.request(url); }, updateContent: function() { var receiver = this.responseIsSuccess() ? this.containers.success : this.containers.failure; var response = this.transport.responseText; if (!this.options.evalScripts) response = response.stripScripts(); if (receiver) { if (this.options.insertion) { new this.options.insertion(receiver, response); } else { Element.update(receiver, response); } } if (this.responseIsSuccess()) { if (this.onComplete) setTimeout(this.onComplete.bind(this), 10); } } }); Ajax.PeriodicalUpdater = Class.create(); Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { initialize: function(container, url, options) { this.setOptions(options); this.onComplete = this.options.onComplete; this.frequency = (this.options.frequency || 2); this.decay = (this.options.decay || 1); this.updater = {}; this.container = container; this.url = url; this.start(); }, start: function() { this.options.onComplete = this.updateComplete.bind(this); this.onTimerEvent(); }, stop: function() { this.updater.options.onComplete = undefined; clearTimeout(this.timer); (this.onComplete || Prototype.emptyFunction).apply(this, arguments); }, updateComplete: function(request) { if (this.options.decay) { this.decay = (request.responseText == this.lastText ? this.decay * this.options.decay : 1); this.lastText = request.responseText; } this.timer = setTimeout(this.onTimerEvent.bind(this), this.decay * this.frequency * 1000); }, onTimerEvent: function() { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); function $() { var results = [], element; for (var i = 0; i < arguments.length; i++) { element = arguments[i]; if (typeof element == 'string') element = document.getElementById(element); results.push(Element.extend(element)); } return results.reduce(); } document.getElementsByClassName = function(className, parentElement) { var children = ($(parentElement) || document.body).getElementsByTagName('*'); return $A(children).inject([], function(elements, child) { if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) elements.push(Element.extend(child)); return elements; }); } /*--------------------------------------------------------------------------*/ if (!window.Element) var Element = new Object(); Element.extend = function(element) { if (!element) return; if (_nativeExtensions || element.nodeType == 3) return element; if (!element._extended && element.tagName && element != window) { var methods = Object.clone(Element.Methods), cache = Element.extend.cache; if (element.tagName == 'FORM') Object.extend(methods, Form.Methods); if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) Object.extend(methods, Form.Element.Methods); for (var property in methods) { var value = methods[property]; if (typeof value == 'function') element[property] = cache.findOrStore(value); } } element._extended = true; return element; } Element.extend.cache = { findOrStore: function(value) { return this[value] = this[value] || function() { return value.apply(null, [this].concat($A(arguments))); } } } Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; }, toggle: function(element) { element = $(element); Element[Element.visible(element) ? 'hide' : 'show'](element); return element; }, hide: function(element) { $(element).style.display = 'none'; return element; }, show: function(element) { $(element).style.display = ''; return element; }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); return element; }, update: function(element, html) { $(element).innerHTML = html.stripScripts(); setTimeout(function() {html.evalScripts()}, 10); return element; }, replace: function(element, html) { element = $(element); if (element.outerHTML) { element.outerHTML = html.stripScripts(); } else { var range = element.ownerDocument.createRange(); range.selectNodeContents(element); element.parentNode.replaceChild( range.createContextualFragment(html.stripScripts()), element); } setTimeout(function() {html.evalScripts()}, 10); return element; }, inspect: function(element) { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { var property = pair.first(), attribute = pair.last(); var value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, recursivelyCollect: function(element, property) { element = $(element); var elements = []; while (element = element[property]) if (element.nodeType == 1) elements.push(Element.extend(element)); return elements; }, ancestors: function(element) { return $(element).recursivelyCollect('parentNode'); }, descendants: function(element) { element = $(element); return $A(element.getElementsByTagName('*')); }, previousSiblings: function(element) { return $(element).recursivelyCollect('previousSibling'); }, nextSiblings: function(element) { return $(element).recursivelyCollect('nextSibling'); }, siblings: function(element) { element = $(element); return element.previousSiblings().reverse().concat(element.nextSiblings()); }, match: function(element, selector) { element = $(element); if (typeof selector == 'string') selector = new Selector(selector); return selector.match(element); }, up: function(element, expression, index) { return Selector.findElement($(element).ancestors(), expression, index); }, down: function(element, expression, index) { return Selector.findElement($(element).descendants(), expression, index); }, previous: function(element, expression, index) { return Selector.findElement($(element).previousSiblings(), expression, index); }, next: function(element, expression, index) { return Selector.findElement($(element).nextSiblings(), expression, index); }, getElementsBySelector: function() { var args = $A(arguments), element = $(args.shift()); return Selector.findChildElements(element, args); }, getElementsByClassName: function(element, className) { element = $(element); return document.getElementsByClassName(className, element); }, getHeight: function(element) { element = $(element); return element.offsetHeight; }, classNames: function(element) { return new Element.ClassNames(element); }, hasClassName: function(element, className) { if (!(element = $(element))) return; return Element.classNames(element).include(className); }, addClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element).add(className); return element; }, removeClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element).remove(className); return element; }, observe: function() { Event.observe.apply(Event, arguments); return $A(arguments).first(); }, stopObserving: function() { Event.stopObserving.apply(Event, arguments); return $A(arguments).first(); }, // removes whitespace-only text node children cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; while (node) { var nextNode = node.nextSibling; if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) element.removeChild(node); node = nextNode; } return element; }, empty: function(element) { return $(element).innerHTML.match(/^\s*$/); }, childOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var x = element.x ? element.x : element.offsetLeft, y = element.y ? element.y : element.offsetTop; window.scrollTo(x, y); return element; }, getStyle: function(element, style) { element = $(element); var value = element.style[style.camelize()]; if (!value) { if (document.defaultView && document.defaultView.getComputedStyle) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css.getPropertyValue(style) : null; } else if (element.currentStyle) { value = element.currentStyle[style.camelize()]; } } if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) if (Element.getStyle(element, 'position') == 'static') value = 'auto'; return value == 'auto' ? null : value; }, setStyle: function(element, style) { element = $(element); for (var name in style) element.style[name.camelize()] = style[name]; return element; }, getDimensions: function(element) { element = $(element); if (Element.getStyle(element, 'display') != 'none') return {width: element.offsetWidth, height: element.offsetHeight}; // All *Width and *Height properties give 0 on elements with display none, // so enable the element temporarily var els = element.style; var originalVisibility = els.visibility; var originalPosition = els.position; els.visibility = 'hidden'; els.position = 'absolute'; els.display = ''; var originalWidth = element.clientWidth; var originalHeight = element.clientHeight; els.display = 'none'; els.position = originalPosition; els.visibility = originalVisibility; return {width: originalWidth, height: originalHeight}; }, makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; // Opera returns the offset relative to the positioning context, when an // element is position relative but top and left have not been defined if (window.opera) { element.style.top = 0; element.style.left = 0; } } return element; }, undoPositioned: function(element) { element = $(element); if (element._madePositioned) { element._madePositioned = undefined; element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; } return element; }, makeClipping: function(element) { element = $(element); if (element._overflow) return; element._overflow = element.style.overflow || 'auto'; if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') element.style.overflow = 'hidden'; return element; }, undoClipping: function(element) { element = $(element); if (!element._overflow) return; element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; element._overflow = null; return element; } } // IE is missing .innerHTML support for TABLE-related elements if(document.all){ Element.Methods.update = function(element, html) { element = $(element); var tagName = element.tagName.toUpperCase(); if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) { var div = document.createElement('div'); switch (tagName) { case 'THEAD': case 'TBODY': div.innerHTML = '' + html.stripScripts() + '
'; depth = 2; break; case 'TR': div.innerHTML = '' + html.stripScripts() + '
'; depth = 3; break; case 'TD': div.innerHTML = '
' + html.stripScripts() + '
'; depth = 4; } $A(element.childNodes).each(function(node){ element.removeChild(node) }); depth.times(function(){ div = div.firstChild }); $A(div.childNodes).each( function(node){ element.appendChild(node) }); } else { element.innerHTML = html.stripScripts(); } setTimeout(function() {html.evalScripts()}, 10); return element; } } Object.extend(Element, Element.Methods); var _nativeExtensions = false; if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement, and HTMLSelectElement in Safari */ ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { var klass = window['HTML' + tag + 'Element'] = {}; klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; }); } Element.addMethods = function(methods) { Object.extend(Element.Methods, methods || {}); function copy(methods, destination) { var cache = Element.extend.cache; for (var property in methods) { var value = methods[property]; destination[property] = cache.findOrStore(value); } } if (typeof HTMLElement != 'undefined') { copy(Element.Methods, HTMLElement.prototype); copy(Form.Methods, HTMLFormElement.prototype); [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { copy(Form.Element.Methods, klass.prototype); }); _nativeExtensions = true; } } var Toggle = new Object(); Toggle.display = Element.toggle; /*--------------------------------------------------------------------------*/ Abstract.Insertion = function(adjacency) { this.adjacency = adjacency; } Abstract.Insertion.prototype = { initialize: function(element, content) { this.element = $(element); this.content = content.stripScripts(); if (this.adjacency && this.element.insertAdjacentHTML) { try { this.element.insertAdjacentHTML(this.adjacency, this.content); } catch (e) { var tagName = this.element.tagName.toLowerCase(); if (tagName == 'tbody' || tagName == 'tr') { this.insertContent(this.contentFromAnonymousTable()); } else { throw e; } } } else { this.range = this.element.ownerDocument.createRange(); if (this.initializeRange) this.initializeRange(); this.insertContent([this.range.createContextualFragment(this.content)]); } setTimeout(function() {content.evalScripts()}, 10); }, contentFromAnonymousTable: function() { var div = document.createElement('div'); div.innerHTML = '' + this.content + '
'; return $A(div.childNodes[0].childNodes[0].childNodes); } } var Insertion = new Object(); Insertion.Before = Class.create(); Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { initializeRange: function() { this.range.setStartBefore(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element); }).bind(this)); } }); Insertion.Top = Class.create(); Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(true); }, insertContent: function(fragments) { fragments.reverse(false).each((function(fragment) { this.element.insertBefore(fragment, this.element.firstChild); }).bind(this)); } }); Insertion.Bottom = Class.create(); Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.appendChild(fragment); }).bind(this)); } }); Insertion.After = Class.create(); Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { initializeRange: function() { this.range.setStartAfter(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element.nextSibling); }).bind(this)); } }); /*--------------------------------------------------------------------------*/ Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { this.element = $(element); }, _each: function(iterator) { this.element.className.split(/\s+/).select(function(name) { return name.length > 0; })._each(iterator); }, set: function(className) { this.element.className = className; }, add: function(classNameToAdd) { if (this.include(classNameToAdd)) return; this.set(this.toArray().concat(classNameToAdd).join(' ')); }, remove: function(classNameToRemove) { if (!this.include(classNameToRemove)) return; this.set(this.select(function(className) { return className != classNameToRemove; }).join(' ')); }, toString: function() { return this.toArray().join(' '); } } Object.extend(Element.ClassNames.prototype, Enumerable); var Selector = Class.create(); Selector.prototype = { initialize: function(expression) { this.params = {classNames: []}; this.expression = expression.toString().strip(); this.parseExpression(); this.compileMatcher(); }, parseExpression: function() { function abort(message) { throw 'Parse error in selector: ' + message; } if (this.expression == '') abort('empty expression'); var params = this.params, expr = this.expression, match, modifier, clause, rest; while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { params.attributes = params.attributes || []; params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); expr = match[1]; } if (expr == '*') return this.params.wildcard = true; while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { modifier = match[1], clause = match[2], rest = match[3]; switch (modifier) { case '#': params.id = clause; break; case '.': params.classNames.push(clause); break; case '': case undefined: params.tagName = clause.toUpperCase(); break; default: abort(expr.inspect()); } expr = rest; } if (expr.length > 0) abort(expr.inspect()); }, buildMatchExpression: function() { var params = this.params, conditions = [], clause; if (params.wildcard) conditions.push('true'); if (clause = params.id) conditions.push('element.id == ' + clause.inspect()); if (clause = params.tagName) conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); if ((clause = params.classNames).length > 0) for (var i = 0; i < clause.length; i++) conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')'); if (clause = params.attributes) { clause.each(function(attribute) { var value = 'element.getAttribute(' + attribute.name.inspect() + ')'; var splitValueBy = function(delimiter) { return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; } switch (attribute.operator) { case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; case '|=': conditions.push( splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() ); break; case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; case '': case undefined: conditions.push(value + ' != null'); break; default: throw 'Unknown operator ' + attribute.operator + ' in selector'; } }); } return conditions.join(' && '); }, compileMatcher: function() { this.match = new Function('element', 'if (!element.tagName) return false; \ return ' + this.buildMatchExpression()); }, findElements: function(scope) { var element; if (element = $(this.params.id)) if (this.match(element)) if (!scope || Element.childOf(element, scope)) return [element]; scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); var results = []; for (var i = 0; i < scope.length; i++) if (this.match(element = scope[i])) results.push(Element.extend(element)); return results; }, toString: function() { return this.expression; } } Object.extend(Selector, { matchElements: function(elements, expression) { var selector = new Selector(expression); return elements.select(selector.match.bind(selector)); }, findElement: function(elements, expression, index) { if (typeof expression == 'number') index = expression, expression = false; return Selector.matchElements(elements, expression || '*')[index || 0]; }, findChildElements: function(element, expressions) { return expressions.map(function(expression) { return expression.strip().split(/\s+/).inject([null], function(results, expr) { var selector = new Selector(expr); return results.inject([], function(elements, result) { return elements.concat(selector.findElements(result || element)); }); }); }).flatten(); } }); function $$() { return Selector.findChildElements(document, $A(arguments)); } var Form = { reset: function(form) { $(form).reset(); return form; } }; Form.Methods = { serialize: function(form) { var elements = Form.getElements($(form)); var queryComponents = new Array(); for (var i = 0; i < elements.length; i++) { var queryComponent = Form.Element.serialize(elements[i]); if (queryComponent) queryComponents.push(queryComponent); } return queryComponents.join('&'); }, getElements: function(form) { form = $(form); var elements = new Array(); for (var tagName in Form.Element.Serializers) { var tagElements = form.getElementsByTagName(tagName); for (var j = 0; j < tagElements.length; j++) elements.push(tagElements[j]); } return elements; }, getInputs: function(form, typeName, name) { form = $(form); var inputs = form.getElementsByTagName('input'); if (!typeName && !name) return inputs; var matchingInputs = new Array(); for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; if ((typeName && input.type != typeName) || (name && input.name != name)) continue; matchingInputs.push(input); } return matchingInputs; }, disable: function(form) { form = $(form); var elements = Form.getElements(form); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.blur(); element.disabled = 'true'; } return form; }, enable: function(form) { form = $(form); var elements = Form.getElements(form); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.disabled = ''; } return form; }, findFirstElement: function(form) { return Form.getElements(form).find(function(element) { return element.type != 'hidden' && !element.disabled && ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); }); }, focusFirstElement: function(form) { form = $(form); Field.activate(Form.findFirstElement(form)); return form; } } Object.extend(Form, Form.Methods); /*--------------------------------------------------------------------------*/ Form.Element = { focus: function(element) { $(element).focus(); return element; }, select: function(element) { $(element).select(); return element; } } Form.Element.Methods = { serialize: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) { var key = encodeURIComponent(parameter[0]); if (key.length == 0) return; if (parameter[1].constructor != Array) parameter[1] = [parameter[1]]; return parameter[1].map(function(value) { return key + '=' + encodeURIComponent(value); }).join('&'); } }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) return parameter[1]; }, clear: function(element) { $(element).value = ''; return element; }, present: function(element) { return $(element).value != ''; }, activate: function(element) { element = $(element); element.focus(); if (element.select) element.select(); return element; }, disable: function(element) { element = $(element); element.disabled = ''; return element; }, enable: function(element) { element = $(element); element.blur(); element.disabled = 'true'; return element; } } Object.extend(Form.Element, Form.Element.Methods); var Field = Form.Element; /*--------------------------------------------------------------------------*/ Form.Element.Serializers = { input: function(element) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': return Form.Element.Serializers.inputSelector(element); default: return Form.Element.Serializers.textarea(element); } return false; }, inputSelector: function(element) { if (element.checked) return [element.name, element.value]; }, textarea: function(element) { return [element.name, element.value]; }, select: function(element) { return Form.Element.Serializers[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element); }, selectOne: function(element) { var value = '', opt, index = element.selectedIndex; if (index >= 0) { opt = element.options[index]; value = opt.value || opt.text; } return [element.name, value]; }, selectMany: function(element) { var value = []; for (var i = 0; i < element.length; i++) { var opt = element.options[i]; if (opt.selected) value.push(opt.value || opt.text); } return [element.name, value]; } } /*--------------------------------------------------------------------------*/ var $F = Form.Element.getValue; /*--------------------------------------------------------------------------*/ Abstract.TimedObserver = function() {} Abstract.TimedObserver.prototype = { initialize: function(element, frequency, callback) { this.frequency = frequency; this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); this.registerCallback(); }, registerCallback: function() { setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } } } Form.Element.Observer = Class.create(); Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(); Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.serialize(this.element); } }); /*--------------------------------------------------------------------------*/ Abstract.EventObserver = function() {} Abstract.EventObserver.prototype = { initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); }, onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } }, registerFormCallbacks: function() { var elements = Form.getElements(this.element); for (var i = 0; i < elements.length; i++) this.registerCallback(elements[i]); }, registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; default: Event.observe(element, 'change', this.onElementEvent.bind(this)); break; } } } } Form.Element.EventObserver = Class.create(); Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.EventObserver = Class.create(); Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { getValue: function() { return Form.serialize(this.element); } }); if (!window.Event) { var Event = new Object(); } Object.extend(Event, { KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, KEY_HOME: 36, KEY_END: 35, KEY_PAGEUP: 33, KEY_PAGEDOWN: 34, element: function(event) { return event.target || event.srcElement; }, isLeftClick: function(event) { return (((event.which) && (event.which == 1)) || ((event.button) && (event.button == 1))); }, pointerX: function(event) { return event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); }, pointerY: function(event) { return event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); }, stop: function(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; event.cancelBubble = true; } }, // find the first node with the given tagName, starting from the // node the event was triggered on; traverses the DOM upwards findElement: function(event, tagName) { var element = Event.element(event); while (element.parentNode && (!element.tagName || (element.tagName.toUpperCase() != tagName.toUpperCase()))) element = element.parentNode; return element; }, observers: false, _observeAndCache: function(element, name, observer, useCapture) { if (!this.observers) this.observers = []; if (element.addEventListener) { this.observers.push([element, name, observer, useCapture]); element.addEventListener(name, observer, useCapture); } else if (element.attachEvent) { this.observers.push([element, name, observer, useCapture]); element.attachEvent('on' + name, observer); } }, unloadCache: function() { if (!Event.observers) return; for (var i = 0; i < Event.observers.length; i++) { Event.stopObserving.apply(this, Event.observers[i]); Event.observers[i][0] = null; } Event.observers = false; }, observe: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)) name = 'keydown'; Event._observeAndCache(element, name, observer, useCapture); }, stopObserving: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.detachEvent)) name = 'keydown'; if (element.removeEventListener) { element.removeEventListener(name, observer, useCapture); } else if (element.detachEvent) { try { element.detachEvent('on' + name, observer); } catch (e) {} } } }); /* prevent memory leaks in IE */ if (navigator.appVersion.match(/\bMSIE\b/)) Event.observe(window, 'unload', Event.unloadCache, false); var Position = { // set to true if needed, warning: firefox performance problems // NOT neeeded for page scrolling, only if draggable contained in // scrollable elements includeScrollOffsets: false, // must be called before calling withinIncludingScrolloffset, every time the // page is scrolled prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; }, realOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.scrollTop || 0; valueL += element.scrollLeft || 0; element = element.parentNode; } while (element); return [valueL, valueT]; }, cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [valueL, valueT]; }, positionedOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { p = Element.getStyle(element, 'position'); if (p == 'relative' || p == 'absolute') break; } } while (element); return [valueL, valueT]; }, offsetParent: function(element) { if (element.offsetParent) return element.offsetParent; if (element == document.body) return element; while ((element = element.parentNode) && element != document.body) if (Element.getStyle(element, 'position') != 'static') return element; return document.body; }, // caches x/y coordinate pair to use with overlap within: function(element, x, y) { if (this.includeScrollOffsets) return this.withinIncludingScrolloffsets(element, x, y); this.xcomp = x; this.ycomp = y; this.offset = this.cumulativeOffset(element); return (y >= this.offset[1] && y < this.offset[1] + element.offsetHeight && x >= this.offset[0] && x < this.offset[0] + element.offsetWidth); }, withinIncludingScrolloffsets: function(element, x, y) { var offsetcache = this.realOffset(element); this.xcomp = x + offsetcache[0] - this.deltaX; this.ycomp = y + offsetcache[1] - this.deltaY; this.offset = this.cumulativeOffset(element); return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + element.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + element.offsetWidth); }, // within must be called directly before overlap: function(mode, element) { if (!mode) return 0; if (mode == 'vertical') return ((this.offset[1] + element.offsetHeight) - this.ycomp) / element.offsetHeight; if (mode == 'horizontal') return ((this.offset[0] + element.offsetWidth) - this.xcomp) / element.offsetWidth; }, page: function(forElement) { var valueT = 0, valueL = 0; var element = forElement; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; // Safari fix if (element.offsetParent==document.body) if (Element.getStyle(element,'position')=='absolute') break; } while (element = element.offsetParent); element = forElement; do { if (!window.opera || element.tagName=='BODY') { valueT -= element.scrollTop || 0; valueL -= element.scrollLeft || 0; } } while (element = element.parentNode); return [valueL, valueT]; }, clone: function(source, target) { var options = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || {}) // find page position of source source = $(source); var p = Position.page(source); // find coordinate system to use target = $(target); var delta = [0, 0]; var parent = null; // delta [0,0] will do fine with position: fixed elements, // position:absolute needs offsetParent deltas if (Element.getStyle(target,'position') == 'absolute') { parent = Position.offsetParent(target); delta = Position.page(parent); } // correct by body offsets (fixes Safari) if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } // set position if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if(options.setWidth) target.style.width = source.offsetWidth + 'px'; if(options.setHeight) target.style.height = source.offsetHeight + 'px'; }, absolutize: function(element) { element = $(element); if (element.style.position == 'absolute') return; Position.prepare(); var offsets = Position.positionedOffset(element); var top = offsets[1]; var left = offsets[0]; var width = element.clientWidth; var height = element.clientHeight; element._originalLeft = left - parseFloat(element.style.left || 0); element._originalTop = top - parseFloat(element.style.top || 0); element._originalWidth = element.style.width; element._originalHeight = element.style.height; element.style.position = 'absolute'; element.style.top = top + 'px';; element.style.left = left + 'px';; element.style.width = width + 'px';; element.style.height = height + 'px';; }, relativize: function(element) { element = $(element); if (element.style.position == 'relative') return; Position.prepare(); element.style.position = 'relative'; var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.height = element._originalHeight; element.style.width = element._originalWidth; } } // Safari returns margins on body which is incorrect if the child is absolutely // positioned. For performance reasons, redefine Position.cumulativeOffset for // KHTML/WebKit only. if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { Position.cumulativeOffset = function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body) if (Element.getStyle(element, 'position') == 'absolute') break; element = element.offsetParent; } while (element); return [valueL, valueT]; } } Element.addMethods();_'http://csaa.byu.edu/lib/js/prototype.jsOEbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthTEtag\Content-Type_Apache/2.0.54 (Fedora)_Mon, 21 Aug 2006 19:29:09 GMTUbytesUclose_Sat, 11 Nov 2006 19:06:58 GMTS616_"ea0902-268-1fc1ab40"12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13ejs~ +0?DQj"'+?lMOhGIF89aѤХΤϣ͛ɒ͑̚Ǐˏō̌̏Ȑˌ̕ǍʌǏƊȊȊljɉȉLjƋx{{vl}gzexexexdwcvatXkWkN_mM^mHYi>Xr?XwDUdAUk8Rr%Ei6a5a3_)Y(] &[ $ZYYRVQ!,ŀ. #/$% "6: /( ԒތDC+3##D;!P 䄅HXK C$2xM?x)l"9nтX͛8sڤ;_/http://csaa.byu.edu/themes/mosaic/images/go.gifYimage/gif !"#OPbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078(9d*+!-.WNS.base[NS.relative_8http://csaa.byu.edu/themes/mosaic/images/level3title.png1234X$classesZ$classname456UNSURLV%NSURLXNSObjectYimage/png9:;=>?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthTEtag\Content-Type_Apache/2.0.54 (Fedora)_Fri, 25 Aug 2006 19:17:13 GMTUbytesUclose_Sat, 11 Nov 2006 19:06:58 GMTT8155_"ea090b-1fdb-6c71e040"12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13ns| )49HMZs -26JlXOۉPNG  IHDR"?bKGD?Vx?$tEXtSoftwareAdobe ImageReadyqe<kIDATx? q#u%6ѿAdSQ#XXeUB,wWa~پ_irH:g0^-8ϋqx=^(Tf@%0ea&cb6!6 фt'bj˝x1+n`T3|򅁓A@@lWmP=mÛ@ebPU`8{: o3??^V`Q0 Fv@] ֟dh] 43eTbbӐc062`dPWQ``a0Tb`ϰ}e3cbfpXkwށ>|V~ "*Ơ  Y> Uǐpm_00p[~bFcoQ0 F(bC뤵XǠ+LšAO<|_?2|W܊rD2,󜡵c)t3+qP z=pP/d߿^xp;y/200cafp!Żb.}/$7f1r4F(`L@̌ gNb`d` UљƖARR X13+dfffn `g w1ܼPAUI c Ԃ*sfbbbA:?W>~2t3ܻa3 L,L Y~}(`Q _Ͽ~Cz181h+`^\5w A3''Ç6Π`#T 1{H/77' ?\@?r \ 0<6_2}˂Fޣ7 _d`%P }Q0 F(@[v`]\G \}XrW*hTApWluXX=saay ^ TƠ`g 'V#CL;òn>X[2,W+|c```chQ0 F( X@s L 1Kq0X1pr+l*uP " 񁷡m,L ux8޼1k'Ôy~*c8VF5G+mos]i~^uf`dg8w1CBv?ÛwWD(]{ >$.JP { 3WG4h~~!g)0G\.Za3P2@13h4`.̠ V*s"7p;h^S-v AQX3024N0qz>:;0+/#1,\y 6: < @'l ^cdٝ?t2;'2&9n =pB: -I.拀8ZjCB Z*d6P3p=M|h¾q0\L9qPej@? pA8ho%$$>}U@Wsp2h2(*(03aҽ@E< F29!5C!Ce Ü&C S_ ,L e?2?TahA@=s C* ,@3~27_L^Rfxt嘁83 ;7+P<.+)̐ !ˠ, lt aHb*G5 A2B jtq"q: :$Dc(NGj 2ӑC2_0YwXႎiAUܠ}4ړ3B_3=9Y`ʰp~xxxLu$,V1aAiA_fi0<|AEF (2`2Xq9S!2 f0g&4QB+"AػH%wP܁5Ko f'L;a v!-wɀXhE/~~#ǿP;"2jJ 4@|>`R3R܇zȭai}Rv!&5= 3а:V ?8…p#r{) P9qQ(R\« 53Kg|a䮻P\-] {4P*(_. Q@A(*V\ b&]bKpj\MthNEHOZ `u ^>]KSK; =Lt\p]Gwvxjuu 2a2s3]5[!_B8q1TfPk Y yy >?9xTIjI`>5#13u*!bi a3ӥ$T~9>oI&ˁ$cj$i)aL$ϥx_yG `%}umu\F`8w+w+W^-Xk8'J]X+gP%,?r;7߸ql*?~ C'm':ut`!XPFqxPw!3P(pxׁˑ P VcpߡٯTX"Mb^C.AV_c ZOV}#UTpR#w$QyJXFp"7=EG8*vfSc4LWiԑrFK lJ\s/q57 }?qI9dY%VlL ldeĥ; 0pp0 2<$dgax#Äھ~`okPk%_`/+rT@ @ @&ff Wu/gh_| t{и;,B<{p ͿGjF{" #%#l#c.9_>Zl)G1q_*Rc{0 ; bqY,k!\f졑΢M3bݗgc$3IM=,Ss諠j5c$qdWcۢm(h_%F%Ŷ^53xwv@i]w%*(g@*4ajڨ!53 e\Rc \B~q+3#;o+ \< n > >6 Ꮂ * f\ ߿g×o?ڧmb=ÿd޼y >p{gUTfbs3V 3ۏ^} _}V< vfx>CßWlBKp0֮P"*$ZC5à@QiH 6KG*;pUP'O†ѧQCN9c'(vBH|45 ,?Hµ '.=(8͋!:6ѕ?(AVN XXN $( =/çed Ńkt&F!n? 2@9ж7n2C0Reغ$Æ'<|;oNLILq2,F,zXǚ"B ).2,Ct'fޙ~#}g Ebd"0z8'˅YJ,b{jH-g4"*JAh,mހu5.F! o0yo " vj B d ÛOTd249Ff)> '^&30Wx æ=`e"y1 n<$E*r8؋[^U!P Й 5cha)g@@%jT'?G{렒=yj5vd= ZXFUhiHiDޓXVzDʳKurfRBO?b.d~,ai@aӡk w0=Xd`5dP߇~5W3 1{˧Oa e u,̰q9_1ppq3c9ò 5=R7S`bPWeV;;09y;cx3Cas2~$: =4hC^KD>YV5l>v8 ⢉hrU:Z׫rC!qdBr0)QVwUlȫaj` r ur܅B&r1Z32QNBMjzjİĒVaaB\MR˙h#w*"=4NCJC+/`W$"-:SiX0΂u4;{(NDqD1"d '-8t".BE@PJbQH%&i;;) e;'m*$ncz@Sns{/2X3<|A? cx-''?#Р;w0\tG ?ax/30pg /̠`ecϠ^ Z`Zf`x{ ËSM@7o$VCW`Q0 F X@'=vڝ' A207OH(ԕdŅeTp{3H 3+2hhj]ma{-߿8uU?[Կ0cAb_ ~ ) '/ax9'>9F(`Q w,q)#[(h3[Y_ClQ *[+/'xzyxؿzF eY YW`]S2qlY?Knj #@Ԉ MZr\:F|W^BgGvT~bRS ðUO_3l?tAGUڽ/C! /+omu%/_3|W \  B|Ce>mi{ /Ù[|~Z, l 3<}wmfl"Pt0A+NA+AAsU&Q0 F(bޒ79,,p}{ے j  髏 afg8r';+ׯ?$B}yϠ݃x Z^FAJo |f3ܾX{30 W 1x6o_ |S2*tERȀDŽQ0 F(! _y_\X9>xx޾ypM?3p{F: b }gtg4$4o=OWspސO O^|`fP`C`R;õ[Ox9!` t Ó}>?> +Q0 F(b`6%%JIENDB`_8http://csaa.byu.edu/themes/mosaic/images/level3title.pngYimage/png%&'Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-ModifiedZConnectionTDate_Content-Disposition^Content-LengthWExpires\X-Powered-By\Content-Type_Apache/2.0.54 (Fedora)_Wed, 08 Nov 2006 18:34:04 GMTUclose_Sat, 11 Nov 2006 19:06:58 GMT_$inline; filename="old computers.gif"U53505_Sun, 11 Nov 2007 19:06:58 GMTYPHP/5.0.412fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135kpy ).DS[hu!+04JW\_{pOGIF87a.}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMKKKIIIGGGEEECCCAAA???===;;;999777555333111///---+++)))'''%%%###!!!~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNLLLJJJHHHFFFDDDBBB@@@>>><<<:::888666444222000...,,,***(((&&&$$$""" ,.OQF=Zʑ@xXjD7,B(`'z9Pɓ(/,˖._tc2OL3ϟ@20ѣFW)]xTMs,jէWVjUU^;Wh_HXp̒;!Cj)W#&I+ɮ%{5iד`Mr%ٖ._EV2cBO&Zf_lْ7RQL)Y[#9}21k&ω2ц1}2446CSE*)wR/\5;,լ`&4c_mv[?߽EˀDbM(QH6E1dE3mV Af_t3tL3Sp4iT'SA4GaD\p4 vP?Ovv-% zZ%Xbm+ V}?}pr]w7^. c18dWH фqa5f3ED܏7sn%Yt܎Bs0нdH!]P-xQ%wMey轷^zGְâֱo_~w糷` 'bXSԔוX=UUi=\l]C_Lgfm/EN`,b@x #tD;F.a 8!nx nxC8p 8 XzJd50mhsUr"q Ě$J )NV+NmWXXރ2b-`:LYq420:P/'iAebbCrNKB0-T#@6h ?#H(h`1p]"8ErU;޻t4 (uϟ*F)JK+K '2OrDM,|( WB0zXm4[øB pȁv0;xHX8t*J@8P*p` D%DBxߎZBxp$qCZ$Y$LeI3^Mb(\y2HG6[ȔdIԟ^D@Ald!|n!8!x0;@@ 8,\ T-Ȅ H H|PD18!%eTW MTa8v;?=OS*ߺPd)lK,/'" F, , `P @!7x&Pg:v`=4`| A@q/XM# $0D! QLEٞ?WS\դ ^H}ka[(ܸ5k ;ٕG%'>\B*C4(: dxA'V`\HD 0- |@(&Z D0ȁ88Fh酠@ Q H񃐀\O{礓v,V{'vƳ8YM-b2buĸi.jz+W\bs$HP'8(d Ђ`E'*Q xo;XFN@(0:w,œNt`Mw@x'  C C6$s7ce+DV2zqW\`ygyRV\R!&*CD)diRt&]D p 6 4h @ 8 ` 1  ` yew P0y{8  0>P1z8s8+B;$%1zss=suIIV?C > ,cluls%eM@vw.  - P -` @ >` X. aPpHPr. W0X`8)8\BCzEFs~S7ƅ[]1,[uChC>ͥXVD8C4&>A8j,qa8 S $@30h.@ 6  R@ R 2@ q7(0u `zP6~ `}Ȁ u) Џ]$'eEJ!Ci1ŵ=%1@ ,E!,52r%W,2w O _0P%` @ <H B  T@ L`  vxPxPups02@~ȝ~YPb1i72)DY{1BVV%s吾VbJg C572qQ I Uրq5o  3D D L@ NR` ` @~ ~ ypyP`r|Xȟɟ y {_J^b8 7J\R{td[2yIUyO j&סa:$P?P8  ]jrlMAp  o&f0:E P ꡟ %C>h8/ >[\[^e7+]8pu,@֐W P 0 f mY3%M0Eh*e~z0 L @ B@L@XX S XV[Z̠V ` < # `*_  } p: P 8zVGԊeJ/ȰkdEdDG+2C%7Yt+ 1)sK? 80  נ =LudYu` P !+ > 2h@X` Sً̠ _{ F0 `  &0 Pz ^j ȟyyonup+зɀ{{_J=Ǹ裺 ;&J]GVِ)P akgd`R&щ)Ӆ{'Ji2 Y0 Op @U sYn@FP"0 K, m 0" +@R`ȀZ \RQ4Z+Ч@0 0W0z'p|}x (psIzitp{s8SɗJ'\l.<%, X!(8)[[P-Y݀L mnPW }) H  @ D @<` 40  & -0@l;{{~ $@q)uɇȀ Zs10hb&.)L,l{*\XAhVʈNe, ɬW϶ ~'S2q sv t`` ~ } Fv~ p`V 6Φϐ )%p V@`  f{  c ȟ P'P ,8;&{*cla%K liViuʧ>t<ze6ZPp͂ 0 |  6Ȗ0S BZ/8  p" @, ، jyb vayaER2lLW uAw+.#,B]iې+xC!cjQ.3G jz'ncJ|m Ж p } z@ @E) 5P~Z (` ~ @^mc}wxP؝` xs9PaoGQ-'qa Azp҅cKhsʾ%toJ] 0 `m{nm^ 0 3@ДH 0 3@@@, X'F L$wb90~pm  0x/ZW K]TDK&D) 'd:TaDJژld'0 Tm>|szpg_ ]^zp{@ ߓh D  JUеZk ڇWI} p HX-7,ҮH;^] QO|69Ͳ,Zj제&I,,\{>M d6DG_@`v  _v'ԓp= 4`A@"iFl@ I8tA1 dXTbqŊ1cTRB 4a A"'>,p'E* P ?'Pk! ~K-XAqX=z 2V\K~%X'$uH!jXqݦU6W9wU+ѭLazǎVVXӵ[Un{Yy{$ɓ/u@A= LP<<·> gˆN,LpAƐpА1B `мxB&ni&)DAjAj(=x`p(;RPAD ! B*, (@6_e 1f٥c"+∾b) &&vŎ㰤llͷDK-Mn{6O-7m74E3*3n"Z- H;;:0@/rCHL,UPQS> hP |/e1 -`B,nU bV@2-İ"rF11K$@9" 3{L$8_~y_h#KtηHͶ.~Zn9b`D,P+pMdqSQRk"2ecIJ(:1 0 4I&]n2/\إm% +TGz\32?ó7xOK7:dz9.e9]Ǝ6 J4; b?*N.iSpBQ#`2fhA҂*Z@L$H+P Ȑ`H !~@H`!Nt[0Rd/F2Ε&<'T\b ]!KŒEhԂ2yG 5Xn8;uy,S3ߡ,vK f;C%=ICrMA&HQЁ(L @Gx .HLBh)؊  J Zd@Y^@jX y |C8V (E/9 Q7apqS1A #x % `#h Vˈ/Ȑ19,cb|Dt3#˘w8IMƯ,ӌsYq:) 4aBynf>4 Hi%aQ@6D 8 @AZЂ@ P P$^@M(M&J耲*@8mD5 =X+#ŕh4.pK=Kcj"$ $FBB00 $ A JЅh SHЅxa"s8'.Bn }y,(r»ȴ.҃^:Q, Z6]/e`! J u$ϥ\|%T18AB@ XA F 0Q !l*bh#( ZM&*1kK #l E!d#DB %G`+& Xr8wNEPL.@D@(- ^Bgu %ֶ ,"BlD8@1$#_E .H#UyLf$f$lIeRm)HRۧI܇T4#:`B N 0laM" H@DRZL+B-06,S@0""2,g{~+d@ǩn䰜8N^QybyI0jE"HPfy!TB&p9N`Bg[ "@t8FrN1B8?zi=,ygiUKb#Nka!|CԣU" quϩ~PO .A'@P *1]s .El"D!'0jy׳бNtp$`  80 -pDhXhpђO CO.[ >'|* 3%` q^R^ ̡@#Xo D;@=B0Z2Vx@)1i-',[x(6H@R$Y{ t*hx [ c(6EXF؀8CUCPP`p6- J0C@'Dqbp =hHF T<! 6=##(б Q(8L'&]'-LQ^`(1)`O98WHHA(` L03Bk9Z30X9_ȑt 0O뮈Q0EZQ%;7p.3kchy*?B?pMpUg\Qg' <(I.;FP`I"s =A? 8kn=S %2Ų3;HE` 8`09 @(b - %"3&`?AY OXKN'D'fu37Å6-f""Qad aюb4!#P˞DbF)XH-pt"l<0L*WJdg%P'@*0]x@ K"؀ExN#a2(SΓT)4R-C8ZZ=sB)‡!$W,K$P@0 ph\Z )(2.^%#8KZQx9$pD_ g=2\ ]خyQ‘т۱%؅ q)(p Go;/Fq (8 F$0PPFhGp PB Ip Ȁ Q@aVXD 胯  H؀ PNsA@ŀp>>Z\_p``_`b &hUMPU.d$)}#9v14`<:˭b;AL 3G# ,Rz G [`7daVPH7eG{J`%DB ȜG\3{5-&` ^V' '`Jc bUZ !YU3^ Ӌx 7gH;> -It&b8+H$ LLFbq 8[p%K[0yHKG X2D; (s<-PK LNU_EX t?HN`%EPϻD +3Rўef܂o:sxO )d3ĭ 8Gee ޸ #ۯ%W8m,('H 8 wf.ТQO \P+Wb2X W'~R#=!'R@p7`(XPKH hA61 hpbmcNpH< (CMf7F\ۀ<_DP V*YIɝ\flf5*FN%S&2Z(VeV 2eVֲ汥U[ZMJB1$:k1?/9Ô^hhb)'Y'Y@ߔKx6E0EXExUP_OX:8j >PG}^ A8AEPEh+Lf΀2, 5fpJI/;P'J(:%NpqeJ Y}Aм "58&@A[mV[3-Uxoqx*ɘb6lPf *8*8Apk"u7 \ywe$'NP ؀M`0HHHpEp xs87IPjn/1KH@  &mBzoI@tC^JN%&fp999Z0>޶a) b# 審kv oV2ged?ײsw\pwqgP˝qbbH`0|w!Lҭb(} @Xi(cx4?I菬~H :g؂f;)LdD@KpF`Hj^2LUw78:< 0d9z[ʴ0B,W`xbѩSN)Z|!j SP ZA/_NA&%1bRd /&x)х Bd ȝWfiXAƒ:dVL:֭[E:r$W$.YW(Æ;ve͂ ??(6Q$! hZ|TI#HЄɄ&,!؉.\ B$E iY6 1d"D3(@B 4xȑIƐ( 4lР(z1=vJbS{ׯ]YO~D0A AB `\0 $@ @T"i#0I (l 1 :|D I,Ԓ0.IAVXA81.DG._9uUQMŔVMMSEtUKbuDZhD/2]$s7 8  H`IHƘ5  #XE &\b i&`b )d&(P#lpdrg4E5\@D!DW 4x("ˎH""e@f/M<ETq2]l!2X#8~ZA{T-(3HpB$xLlo=T3M5e6|!#\'.B(3HHJAR 2HJQ!G9gEVMu5^-y[>0Sx{E2YQ H@Y'c;ڀbynHhG .1 &'Xbi +l  #,AbXl"xGr"!XQB 8y 2kQwDY>Ko(P6E v, V(3% @r0Gz Іidc5d15qH0H!h$0 ` - \! #%Pa $DlBLJSS60hYZziHFԲX/i@m@ L '"ڂhPRPA8Nx/h&2O p@$P ` d@C *eF5\;(` ~x&@Ӂ;ZDy4F0BYd2 5'?E&$ u84N (DP*D%( D@6$BwX5: '7Cj\V^  LQ"J# K2 =#hZA$T2@ `0C AP Py@`9(k+!3F,+ 4C+(C&R/`l B {vg̒ :OeaϨ!(*m}Q?}m]z" Jk/bA ^4d ^ O4@5mx#~@D1,T# pq(dA kÂm [fp4Bp$#n\-.ѿBȐ o6f V|`@!PXZ!"\!*9܇  `pٛ G(B3wfK?X8mm.D($ZP2q; ? n, [㴡r@L%`5zIAy9AC7&;8(6 YX6 `#DSgVV!$S7YphTix `=`;!&fb eH!{@$ " 5J .QV7A$, _C.H]4AwchBh4yI,AmϹ>ӰAВ v942=T uMP "'Ā )( *B'l`X|^5AT$u6pD $B dtB%ʷeXe1#a#8¨׻5CLjH ]1<+oZ.VP/ Ņ }KKXC!D sY|DF-  P#x'(*+ $B!8PAȁ07dD 80.D6ALHQ@$H\!J#lt@SmG)B$C4X4OL`A\@AL 'q\| CdJu ̔ 2!s lC5 mrQPbi!h*̈-8B$@7l2tC!A1C8=C6\5<XteH!@ LS$!]gl^">4*}T\6(jp .̄ L/xHI1 AH'WGM dwl@3ABNlBnhn~< lG~ 0pX|,4MX@`Y@@=c (pC624@< GnQ\  B (#LBāt`"A34?A<8B/\CuZ.B4eL@"̀&F\2mG3i#xЧʭŰ5dD 밯*' L1T<ņ  pqhnDQ1@D/@׳u(eY 1@2$ЭZ4Kȅ|8Xd>l8 !TkHq@2!(:`"; 6Xp~C8Aԁ8x@m SLB"7\#,7xLCvA7A083%4GC<@BOfBk@BJ^mf! 7BVC5\66VJqC7t'>{ » B%@#TKB1icDؠؐb\rMdEK10H!p#D&eN- &ABqI/Er`N{, @i'ʁ("ؗ}q U/hޢA6*87xC|C7pCAA7t!4$lC44@3,@~l @$5A6AE/D`x)\B)d3EJ\4q[$:, 7j;d (r.(* L@ P@!Н \)?A G  p #@BI ,. Cе ڴ1 wUx{Sm|Aا5ԁ!U%G3JV*7A(@BgA0"t@ if7ĒA# zC4 A2c1E/TAl@$@% ^^A0,bJ}@MڭO6lWo%W,%1$l@$ǪD4R`L %2>4udP܁L! "hH}?7e1cli0Ӈv>|+]R7f*F:$@ rA?@@A  `$R"]$F%ţ%vdv)~yb m 88 @9C&`;Ϗ+x.dK * @RRa6 !D )G aHhи/F\fPf~6 ##" 4̐[#'4Ii H(" 6ۈlݍ6Ϯi9@C4iÍ .tI/=*lđE "8@k(0>X; pa:?CLZ &@Bi?E%& k|"`"oȑG 2p4r ;0XC`봤^ Y : TXd:h 8H$6@ 2#kI*Y kC8q$rƍ6&$( 6$ BDDk6[ApBvrs ,4LFtZp+;;%B=S$@D)K&+x!K (o`CkXfhƨwmx7> BT@#.A'0!"L/ &j 0 q |VqZ1pEQF! 83'>h '&ψBcHQDP*YXhQ* YXFAK- FW Ba +(C  /8C ʰ/2E(> pb+؄&2q$&A|-t@ -` L`0B(J J %x0 ;4  ?vC3NukqFrQ 5ik@" ][7\" 3lqB48NhH,`xi|ՇZ ҟ[ !A,fQZZVձ^jK0""ɘ.6@Ai20`p  +a$S`Md b` T@+h #J01Cc΀4`g, Ba[=V@ `L)DQ9  h? @P+< sPP b k`gHj\ \7XIĔ$F yyAe  Fm Lp;G^Q MWp".A00Dj+ X/0 [z;uk!E@K}(vUl$,pE"M J{~>X  p22^@&03 `@ )\A:Я,h!! Fx2 pf \p翂  `p`b |lpp`  va ؠ 0Ta _a 9 B@L.L,WD`t`p\a !!p`"A > aV@ pAµLm0 zzz`!Aj"@H)R`I p .XferOeVƸaԫ!g `4 .aZ>!B@Adh`l\@x@|dA@| Ӭ q"N Q `LŌLda4P@@ޠ v! 2I`  ,&aB2hnnuLZ"^|ĮA= ɂp ɣA(a*D % p ^qh!T@iA o/#j!0k `~ >cD,*6Z@\ d`HAP|l`&ą z!7 r$N7- xAfHX@A,,G b ֠~z!YȠ@4%a a @+vP$NDNaV01,,A>A[`:<atht`|d!R P5N@ Q71A@RpA@,a$i0Р` A#B`4 ` (g `nX8)4 B$PH ަG7 0A[F@DvDM=LJ :gd (fj-"'O*. tAJY&dm r / 1!A&W\N`J 4!6A:3@H5gl`FNY`2 P 85:57iP? PQq^*a O$`  U@ `j!4ba cԠV"aRlM?HLb4XA 6Da]'!:a6*! awFAV5,a~,^XT t -ʧ|aO-(+$L,@*2@6c=rd1"ʡ@ȡ/%j`0Mh@zGPhVZ D^`PaLc@LA-x@x@ ? x QR!= sx!!6@"R<:A@ ~@ ^sa@ !$@ ᷆   (uS [y`J| l Z ,H`h52%)FJ.a& !إ| a |"`bĤH/`a~7``lr X1 4Loa@8` f *ah3aM\\`DqjQX荅yp e!8wy`m)N AQ t!c P^@ !hʀ,!׋@ V @    K($nwxA|l&dl8p*Z@ĠH: _;@Z`:yANJb-|AUA,1+%o[kN2`~Fd@6dEA>h%j- 8f4 Al@Z@.4A<A!a4fbDQYAxatsl+uQc"@` a:`PA)a"A.@! A(%!f$F `ʀ# D*?)!6h T!\!@`:@hl܆z߃(N."a9AТGCH{ aqƤ^a ;aL?0 lk#ct:& x ,'C9&440A4azl8V>@<dP| ߊyb|al=Qm4F rwUb(A-!C#|   AD ̠ ` j! A; `(H.,ʡ\bJ{"   X ȩ  Y0vgF`lL@hWT-p ~[d@L;M%`x8}Av b|ѩq@.A@a` J ( . | ʠ|t@@ @a !(ֽĎp=]jO 6&"0™6tp#Wa^.5A)`|A$@ |Ƚ$.|G,H_zP5"l `Խ0 bZ1dʐa 64lCd *M”&+:eB'N)@ %CT R<}Z)Sfˉ/<WO_P"E0_<\KU(P*aŝ:x1iOCI!oeLH`Q0^KzM{`a!5e!`@mGhӳ[a0ĈI(M%#4OA TB |0SFH @D A'`b(G2\ x I'>}<!P$,d!`b0@N D|,6`E k]K8`D=e( 0$8Dt~"̧} S ȓg!* HD6HB{@AcPA E=_H3/|Aa(23ehX± 6xE9c . l@"&ZL 0GN|B:@ BaP(WO-b#[3'-paA!7 z:74CT cHaǘ 2Ba &p*7ЁNC Vf2Gq 9IBBh@C, "D(b@`";'^ЂRs[!]F4F m5 94P76D#D(:t*K#wY1ʇYQbAU!-©.t!խU(F1  $, Zd @D67PH,:zEp`ڸF!?! (F(@@ :5L zpC3qh0]F\+Qۛ0`h gh!V1HB' шHD+DRQ3&zDDZh4ٻEh`V"G<8ǑDf,q @o   H* `-Ȼϸ(F <HҠucw Lp UhCi'Z ()j`%=}'D "`ͩLRr1\15#0 H!āh8P < x]@L+]<_hFC0 XCD[р5\nC%n9KZZ/E HpKC2]Mα`!N Pb`u&/n g3 >Ⴃ`BJGl L@[=Ot1(rR`6+\!᫴śXQT7` (F70LCeYჱ~70 M(r #脐6{&XMƅ/ &@ Bc@ H5A6G[2sp6 H {g rv`} cp 0 !< z'm0Q@s@0ve e0r@ k# K%p C'b`Ơ R `[Ї6NL@ D 0P @ -`m# P1 \kP@ >`5%*{[|QsG6` 85M > ]U` jdx <@p2@2ϰ ]`P (D"#eI03:e ( 4 PcK>3+2DSq·,00:PATD!A= xA@YO@ 0"x qxi HP: MpP d ptcvG @0  DPMRPX`YL F@c@ >`~ X N PՊB@<} h }> e|D|6j6xi idp`vi! ٗovh f{ 6b-4-2e$.pT @$/m3 %l(:iFT-_dHnF  @0 yPm  p-t@q@0l 0s0؀v@e  `ݰ g '` P@mu T>ZM ́T\ +! :| _ }dx(B @vYUE?v&HE?dH` S6nJfcJELD  ɰ ː`P ps@w`|S/$R"%00zQc +5{0 >@;AUL06UUP ɤn`j c0r}0qq0 `}` #&( jPOPS PؠPWgP0mU P@ ŖUX\X@(axZ0"DP(M)`@cB5<+'_VLvO[ dHYH;dWcN\ ې `_3'CpkgW@B 6484`$1C ;b$i, z/ 2 F@dNPrRi#+: BVb8: +` zkÉ 030s P` 00` ww@  y@$J%@kJɆ[ id0j@ \X .( +@ & 0 _ ΡPƀc \_4 cSdY!'T\ !_P2 W`!¿!- ? ߠH z8 6nÉ6n JFBcY@. {, wc P@ c# 26Te ^Wx` utp 0 pp010 * y@'`@S [ Ё * p8  Pp& ƅ02P+ r/ F/\d.+ & {&;6Po  2yQ9p0Љ:P @ u t9|0c2T#(48@-œ Daa_`AA F 0y dp ``@pP sT #pǐ j@ g0"m6؀ ` a #+M b|`rX@0 0 ` Åƶ P@ /PDlG].N`u|0` dʱܩ"K=q;Kn6 Y`kzœ"6;*%"dp 0 7P N& ͉4j .z 7r:EEF6ac"6 @[$ y0 sAg  QnPp "o01z Ӏ2~`] 0Pe D`"3$ U+!Ё !Mi  @ s T@6P*{  { `` grm+Gh+bk˄]\䆑 lzhi Œ\ u`!!$Qq 0@`PAdč`|20SԚ3 wX6EGyaC (*F5pgL% Px } {P @*v`ћ"|P k duo@xd@j0<~=%Մ SP ǰ!""X0 P`ռ@,l$0qA@ 0 UlJ.ȾEsie` UUS[U62(B tPCU 'l 1b̄a J!j 2F̆\5_c0=2su` j%{3*p P tvm0 iu Pa xs` ~``= Mp ui eP @pP F3 NKЄ0@ HP0tpw 4"{AF?&*[\E h0B20 uQnjʦf ڠߠroqI4*!(!D\b,faK0`8"E/aPQI 'NPŋ .#uCA1*[>(d`P" ߲I4hx$"T'K(9ׯjw hs-C+|i#h[5;08$>DR$LXoіM6clBf Y0|ELIb- &*POL2d)`NRB&љ8$1)S b",apa$\hV\qEZ`TdA(D;'%G)X adB &l"B ^|9J>FؠhF ,`llJ"@ mMf@L0!Abh4%oP`oP<9n`F" >(aH"G@a%v)0C0(zi&lPpiNcX@=f0$cK^zsXIx#PLp<18&a$ ƿt`fa"dip08m$60F@ |XYdZ"rY^ )$B҉;b6& ^(aC C2F?#B8DEcM*Q4Jg!= "(C:NL7*B!,&(AH`)Xo&]e&vi" >*>& o  }!b<acc CB bV2 +,$_t1BVLŅHAH8F3fhb?)UB2k fŴ 5pCkX>Lvh( XJd$`$GvV,$|\A X@L&@L0Hg205FA @X"p@x =`.p a"@t! B61׽JPK8B@] C6 AM lp F 'CF :  4I`0h C|ie#", $7l k\# 0!,I4U40ACC:c8!` 8DZ$ RQuXb`D%ĐN|!$1@VC$H"` ̀uPDpF0CAPQ< 6r[@ΰC@$D4hLPIH(%.14k5l| O/XO01.!ϠAC0d S#Tg&L@ jjotC hF8t?3dh÷G`0}CWB1 2f rcC 8!vp %@$!NqfFJ$THb$@`t@D *@\6ap1l,DbP H@ x p& a3 # @j0#*p*(A$<.l(f 3&ӄ%,!aIHB2 x>8(x9 @E :0x@` m63`C%/6"Wɕ@\2T#B8ρ Y6#5~K\Ze%BU q n& #0AL#,G9rN&؂ P` 2/!u(`07GL 0k 4Ѝ2!Ql@ x@PE4"]C44NmXB0 X!@0\":kTC m8400'!h܋%E[*AB5< f s12np)ScFKNvuY4fo$@neZW>C!Ze `p B Hb);iCoqޤ//# x"= $E0]=@ xCJoHC @Hl4G4# 0@f`c6"؀" uA#H gX٭qo5x)`,2˅$8^]&xX3{*h1 .NQhcq* r2 5[:r{R.y"TC貧axIe0s#5QkІn@0FLO@UW%`Ϋ/ 93\ 8jX xDKhXC d ;KC؆g(`#hAEh hȀEȜII`$H()G׹&HRi]ax4ȃ(P/x..hqg#LtltkǶ+i{/XAxGy .o/(kȆϙؕD0@ThY &a a虔6,& z Po8@&CDH (iYE hs=8Ft҆ C4 P@(g0 F؃0n5 h-ŽFHȅ# m1X|FDY0c eȆ5f2/0Gq M qllgXHLA'm|mAxGTgxRcb5V{j+؂jm9 `HK@M؄NhOOxQp  cIj;)` b; h O ؃E^?ȃ9Мk PEȃ-Ȃ/ ?A n k \ Ѐ78.=Q%'Y"JY܀ p[H_034LDƠRٹ],(pȌgWqkp(@3pk:jB-2x9(JPm > & X PpG3;%32L$'XH=3y,؂g< G5-G݂HA֜"GnͿ|A]54(K7 ] Ȁ̿H!~NMXNpB(I"]`2T]X63!Z-%0dZ84 m J?8IbhXnn?hogEL$X@7H8pok؃?Hg(/Jp8h0TS5o#+텝K@ڹ\,Pm*(*e讙F Gp|h,r܂+^sD|A"dٙ]YoYG_p Z? @ ?sJGH$T;dOZxaj&8)W( oh2DPЄЃ*DD`HjB@PrCX #8X7X`8>5-Ѓx3@RPIZ  ޝ;<+3= :PhȂbX_65s\H;oq]OԼ^"dYYn rldGh걀 H^d(S&ㄷBZfS x ۸ _@i]ضkvՔ(p(6qU X@> 0 :p NZZ:@pІH lȆ8(n7ثnh7ȃJHx8*(I(o 8 ؄Eh\#iY9A(@8nIMGhMqDNvӄS|S&Bt3Іϑ:>x P^DH EeF(`GxŐm֯0Yc@q!:AB rj!7^mv?B?exI@g&(6G68MȄKon8Z H=4:(Ȗ2(;(4Q Us|QSHUPPRO0C, XI8{Gp$lӉT딥Y9s2p7B C@C`/9eEЀEp hPP9 ~`ۭǶdP&e(A*cP&yj OW*[aۓ<:랃BP qbN;mGp4hC+K06 hD'kH@0>/?7Ȃ:?P &OMiR?>kX)8ԅ)Pd5MLnS6-MdGqeV68]YS ̆nx8=@ VCHwC k- (DqfT!oЁb q[PrAevxc,XɆ 9&dfk/&^3h90GrFPETx= 9K-5o&Xo  Ȁeh2 b0,Hx30"QxQh\QhCDp-qvOfSe6킄d ?_|}Sd/'2 n8(؃1w' ktweieD> }+HNQ@!XdC@,8%xiqp(0 /)Z*@5ЃBXG(FKE)V0dG7`8#CL xk󇄈ָi3(G%X` z$;THaP\ c Q0^xڔi Qb˔(S $J0Ů\IeeVme._}uf]݂6gn6;nn8IXpA$LPB*"C2hKx0ZDrE ,V<"FbP!EJBŘ1dȰ`L2+ƭwoĤ#& N|=7F1(R1(ԁ9I]bs $d(F}@RBAgA *\bl1 &`I %x2W GS'd RTL1DSQ 3E1UTqLTXTdeUX-_xL3[tqZfVaL3e7 ` 4 @Aa &X` B0FYXLR ,| )"Q*./* !Pfq) Z\rI!0Mrf t C0-kj9@|ri t@%0$ *4x%{Fpx*|B& 1q"SEw`0AF4bC'  2 C prI&|B8STyWdW]JU]jLn%VXi 6glԁ (h -6R!dUY'0`+>:DN-b.H˪H` $\0뛯k:XkEnI]qR,ɒ'0@;yP 0 ,p$ C#|C$x0`HDpB& 8\8#nэ $#opc6 TA" ܰC6QLE@!QЀ2 H@LHM(Q)P!VB,eIKaJP kO p<,~ }@ e"-&0XD# J|h|X"(3p0- GZ P|PH  qzKZ$!I:AN9vr#;a Cɍ=g:<"L4A" 8)HpB (0Q@ oR C V` H !V DBBd xFR PB2 DA Ss0pA& I xT)QJWR ֥tѨ5p Cx@ ŨF"^lJdT` 4!( Z B:+\EX|ы # FQ8 840}G  IAuap*G;PrfZҁZ#<^@ ,@`)X!=p H!2`00 F`D̡ݰCATp|x&43d  P mx$<T#@@"&1 |,b :`@p@` 0A"`)=FB K] 9{e)K<0;}`^TP:8Ƃdb!77+|UWйd*UN &Drp t z (2`2\-U##n#!4c@kL dь0( 3xBH@lꃚJ5# \MpsP,D ݈CЇ"%bXz; lM4P&@&4 NX lR0 mGpbd@ t L)H>X"( )~悿=8BaH"G7>NyӬU L DIPD FR\& >`8 'T` =tH(\"A6h@B$TB$ȁp8t$D4|V@b܁4* d` ,2A6< BN t aJ]џ^!(*Ai]&<歀 `Bdƒ& | @5) ȀOL(@; B-޵\KȂ(t Bj)$_qA38CᛊFq 0Hq혇[z 00 h$@ʹԁ4  .P6l5T%@6 B8#3TT dA<@$@؁#/H.Ά1/+h)Pl ( a 0: L@|)^!X@TQ$D^fHbB&hi !I&@ T^ l'@@ }'| '(Ѐ* [\v@G(KT "/'d"&T%H U"[x3xA G0CiNtL0PÉ! $%PB"L( H'̀" -\@]( X Xx@JY8M4Z~PL@8B@w0//-B l ,t: u2B ڤ0 WyHZŤČ \BJdi^ g$&|z Md |B P'LȀ (AxF\6etlGFG۵@+B@ `*xVXK$a3d⊉N" oPwtNlx@@N "P BAp',A:CtR#A5A(BPI3h"@HB0.}@%#Dc4tBh#k"@.@ 'P&fk6_[vշ3Tb2o|b0v G.LwhR> O.d@ $$ @lL% (H!t&|%I$X0\\7LLA`C|4A"(@44,DCr/JB/أ-@#t""(FcHb/.Yj XK ךf Xٶ%-^@ @ Tچ@$$(>&޶ *t]'n躘ʉ[& urlǺYN'j$p-Ā$`*.A&(o%`* 0h(8!\lA|64@FA !HA3DC\!AA(]JN@} 0B^!B<#R^ ta֊*}pZBs0 K %L$D 0|<8?D$\# d@˸L-")T>g*k-'d0'`-X q+[Wp0_Z' W[>ǹ >gz(+u1 ( d$1B@$ ۀ8π/H.&x!3 j/LA0A|I@! A0DX@ȁ&p쎲8 @\ l"[PmB'$PzB t@LVH>Fs%m6ת$D$p ǰ#IB ((ᏘB<3=j1].i?%/ '׭w(n*DREJ$y%#-BNo,dX A#@ <'\ 4 G 8 1 A%'|+ *`ØA<1,1dn"A\ā"(" tDC3 0@\,3`\"pOg$Nq&K$}5Z—-  7VmH䀑ܑ,(',N03tpoDcƌ5:u8Km 1 c-ȨHb 1bĀJV#OdP` 0 Ml!4q o(G&$3ʀDAěg &ZQ (@*5 x0P`,",A$kJ*y0M8\0PbZ`O0:aATLJRPсWD{\3քh 'M7ߘEPPDAh唡:BY`xs(%xq #\1 !O TW&9ĄLLL> Bh!0X9 b2ZX@ HAA0 0FX6JH4̰ h5 2(Y@"gF @+1h#0AhPt(B 82^VP\Ng:Y`P@#cz9\Md)@ DaL88pQ4yF2A%R0"*0F3^:AOFYA N! Yc<.h$6wD0,h(A "t'p68Z ~P XTpo?ІlhA%:0AhAdLA_, &>pp%s @N$2ΠNFj02lib%X!f4A2)h6H->-H"'C(]⎢Ћ 1g6'׼<Vl W;xh:Xctޯ:A)LL L| a=PZhJBLA<@- !LLa hv`qAo[|TlxK7` 9*2A@2B"0krl\@nc*!MԢMFd"E H-"ݤAU^-*AjofkP7xcUr8Lp9r*:t򚭦Hwt:x!x <,5Ll`Ll/h`$>A.A ƅ`p #c`RC4rd1K4BE"S,Xf3| MNnCH(Ա3sc׌68Fm1:L:0'̎ @ Y pA ^7|Z@q x D`L@TdHxr( La|d7" A!*@7o:A 2H 2zϐNPn̦&,T D,̦-&!1"1?0-0Ha%"E"ՖV>ah]0D2aH7t#REIS`H8L|WqWFW#WlN XU MG xE۴c6FTﴠ@ tL`A`'8h : p 4Mpt$Ephpd_4,TB2 !V`L4s*Iq@+Uz EvK=iNG슦-u$\`[A`.9P(aF5.V[bF11a\@GUσ2gp g,1l XF9pJQ s6qay $VL(  \Ata7/|xP tNSH" `4@`6@}J* &cl8hKbKcap6{E L2qBK,^YuyR=Z!IZі1M@2+Ao|-pv䚮o|@ r+p0JTBT|-;At@*[XW6*5Jy v @@ !f\;@, @`@@8BMT4Q*Ov. YS@X`,0!-*Z@ @ /l6YT-쌆H 9t?@ǒa9=;K -ӖEqyq+"̋xTnhTnJjST@^B< @6WEK/ƛPGسvvT <!``  AJ_pto (ہX».]U@<"N 7:[?BAZ?d@PES=01m^ h"&JP…„I!&e"T.VЉG&4"D PhÖ,X!SLf5mDSf0{*iVp MjD atSǀ;w ȳ$hdSIEJFt" N-Xx'2aB"aVxz) 'xR"R^j9&318S&hI"Q2R @Hs}䡑I]#H-xq)KheRɸ'A<$*iS PR@ I!1TdtE9QGr/$!h1C4ZK>DN2b"RV3^8Ì1a$dL  $@pv@sQw䑇 0 w# xv Ib )d&) '. +hr DH‹Ț7P8 '&_$ G^\$$_ȮAw~} 찒PB%* I 0آ^!&}"'nQ_%B'B+Ђ 0KE 3aT :D :!L "D (< 12DS-VV\!L!&pYāxC]!r0@䱖 $D2$ ,at -| f,@e( dɢB ш*4-VX1qNY![E$ w^xIrAgsz#tDk'lTR /-<|F¶b&ukB؂0BуFF$APx p,X6`bs`,D  ۰ /b  3b a8h%0N -8WwsGx:ە"'H &X >$cq'&6@.|!%T0 H"Cw=EÜc@A G["%P@ XS܀.P@`@t*ѡg>#E\bD d PhOل Չ<}P~^  \QSXAT\^Mjb8ATA泜M$g.B\t+2n"g?.!&7O~,az\gB! BH*`^GKj qhB8+hA _UEQN8բȄ  :qRNptY( p# < L@FbJϬ营a ,Ft#%ӵȀ2 @>:1DbLGtF@WhF'E`^`0V$^ V8w8n&z8 K^"ۜ/W^'O $1J`ׇLxFP(F XA Y1|%P]E,ĠIx* ^L/ | daaL: xB'Ѝ:Ё(/e,q *x \ (AVP)&!Aqj8pm' TB1b9E;A&'i%N# #dM hxa0B P 0KP*lbhA_WݑR_th0X@ F!J`>O]kmO{~J [0SA v5xȐufp4a\*nW\c #`=G2ƪiiuZ ^RhCa@rꀇ<0X2!p`D Z )h`T̀4 tJ0ܩ9 .(| h1tX efĨG,u ,x#&LM~L(2+X''<@B,2 H0,@\JU8!Ù2*H @8*p`Qi*z\T I; <0l.0C A,xyH88\< s\B42",SFZDR*4U @nAWdG5(v6 >\><:T @` BFP< `d' F*V/th"" :8pQ&RqEQw&b9Bђ\1nf <`nr 6 B*ak @s.)'z9 i|4,BQC& E x0p 5 @yPp U p&'=YBU=S2 DJ; LT v=Ԋ } E %@!,Q% Er&}QF"E"2Gs @ #(\@Pkw `;~< 6q_& i( @ R)i 6@@ :`wIw) y# 4 $P*0 LT  F}{*ur'} Z<%a&P + :@D 2   &~db|p0 (~yj8 1w&!b5DeV`P1#sL` 8` P0 > {QhFWDQ99E5+!vhDSRPY>` b)F  re75v 2I( Wq@rw^e< lG0 >5֣ -B4B5bN._2/e^f20!} + H92y0 M` `uJe 0* PWrC  \f 0WPJ Lyh->(ȱ+iԵ&3uS 4 .0 H0l *XfNӅy 09K q6`r?H[bw7p /_*pj` [U(  `f3` w4@UF`Ya*UXR(@ PP) D @gvg}P \1UJ.Z1"k6/. \ \a p4ʥ ۂ.Xit˜>j"6G6~}+ 5IU@ @FUj9N#q(yjBf_ ʡ;* , `\xĠ jguhO# KPV[@xN<rSM.CЂD࣋kH0٭TIR0[=[3 gV5H7a 8#Ce<2$5A J@".@&¢ 4w@ 0@ER^:h$4uz)9D`a1x~LR >Sr W_gbX~5U1p)M;rE/80&p52. 1 a>ӖIt ( # t8UB b DH@+q Tֹf  xg<ݫH2`!:JJT9!v 0 \= BL |@< lnj-^v2EΫ>' gw*(. @E{(p we^7S7S('jB&GCe)M` lC:Ei9(|Tq5.H+s ; :  >[  rW.߹l,xUX[;!c77.J !qchm 7[3A #j(( . Ԏac\OcGeh_ >h˕!Hx)AD)(#e ɋN,Td%'N AD%+KX:Ir%(d(QDjfBQ SL)>`d1'ZW\]` H!P>%H1BR@,ĒDJXJiH 12uP0*)D4i %`ObE4 6X@0фO^xaXŕ"ܴŖN{j0! pQZpt[ —BQs+_ňX$3\E .0-ۤ7cX}:c8(nsRff \*! Z`)LNPaMZhAk{P2a*,X5B,Y")`xʝ!%tiDI$XAI#aJ.*ɱDdұ&2!D:q1E!9ه 5"pX*O(i@kS|ňC|p!H- '!Kq^ a|Q",$YE+]|J4$l1dC]9`-WVw";똀"paaשaQˆw)T7d"sdHuD\EG<X(s"* ^ [DM6q+`Y F JaM aJ\~+!ĕτ01GKI@NZ0QBA\hY+$a Z@ 2.de&Rc.''%x2St1 B hT"+hl+d^cNdZPl! (p&X0DwlB@j':&x+lh%/y^& ILz D$/I %# FZ J$>M )D&` jF}X VKBŧAą[af$ T(Lfpsl'!bxE3YCx5b1F*z ޾Q݄/gPXGtCRp#`A\XM3ZdShl@|XT0agDH*lPD @`"$&(%|<L|&* <։ 췉hC 410 LU`*dam`S(5 g@+,LƒpE,pki6=J R"/!fkp(>ʠ@tPޘ '\>00ƋzprA B(x&(,Taؠ*'4Q"Ƚp(59&Ҵ> vd[&9ZT3fqZ'< 82p8ThBfԄP8@&+`A,Ȩ0K"{$3Z*F!?Q|"d kG2VӔ) Ԗ@*TU:V*9W2$)AO$"F@(H@"މ,, |V"' F@ %B| F @Ჲ٭}ftfgj4 lm"6ȞA`2͕V+0+ƚĀ0+s;7 |I3EധoCC2*hiOx~(2IM" `@$<0-HӺk@`˺ Jp:t L@0a `H@W8LFNV8N(ҁb!ਲ R2&=xTA`dzp i 91!`)l%iRHʤQShH 5(x4`0G80J`{K8_X*R *Lp{xpYU! j8'axb\@&2(#渎C8d}>ɥ٫ cp /MxFGDx-ӕ@c@a`T4P갈 <PW@ౄIx;g #H.GXW|lRSU)ОDJbg(1 UB,UPQ bYqt!P&HPѸ ۛ"<GȡÙ7"a 8HA3!`0-|Ўӣ'rȱq1)zFMBGhlEXZ2w 3PLIhHKKHP9`3H9j=̨0PgiJKO[*WӞJ0MVFrVĿ"LHQ0x=|;Ȣأ(V A Z7!# &ʼ  ̭$ u&8ۃh6+.ZyrKRP-b CHA8g$)F` 6DBkG۰NP/8$H8kH bRtJlF+= mF sJNHf/If\dphS_e0NȄ_S>ȃCxKSN$$IbH8YV0WfʭA=)v:,?t'x, PZЅ[!͚(,0!e3 ($-4&d0ǰpNh EsEЀE؀ 8P00h́g:|;Ei;GFQຠYHpqG@Qkŷ|KF xѮ4hŮJ ʥjK0j`EEȀSG@9f5qGRhDQ ɑ0]WӨ ɝ"9j:8()87yl[y Ԧ'z0o  H+!, ,Қ &P"b>^  <`?(CH `V#m"BF 8^;_3http://cs.byu.edu/gallery/d/802-2/old+computers.gif)*+Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-ModifiedZConnectionTDate_Content-Disposition^Content-LengthWExpires\X-Powered-By\Content-Type_Apache/2.0.54 (Fedora)_Wed, 08 Nov 2006 18:33:42 GMTUclose_Sat, 11 Nov 2006 19:06:58 GMT_&inline; filename="old computers 2.gif"U52914_Sun, 11 Nov 2007 19:06:58 GMTYPHP/5.0.412fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135mr{   +0FU]jw%/48N[`cpOβGIF87a!}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMKKKIIIGGGEEECCCAAA???===;;;999777555333111///---+++)))'''%%%###!!! ~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNLLLJJJHHHFFFDDDBBB@@@>>><<<:::888666444222000...,,,***(((&&&$$$"""  ,! hP*ǰC2THb~qGNMf&G13˖0_ʔs.^wjܬkn5S)Ǣ3 ?=*Rjc %Xٳ $9h0p@C7%ɝKnt ¤Leia &a''5HLI1k6`_> *aG?!N{ɷ=O# 1ZD'+ˣVf黝lH7NJ]lt5U]{V{6У˟? )5߀$`~0d:xg^ Ѐl&\XeId@ & DF XrT`@0c ;CِFA?6 ݆5!J1SP!P]VǍ CJhB) &PH`V!0`d b{{!x"3NЈ$hI|pҁe|XZ?xxjBP bĎlB!SOCV+-FyO?[>99O?~DG( :RK'p _@`P@ " @I6;v$=ä&HJO`kjۡ+̩NB=BB`D!TA$O$"E0@ DPDX @VHZ׺V8ARhPb)$zBV##@@F 0%@Dd'+٤ZDfP ZFG衐<G>>2[V]\'ƕi+OP)&UbNM6 $F-t Q-ycA0 rx )0`y^)XVtJ J@':/zGĚdD*’H){Yj gEl @ Z}>ĐxXl7MJ&1{gU/!g_V/I5adI8#:;z w״doCi&Z.IބkV C܇V\"1$βlVtKo[F;oWto0`D`B116A 0>?ka־ @*nC=0uNp/g/:&/brFSl JB'I6Pad7ls{4849@k%8&8rpSpP6J!p `   ~KA 7xR?s.-. 20 z V P^ N ݠ̀vPlpP) p 6 @p@ &pb1ʨ]Z[Br@͚*P_i8@K=aһA `i4 ? j p 3@|ղ" 2; 0p@fx  ``[(ͺd ` @L@ 0 3,.P#wP Ѡap%"n pY*0ɵ9vR=jlY = Aг?@!@p ) x  5Q W a 0 ;@ K` ) PԐ|P#/ E ^@p ~ĕ+`xkM0`` `@ p`{a編+HŐ7{ѓڶܶ":qY?*U[ĵpl qg  % 0 A @j 5 p !d?Ik SK@ İYr` `l?jp\jIPQ` I  hǰ",/,1L4Pǰ9찳ÊA b(yzrN Y I<qx`UbDb jn z637POP f1" pP l?E`K=O@ ΰր P -pz`zOd@ eU0p _b ߠ @@?bPͪQ%y\~>!.Y p@sd`n`L fP ^ 0B@ A MNf@` EqP n"@0zbrP У7 `0 WȐrn%@(pLfPp` PM` @NddP dP^-, ![Q<>=CL?l`R.0Z*p@rĎૢP`6fЭf pp `Fp D pp0:0 1l` (p&` @$@ $<xp@ @@|gp` 0 PpU @ PX`ѓϼzHd2?95iy1٩ys<<3J #H3ӎ=(e UJؓV֮I $ V91qlj)h<d d(F J5%JL83…Cfxd$Q!&HZ\,ԀтxpLTH;G @Ȏw sf|x '2yѺAηo`֕kg"$@@ )HiR&Пz zء&4 JF$q*ODE ШffRÌuaIF!A ^D7pJw DJ>jCFèF* N( H_$'E (gCP N=qug114CJ`'H8AS.y 2~f19" &P 3EȎGqO4BQ!qOfP@eGc"gu4 .X$H2iXIB"Ц򉧃+ưF+D))Oyc*:BDW@9d}Ԙ*GHRiW8Xd!̀N+9zg| E'qs>xbbJpDB4BI `",Ad@aF`PAE2)i> () "!B !@d` Tp%&1BY7 ;!1&J@'bS$6I {[mDxumQ䝥0R=!,sC14!f eivܘ'@Q*w)Gx .őS 4)4 yQI] R]qeS5@*@$2KFx;9 x UBA"ifpH9QЅ`F=La @$ajX Ā5 ND-h F31HYWHHFRLZ{ b~Eh@6p@D " ..L1D pb;@2fq%@"ԀF`u8M@0$E@5Ҡ mC@C>C +8PQ; p";D$( LX(86*h?@D?F!0D B~u/tú`8$.w[ ⢴/0hBG>P9+12uJMҮK^!4B 8@3+b!ZJ<@#<8bX%0 <H"u/ 8[FV$&anMP!F v&Cp/H(@b"&PH@2;`%><(<찎t梃$$`HbhtԠ.B R»$aXV |0 0A PdB?VtFIڝģ%CFA1 D9A`MY^ Bb҄ D09Q=4܃1C9}^z7A L Ђ_E)4&(p]`3(Dm@7y;A:l2LCC ~s0k1B2| x0|Fه}Ѓ `$hOXJкˊz{G:l: yIz0GMذer!.tpE ԃAf,p'AIz0@b?(*4؄ Q x Gs 8HIxF0hɖ XsP#nE[Hj(/_Ѕ  B HWЅZ0=Y_VhR4B@q(BC Hqa80ePl?ǽz@,Bc9}{ 14lF3x;iNRo@v("M"(# %P cLp  ȴ {zhz{D L A3hXkBN8Tg(>ˆkxk:XI 1lh&ë~I@0<DPGO#CzB(B N;݀I R0'A?i>Y8mB_J%_&؁cZp0 PK JӄR8؁1xj0fx(8 Yh4G?NIΙH:I kă|~7!T*j+j+Ȇlx#(a@%(J-^P*xЅ)0bhTO 0VlUx7v z`xAPv<@lT؁U|yЃk)02hgP)@ A|{t؃Hד H \ JNHPK;:x詀RDK `9Oq0K|OMLh#Xx|)``+%5O0 QXxpo*CA+Hn*pg,~c%sDG @`.,E{[.B@ jp[)k(2(+(r,IcX*/P/AȇW0Z+k >VS8͉ĸ`N -xX8!W44=Ƴ. &M PLIAPK@a pINXhWpS%j(PXPS5 XV?H#F'`X0=8(NЀ 8a/ң^FH 8L8DNpGxHig]Q_70VHB *Ã7%?J;IS >X uu 8x$[Y#@.{shOxIȇoXgps3p{(&@-x DP"0 6ЌDP@Ц Ѐ P7\*XF0=7A|@0&VXKTHPH $%o؂&l82d\JȌXմ0D(Jzh":$3(d0c@/6#pi 60<,@(ZKq#X'`x|8I]Xpm/m00*hH 7D=n7=lPT-8OhnImZCDžX Rok&JxU?&-(6(0P2DHSNU+Y3hrȂUha@GpM8 B WPR^ @G vMJ:cd$P,XH2Wp-pwp1GP<=R(FD GЬ;I/>6`vi`_ohH%xehkDe8b r<φip)ph@߇KEPIȄO]h'jh+pHzpPzpyhJN@-n0zp :؇XQLj@hdI Y\x؄O[E09Xy,;cEX`$(K8Z[(S(1-8cZ0<OPdh( Ȅ ȄLh$yPOMKT *hL0MjBA pRҾXQDhXpJӂVvQ`nHvxjد@? o+ݶu[g<3rIwͼyMcɴQ(ɳl"`*G8uTYQ4i"Z͜_djFjݺQQRML7>&a7:UAAP*&Cz=Hث,iP!@?ߎ(eZd׶qG%NB+\ gtB `ԈzB֑'>I-qjҔ@tC8O  Ȃ&M  hy`#DjGG 2āS 4p@57h)F|򱯗ξ}zh@wٴ[qr ҁ` (!~ 90봣0AE!s H,#E9Xb8'`DKh7oHc8D3x1!6aB*YiOD)Bҏ @L9`#TG5LaD/ юs= =c-1Yƌ3Ȩ2'2̸A'X6T \pj#f$I 2O<ܳ$  1 B+ 1M2I O?=l"IcF;'ܳ.$ #⁄ tYQ0!'ό߈BpA$$p~p(([3!ܣ`<@GMVa9Pc8갃 b>\RR6p0I%q͊٨#3J02.#8 '1  !;?  8M;| `x^Q 8 0yT 0,2 (dpLfcf؆ dP XQmHA Jv B8F2A2!o)"8zӍ0kK1x Ț:*FA DlC(@ T'6 dX|@4ML8(LaT`9d,|pHc `3 [`CD'H#H0DL2! ;58a3PAJ< ($JC$P8mp@`Er H@bFLG8   b H$! 3  0A pE`2Q" AE0ԣ6Qrh1BB (Am̈T'A2 2'p/A< X! T!#H$x)hEh:h*}Bf{wCh8Cq >TA4A * B$+@ @,\B"$%B 6SR `C,6(|bC  @ f+hƀ@Li:="@@lA;0%X½)\cB,c5A$&icdûA|;# ())@+ ieA6C7A-mAn&^ !, =D%@#Vī~ xC$d)xCy78$+{>6l r3IΕT $+hd+h,tB$$BH4A 80%@A5A@8=2@% Rla++X"P@&H""B%tCځ'*Ȁ ĺ@ AV9 X&d&L$x g:&8cti-Pp)ïMC<4qˁ!h@ ճ"_@ x^%`H*hÁ5p: 8U>8XE[,4p5Ζi;\EC88*L܄1pB0L9+DB'@ (8 Ռ4n:U(K@ X8r @$@h0LR&0@$@!:\3hPxA98[l4`^g(l`6&t( JƂ/  +&(B* B\:-#-p-d*d @tPC+`BԒ&:i!bނAx"4=BB,l2,029*+t$BDA830 *)h}P$L&#P;8l*&B )+Pl^'A>%2L|.$O5 @f$PT* @5&~1sM~ `f z\e Vƭc 9nʑN9lw&hN3·/<6hȤs i^( H_nAiTU2NtT<,tcFFbyfEniVc_G djVZ@JX&RӦ-Kg֝)a?2 "4\xP~SqQ!V:5 JaI%!N=afI)Yh?{ )M@fdŀh$F D JVh{!c?IDEig< 'ҁmI'}Zj< ( Id9 HtC;+6Pofp1&lCCtG& I, HcDfˮi_BoǏ@TF )68Sf+sfPXV)A $0BeV^EXAVDɤ<ST)bb"Fql mBmPmit2`D!(OAx#{x;:HJH%\l8'tI cß{ܘ'=ǎ~)9 0D:3Q .Ā'{guiq * 'Nʍ~. &- 7FBl,ˊgqfh !!bxmI E0,0|6mb o0 rb%PiPD(lJpbZ!AQG@SPibFjwk]xu)ǍD^].q.!3Xp4$EWL(iek|F6@wynj @eiU#3vp H zG8ijB ш!(/*wA bH@hiF7~C&han3aY6<EU ZRNH0PaS ;H0~,ZqH@p`dGd $fDpA ;XE(*1(b8Yv#/(D0VhfȄl4C2`ĐO1 C6 1t6HD"x4Co`nnch[HL--lA b480b c2"`f#cC@ ΰ4 h(D]5\ih.`(0E"r8CYWfRU|lxQ8l1'[Y/>ЀI4@@$"0W0uZ@B K:yF3$`ATU=1Mz# &!!!ОC0(JP GAQjT~"6'Bذ "%tjX7G?K X4A UPx8RQ#\7<^o>&0srC(4` @f d?O0ΗĶ! A&2MmA4 *$" o`&@&XXA D\mTa ba @J@a@$ځ  0  b2& `V:!s!4 `"AT&ao H1@Ha$`f,`:(`$Hd*kn"HRn( A`簤 aDAl@QLkLbLֆmm ^ @6@@`0>! $fO^h! ah!f`f آa`Z> ۫ lP!V`$Vޠ ` n Xa`@`0@j,VA  1$u`P dJ a,!֏+Ԓ \j^p:D.0@S !a)32 /m0P3DŽ4!4!밠fLP&676A2`rr(L\`jz ~:#zfL ̠ANAZa̰ H ;"V@q v9>ABA~ b@"f'8)(J04ahT6*Aj  z@b@nJ,4bbD"_)1K' *@4 LbbLLL˴ 5P 0B@C?0 \ (*\\@"s2`jdAN*OHA!p:0 ajN6 `LƢA5XX%Na0 ``V Bp ` GoqScA0t,(@,o0GKTJ `e7SF.B. fZsʡHJ!\@L !!T av@#Τ/7#UPAv@ ` ڠ V`Y} `jo \@,u-!.>3* 0t>+ /`A ``! vJ `a 8X#XXdS T<>a r A,IHA ^. 84.! !}K~c[\b@,A *A'"1XG``.a!>@98X :T!T@RX>a22@836$A`ap!1z2T@!Zn`; @ 2`;EZb^J@b!P"@]cb͠* nB V^X4"!}ydx N 8WA̪&+n;+}A Y@ 9@ FUy+J7;*908[/!03 H! pr`6' @m[ 6 /Ȱ͝2` `C!d! v@@,"@8Vad!`a $a jL A &." Dt6&P V@xkd6` 2`ΤZ 0Af/^u!QG@d\`@ -x~A"^SweJaA A s:bAF!7A~p]RƪW4 hdt!"Tq9_MaA~@F ^@` `6f!!Zj 2a: Aa6!́a J>@2*a 6`:` :!hb+ Sp!4I a}"A40d4 b8CW^z!{ ,HȐ )pȟ"`@Ax"w~3ԏ̴i٦aA.gdȨ c\M(,Y DV)44+YpAkChkx/0{EWYr@a&M$B(<3t3"%k(jBI&Ij4N#F-0-h;MXB 2Xa>xذI kh`! 6YTHP{Ae@TC+l  b 1HQE 0HPx+SH JL4 _ 0`N `@5|NS!DH/K LiJ U VBxЉ'-&")0K9В`a5! `ƄAM .t150XBA%, fH?AE9٘=Hbj \X##bL( P .!zqz1@xepEhd"O`J -"+VЉ$0CV2C 2`_`ĭx_\Aΰ%Zp0Or!1N6!TDL >#MO@(-hX)7$+67 . *x@'p /`H!-b&nA\A&PtLh\N#C8[d1 p`?p>ϳAG!LaaSp؇ %9]p \BE ` S)"qW`= _ np [7a/0B07A YPE'$A\ĩ#qPP@bP*ReaOH|``A)& m, R " ZȢ;aVOpx,`i!sAfpZLDb2#(щ/}&!CTw4 -8Ơ* AO;G@dÈ2A0D X ؏0B 0"Px zl`?)(`!HZT07 hVAL `(V aCı1tA0G aMBB5=*OQkY &0 V< ; ,B< Y&!@:aj+x/ta DvMk2FV =,ն \Ђ.4? |u.@E<j(!X`"AUB_ta@6A $P}L;! K@Q(5Q  }ԃ|( ЌkiHٰB5:f/M0npaZ1Ah!R {(QS$_-3&9\B2 6Q4#:!EЌg NhF1kcs @5@lT^`谏AB̈́0#"q \486"NMv /XPp*0Px&j ..i:ԡ' Pv(`H-<׸֡QP G=zae XF5=PgB `Bh;/KLlB6`cT 3CK0lqoZ >jiD+DHxʠ kM04OH W;G|f8*3F5 )XAv( 9dcN cX(5P\7<@&ZH= x6 [/AXqLآ I@ `v.l%\ m!`5}3^Ŷ?`uNi @""x"` aJH5K<z0 q"` Xy66) [N0S l-Є P܉b#n`p Yx6&bP;1'׶ BԻ:a2iI\0 @)%v d+4 NP>B@B@L g! aA ?0 ,= & e  ieZP @px`A~t@  PA`n`L ^2!t&` &P8 e8U]| C`eg@3t]P 7P|?:|̷=& Jq % 0@ 1a `U9^HwK x K!{r. BZ| T$u'I p  . c K0 r0 Mpo7 w\qPwr+40 ` p*wbj-PpՅ~`X K~Pi1 xtKtK6S{7pni% pQ 3)qQ6$h@ B SpJ& X `@İA pr0$ sd( R+Ts8fVpZPZ* `jpp0d {QQ a:00h3APE P 3  ;rg p{| " 4f  "r"^&ׅ0 y(PשЋ @  8n`9 i[ 9Z韚9 P%[O P@ YЕ@289! p @l p0@  hN Zx d pt  ΠC6M q00A0/  PA  pp JpM ϲ"P [ ˉK"pP `pzɜ$QМGlIs~2zT @ Ɗ , '' -0f% & ^a ` @Vw0 @r   pz~ zT 8& \0VZ0 xdcVn @' Q@  Y0ߪ a 0SP ;! 鰜 Hz@Y 0>@r z @#pBw  ʩ9 @0 Y![A@ $P$ b ^ ]! KP 0 'c; @P-0zh~P@ h @l& V` , M _V0e:S`, S p #Tg a 0$01jr@neV`=m* Ç Wl  @@Sv #7 pr'lY|h 0# @ 'p *`ZhDzpǤ0,[ A T@ &p r   H 1Т jy4|P݀\HOj `u }1 Ek f:@6 0 C @<9@ rp P$]p `+  VËy   O  @ 1 `aQPqh{<`ᆝj 0+pQa (@ ͺ (` FmԤP%P; | ,` + %G -0` @*!"@, `` y ϻТĄʆ 0P b lð] 0'Lp, iC I@ nVD pbJ  ; UP֠ Y !0pQQ$ \` J@eP*r)'zXz0 P@]pYkmPp-`]߄p?^p E  ]a "`Smڦ#c )A ) @  @ ;p N:r`G   P-Zؐ@ (Q: p@L y͠p| PU P. P P  `p_ =P Pr= pЊ@TPЏ nm| LGcK ?)0 0,b a YU@~= Ä'\O t\ &0& :n C %o ԴP& v,3 N80Aތf-2<48ZnnyׇH { |E`M G3аgJ ;VpE` !p䗠UŜ  a@_P `v~/dm 0yK$50 p k`` ipS g 1pYp(`Pkgd؊lK]5.)# ޺ ' / = , 0W ɦp ` 2 ʄ   4Psǎ;p '@ րf΢L򤉱#M>t6 fSK2 1-L0B&L4LCo^yPsD5*v۰d#S@-Ph(S&F5&MRa e9,oȉu CHԠ"W90^;W<@l*RdH bh%P&Ffi^?8eK( LB& 0h1“-\)`0(QEd% !4` JKdKy@2Đ JĠ `CaX&=Li9b'(Fj$c8&JI@$ N8%`B`Ld謟Om Û1Ȫ,y( ,3`8G+H`I^f$bqĞ eΈRBDhH6m>; 0 $2DB B!t EkmBi ha DLHL!a P :oG]O8P$ĒIFh7GI$DX{ĒE@ HhA`Fx vVA_hB%tљ, EfB!Dd &'V%` `v2Dp駍%l m|A'4@LRTAxT" \$y#N cDzHCuQ.8D_Ty!/&lqd yҟA0)WPD%1Wc0b"b&.dk5K G2ox-P*ituDF*)@DpCYi`XMy|`"MTL4BcXHV"YhB\p "30 ^PD"-8w R=qi! ВU&D UB⠎0`: )P*P J@DDD PJ c%\a*" =(4>83jЌneU )(H:Pp@кD&! e=Qk0"V aG961dDlhDGD{0u5@~X@!9X"w<@ (b-JhP1 $3oU2@@C,45#j0xM`_ @w ` pc Q*lp,lBSd*RwDe` IH0B VN'HCc8=!RGYb0 "$":@AHtL\b ^1K``9B nPF~T,A'0oC 2 G :zD%,J`2Hmj%! "#4 \Ȁ#&+:bD+*p@@-h!D F A݅5 d@A¸4\( 9 R _<9H!!ޑ*< R0i`0h2 < eшP` F |*F  ^. J1P xAAJRC>0C:`4ȸc0_c KG(, ,X@pab(P:p@H;^3 ģM 8`"H4S7| eDuDRJ%F1Z,wi!,!C3d_a3h LM= ئ?C؄6A903b#pB4!tB 70\2gT "a ,0-ZtD vSPEEh;H(  ,8DfZֲ2'l9t;RSլ^%1#\Rs < B.` Fb6eHQ $IL@$qCs'*b^@!@,$  !VKn a8Cpm`vAAH KtBhk9ơ8$ZWHh! b!8E `ýȇh-ȡt8FK@<,ppqc 5g=P: G˄lYVzrMx GB+@IR`P0HcQ}.hNBŢ2*PD`3TXa`I(`.0(qNpI s@@U8U @@;y899F8Fع A9@ZLAFIh4h3؄p|(4 :*" P *eЅWf&@DZ 2W(0'E0(]0 |>d4iuk*g4  LLWhX`Q 2dP(.Iq#]-(N[XuX v+@v"HI`B|@~zXbKCn WUE0]I`%`hAVTOx?`m&\H;`ABx $3pBX p aDNZbF i>PX XvU| S&PkXx q/Fp/8W@n;01>glwnjl&~hJNȀ j X1c\肤܂&Xil@b(0W\Yo.$ʃ5(iJX@{r:ȇ{ LlZ[h pIX p!x$؀Ѯ FnKfp> ) @01(6Mh PmJyN}uqKw}U]E XK0Xahm.\뚁_ijfXq o؂enВ<0w+ GsjȆjfHbHhxAKLtJ, @`N qW\ r*lVbPoV'cPqPJp1.@ h4z]ǾY `, K@" ȀGLJߧ}aj ؗ K QmuX,Kڀ KGMwMݥJ,νxBH3oN&eT_.j0 _|g0-xfix/x^2"z`+9)܇@#`*HgXfm؟΀H `xޚL؀ hHRP5m%bV{p r8{ dx"O y꤄ h  @j)@c*ADɒ &!LpR 0A>"օ7r8}aJ$4tdA `b(L-0dR$$@PEu8nKmM>& žUQZ\ڲ4fpi딛9pعVEaæ]<7@cӦ5Fd(:YF:hɒG(T2WX@uĩċ+M%)T_yD֔/!\`g7_* PiGi!B0v%+ҮMK*QBHSBZhdP&yFܰÌ)  xP'e҉ +GSQr 0B^KY2 + ? ?TTP=1 0[NOQՄ4 ÐM_6]7ni<p <Y)L3<1L8hpI-B /SrnH61dH[u} 98i$vA /My1@ GBpc )dBAA!TAT$"d+lP T@%Lp ҄XHv 2K 3r#Mӊ2#! A6)xT 3AdJd\A 5ba XhFTrŦx\[[gd @=hsT'YP0%7棜9w[tM/6SLr6pj4P iH!Ր @+H$,G8; $d!l@p SU 5q /DiC&(qFb AGFlIE .1CPCYNy f]6 " ؂ޠ Ю@'P)b3h.bԄ%ڏL! B>BHnd,5O0*Ϸp mQ4a-a烆5kQ#i2%،"Ř 5)"0a՘2qKL#L@ *͎&g` W i(X#S&B&W`K41& 4 6 lBM,P F*&U1Kpt_ A4 '>Sl̘*f W@dNwUխn-`*BtDaG,u  #g"6Qb\xƔ9k(L0hJ GHB 1felڀ<Uj Aqc Oq/ ̠ 8eB'$ h$0џ0&MXJ&K]AЄˁjX h`XK,QU#Gd"XQYJmȳ`jovp1|AQ K}?ڥ¢5@wϣv]t$ w3 i:!l9@PANaZ!aRSS`i hXx]Hp$A PH &F7U D*8.,:3 ,S65/L T4T<}%[ʠi6TZ1u%3LA4> .i89(*C H6@ 6 ,*LA@pc<#3T+H#PڡN¡J#Q I<\9t/Bl,dA"\BOv ( $0@8!" @# #x,,^16mDjӲ^f r#J'rLi!|] aL]AW A*$ %P@q=4A?6C68%CP2 5f_\Z\i\D> -SE56Hq .Bт KԪ"2 c,A`Cpj.ALN#! B6Ԓ;B ,X9#9̀"B8ZB$N&$P(lHXl,|@%h$0ih@).CA)6Z _^;``j22>c(G251* 98 BCD8];@?i ^k"#["[*.^%; <:#5:v38J4 gZ5c^* tbrH(H===99CWTADꌁ=dAOD6$ {\Ð88d:h@'*0C,'D $T'@@ 0c4dNC4@L-Zɞlm |80-"/Ԁ(D@("<݂#< 5@ <<34E *0+_5lgXm͐8ACʀv.\t)rv2~f\3C a%>$F$ib|:s8aөGB I`ƹ (Uk~K.`%p0FUV&"tKֳ&Y9Y™gy~Z`l l X7n 礣T'4|mpXD 1.p75"ɔG8*V% `S/OyFZ&0T@嫈uXBPZBР! kHd p8 #i[0.~Qh,\  C`Zf=Pʘ f(p67-g4! Gp=lt(S"~i#={ 8?2u&-2rb{# 300COOF!Id@* uA,v8\A>!A}Nv,A9 4bJ|89&*((Bad6nUҝc&k@-hA,fpc PoeA`. Z,!ЅȐ6'̣= MC)6UCe=fUZ1 )FV80"mT'Y"$#NLCT#̄6PU%F?˅  0rPLS=M-h X1x0hAX 856`.LGх2lB"HH;-='D{^vx G 9#%-nS>cu̶ZVowqUY! a#T@]!ؿ% `=/rƉ3Ju)+z5fJU(^w|@3$/ Ah@AP;5D;0OYÐ)L!:jqc$8NK(KY·AbXc7?9_y_̘'pV3u f` M |  euXr\(&4Ж:D j:dr4;- @&ڕ P$OƂ(?b~[h0V(5&p{8fJQ~!m !j!ja 6`J*! `AbB! ʭ  #,vxp>2V+ޣa!=K"H6D|M8/a> °DF/-* ` tZC|A0!S/s4..-(!膮JMho5Pxjvr f%npZ. ]~Ijl 6@*.`:*ց a>r!m) ʠ F \%6grf:p PT=QGO=1S@Ύ@7A8&(6 `ʀ` |p@8nҰb$0 `|q ,av@̱/@6A2.**F$eh!b(yRð@t@  z` @kBЧv!q% `=ڣ /F4@6@ƀ-#6U!6j2,=?,#/C72 jRV0 3 <b& p48`./R' tr@e`A^Cd!A$ &)@:842@*Ar*^d!hAd>shmj-K`!&{v jqalZ,PB_Q"4B|=  KJ0.@0A  qխ Ơ l Ehvxxpr`·-W&h@a.|77`2D"8 t@DA@`d)x! +N|5 +^><403 ;->Gd d`v`?G5Nj@jCnQl;B fL,!^=~#2Wre ಚ`V-@Ja&Qr,02vS:8⏀ttBqj`R< $-_USX%Xͧ Q0]sF#4S!&rt A0!T!\"/ xb z^5~ `B8RU]0(TuhiAf`,@ad6x^W)kyJ(i\ⴾXw  6 $ a,"-J  ڣ= GϕΠ=(xj2jIîhCWp"sۃ0.aPH4* A(`b @' # Ac`fa ^!$3xAlf|AvQ*:tKWgM*l(GMZ>ebr@:%:g5j]#W6Nh U$53M,=(o (FFȁ=xt  2BTANޣ_ 8h@=> .Z=i7wua2NL,!+~"n?#Kzs @,LLBҳ]vRw,,ŷ^pANjTk,~k,W_.|X x ƶ  xn# #B"` -ݣ\p)9  `AaTKu^alҐqXٗY%mBv= "A<-t0vcu|B>%mpt5xaL@R;A:!0').a|\:^ iKn`~+:T(`WF{H3R$eMCZCTBaNbB!#72! qQF z5Zj[N& G: GIl%+Ȕ5ߚm "E皙XcϚ Lb@HŹd,3}YR=9`''y^`@Z!iQl z5^m.qgZQ$\Ue Αb *rm 2Z붓vA#@@6=-c0O^aTV\3ԇ6[C2 l ѻՃU:-a|m !Axht;qAeS'dۣn@ꨮk:& <X@A@'5`rx6&0 [A\Ƿ^A"ZKT"~` աne|N$*;k H($A"=Y=Xa~Turʨj\Vhl߼ِ|4mr. r" A9%Cu⬑ !ТA` |O౸@:RTv L!A@6`s[P[+`* bƼ[Z_ \AZd)iM1}e=: *N!h:k.@=NRRTV!bΩأ ،A"w`7(d hS@T <=C725@sEsN7* ^>Ux+c~nej`:LƒטT`%r j Cta@^\͢t0=X|eLM6|V^- xȞꏭ{@l󊉔ZeѢ@?tcD¾He&| Lߤaю 4Eki(aW (6g*dmшƑ2N&fJEhOKJkpCE ]dh!)H F'8jRyE^Ѐ@`_SE*NW:_d,A ȢƵ <Pld\ И-Y=.1h5&D#1A|>0Q*BC~NO1kh+T#+ L MGR<  Ϯ (׭<{0 8ШD"Y,X W DE*R0b@9,5/} ew} R`2G˻+ Gw=_/0#u.n=AtT6A% HlRMpq|(T/ MM7br=)= 8̘Ÿf$6j~6f=Grys1 DdShwa$H)E͉tFEj}* ^azh㴖feM0y*dAZvѫ33q(p^+(D Vֻw;oeX_ưK` ? 0Cph :` P*c @ wVg `P0 0 PyWIgY \M0<wppg0  H{.z8R:~` #* I-r0'6+iSJkJT rK!tqtP"8b#bfl3p` BV؄ ]hr&Q0DHb ۀm .( c `P%@00 $I+P<ܰEU<ЌRpYP]Y@@N SP"lL{ &0f.w|$iQi16@TiA+Pj3 aZ}(GxX >OP3b" G*`!AbK2I7%# F f 8 0e@pL&:p j %?*gSf -@JyJ7˵b b ? W /4*v{f,2#il7C 3 {4|T i|bprp=lf@\`ZPZ ` N9F[$r ?'1$s!xp 0V02C.1hE '"?\SH7+࡙TN D` "-0}F$竭 ! s@ $@[ .?M02x6Jxɫs - + ^r~]ψ-Z0>YP0K1 g$8l֜ 9MYM^ )͸ qMƱ_y@E+ڱ_I ]_0)eB@I!` K@Q  )F spOpp -!2=T-2 ?u` 1"g U@ pWvV 0e@ % @,\0IfmnP@` !@L &˰U 2-p`C@ 5ϕH1w  aaU ѤM[aU}Wk_3еI*K  TDpe`M` E([ f "5M򛗥m},4 'p U:-L1/,.  :C Kؼf@ff @֡  !` ?@0 -JV*CZpt | 6@ٚ` 5R+0[U[aYy_,tԐ @Ppްp!-T4M rQeQ ~R%j \39ɦ$00|΀ e / R`~@l^_^ d H>ڼtP֟1 ` p& I 7o Tܛ?` TI sa pM6 ` `P  |X] ( 1Pr"4?bD9Fpd57Ѕ R` x93t`;I:0EeW܉%EKhX<%2p uR.p"鬍 &ߟ JYXHj 83\ F81ьiSŔڞAl9ME 9A="CК`")@+V"-qt]Z%9Ƥ\)pS)D1 s!0(L"q)>Q #,9.N P1Pj1Cl1 yA+N--}3HAL6@k bhL@ pPB b0-D,`<# Lx MfJ F^9&0Ė 0wS*(`lte3z0k4@ЉdC@7[}u ]8@/LX^ۧP@NEJ Q`\y&QtІ.V E ti= $2x%xS*21 nT8*wJ4=Bʥ"l؇:@S{ rB2pY H(@!u4 *46q5m , c7P r`ĀXg b@ zWkYM)^%&XWBa'PJXg6 : x#H@QBWE,N Th/Bsғ2A.!-8=0T ,{#QQ7WP3XTlE hqXP=kXËԦ>@F> XR3|A @X1!6!nrv@w3n+@a:Ά 8b2r,j ; KXjC x D m *q LD&(0gB(5(ўn& +g)上" 23A)BA @26A^L>7|_mH݂XLhՊq3x,fzqk#"ћQl(*C4*@dؚy\ C ; æ[n۝ ""{\7 l\C!QrŅ?[| *3_KD-lEVp0EC1Qn\ dporvj!k 3y ("[YY؈@Y@ZҒ;5@ BACBA@A@AC@x$8" aYP%`'DetCHp0K(8$[_2Ȁ L7 ILIC:C=\:8 |9 -J;l MhOGpD9SHmVh."ZJ@h x2 t RhVFjMYxXjXh,hE^qO@ n7P?xA@0r4r,G@80B0 ;;u#`X!Xt+dtcj(jMJ`T;(JOЀOȄ0 ÑI4I  xȀ;< CCc mGf#A Qb-haP "dHz8Zh02*2W`M͉;}:1#8 Alum Spotlight: Keeping up CS skills while on the "mommy track" - BYU CS Alumni Association
Skip navigation

Alum Spotlight: Keeping up CS skills while on the "mommy track"

Submitted by KierstenKariya on Wed, 11/08/2006 - 11:17am.

I graduated from BYU Computer Science department in 1971 with a split personality.  I wanted to use the education I had worked so hard to get, but I also wanted to stay home and raise my children.  I can now look back 35 years later and say that I’ve been able to do both.  After 5 years working on Univac COBOL compilers and early key-to-disk micro-computer systems,  daughter number one came along and my official programming career went on hold. Four children and various foster children took a lot of time, but I also wanted to keep up my computer skills.  How?  Volunteer!   There are lots of organizations, schools, non-profits, associations, etc. that need tech-savvy people to help part-time.  Although I didn’t “work” for 23 years, I participated in some amazing projects that taught me new skills, gave me access to state-of-the-art equipment, and allowed me to benefit others.  For example:

            I programmed a Z80 mini-computer to keep the books for my father’s business.  This was still the days of 80 character screens and daisy-wheel printers, and before home PCs.  I appreciated access to a business computer---but on my stay-home-mommy schedule.

            I helped write the first electronic database membership system for our stake.  We named it TASC---The Automated Saints Correlator.  (But the in-crowd knew TASC really stood for authors Thompson, Allen, Stenger and Christensen.)  I was able to learn RPG and the CP/M operating system without buying any equipment or software.  And we laughed that I was probably the only woman in the church with a key to the stake clerk’s office.

            After the frustrations of doing monthly financial reports by hand from a paper ledger for the local PTA, I learned Lotus 1-2-3.  By now I had my first home PC.   Soon after I was one of the early adopters of Quicken.  Because of my computer skills, I’ve been the treasurer for various PTA’s, school-board candidates, and the data-base manager for school bond elections.  I’ve had the opportunity to work with wonderful people in my community, and on a database the size of all the voters in our city.

            I assisted in the computer lab at my children’s school and learned about MACs when we had PCs at home.  In fact, we’ve seldom had new equipment at home.  I’m writing this on my old Dell, running Windows 98 and WordPerfect 6.1. 

            Ten years ago it was time for another “career change” for me-the-Mom.  With my youngest children in High School, I had lots of free mornings.  I found a school in a nearby low-income district where they had no Internet access and about 20 PCs running DOS for a school of 800 students.  I’ve participated in the transformation of that school and its district to a Windows 2000 domain with 500 desktop and laptop computers on our campus, a wireless LAN, and 50 servers district-wide.  I’ve become a part-time employee there, and my recent change of status to empty-nester has been relatively painless.

            All through the long years of my non-career the foundation of knowledge I learned at BYU has benefitted me in these varied activities.  My one formal educational experience was a Windows 2000 Server class at the local junior college 3 years ago.  I was amazed at how much easier the class was for me than for most of my 20-something classmates.  My strong understanding of computing basics, including Assembly Language programming, still stands me in good stead today, even though the computers have shrunk and the operating systems have grown.

 

By Susan Allen: wife of Ken Allen (EE 1971), mom, foster-mom, and grandma.  Sue was Technology Coordinator at Belle Haven School in the Ravenswood City School District in East Palo Alto and Menlo Park, California.  She has taken a leave from that district and recently returned from serving a mission with her husband in Hamburg, Germany. 

  

 

Photos taken from the earliest days of BYU's Computer Science Program...for which we have pictures. If you have photos from earlier in the program that you'd like to contribute, please contact Mike Jones

User login

Powered by Drupal. Maintained by Webmaster.

Copyright © 1994-2006 BYU Department of Computer Science. All Rights Reserved.

_]http://csaa.byu.edu/article/2006-11-08-alum_spotlight_keeping_up_cs_skills_on_the_mommy_trackYtext/html 1:CYkzAABBFeVVVV[=klkkpaaafHhhhhmM,gqz$c)c_chh677 7+71ee}2e