[\s\S]*?)<\/div>\s*<(footer|\/article)>/ =~ input
+ return (content.nil?) ? input : content
+ end
+
+ # Escapes CDATA sections in post content
+ def cdata_escape(input)
+ input.gsub(//, ']]>')
+ end
+
+ # Replaces relative urls with full urls
+ def expand_urls(input, url='')
+ url ||= '/'
+ input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\/>]{1}[^\"'>]*)/ do
+ $1+url+$3
+ end
+ end
+
+ # Improved version of Liquid's truncate:
+ # - Doesn't cut in the middle of a word.
+ # - Uses typographically correct ellipsis (…) insted of '...'
+ def truncate(input, length)
+ if input.length > length && input[0..(length-1)] =~ /(.+)\b.+$/im
+ $1.strip + ' …'
+ else
+ input
+ end
+ end
+
+ # Improved version of Liquid's truncatewords:
+ # - Uses typographically correct ellipsis (…) insted of '...'
+ def truncatewords(input, length)
+ truncate = input.split(' ')
+ if truncate.length > length
+ truncate[0..length-1].join(' ').strip + ' …'
+ else
+ input
+ end
+ end
+
+ # Condenses multiple spaces and tabs into a single space
+ def condense_spaces(input)
+ input.gsub(/\s{2,}/, ' ')
+ end
+
+ # Removes trailing forward slash from a string for easily appending url segments
+ def strip_slash(input)
+ if input =~ /(.+)\/$|^\/$/
+ input = $1
+ end
+ input
+ end
+
+ # Returns a url without the protocol (http://)
+ def shorthand_url(input)
+ input.gsub /(https?:\/\/)(\S+)/ do
+ $2
+ end
+ end
+
+ # Returns a title cased string based on John Gruber's title case http://daringfireball.net/2008/08/title_case_update
+ def titlecase(input)
+ input.titlecase
+ end
+
+end
+Liquid::Template.register_filter OctopressLiquidFilters
+
diff --git a/plugins/pullquote.rb b/plugins/pullquote.rb
new file mode 100644
index 00000000..3c65e66e
--- /dev/null
+++ b/plugins/pullquote.rb
@@ -0,0 +1,45 @@
+#
+# Author: Brandon Mathis
+# Based on the semantic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/
+#
+# Outputs a span with a data-pullquote attribute set from the marked pullquote. Example:
+#
+# {% pullquote %}
+# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
+# It is important to note, {" pullquotes are merely visual in presentation and should not appear twice in the text. "} That is why it is prefered
+# to use a CSS only technique for styling pullquotes.
+# {% endpullquote %}
+# ...will output...
+#
+#
+# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
+# It is important to note, pullquotes are merely visual in presentation and should not appear twice in the text. This is why a CSS only approach
+# for styling pullquotes is prefered.
+#
+#
+#
+# {% pullquote left %} will create a left-aligned pullquote instead.
+#
+# Note: this plugin now creates pullquotes with the class of pullquote-right by default
+
+module Jekyll
+
+ class PullquoteTag < Liquid::Block
+ def initialize(tag_name, markup, tokens)
+ @align = (markup =~ /left/i) ? "left" : "right"
+ super
+ end
+
+ def render(context)
+ output = super
+ if output =~ /\{"\s*(.+?)\s*"\}/m
+ @quote = RubyPants.new($1).to_html
+ "#{output.gsub(/\{"\s*|\s*"\}/, '')} "
+ else
+ return "Surround your pullquote like this {\" text to be quoted \"}"
+ end
+ end
+ end
+end
+
+Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag)
diff --git a/plugins/pygments_code.rb b/plugins/pygments_code.rb
new file mode 100644
index 00000000..c0f4de92
--- /dev/null
+++ b/plugins/pygments_code.rb
@@ -0,0 +1,45 @@
+require 'pygments'
+require 'fileutils'
+require 'digest/md5'
+
+PYGMENTS_CACHE_DIR = File.expand_path('../../.pygments-cache', __FILE__)
+FileUtils.mkdir_p(PYGMENTS_CACHE_DIR)
+
+module HighlightCode
+ def self.highlight(str, lang)
+ lang = 'ruby' if lang == 'ru'
+ lang = 'objc' if lang == 'm'
+ lang = 'perl' if lang == 'pl'
+ lang = 'yaml' if lang == 'yml'
+ str = pygments(str, lang).match(/(.+)<\/pre>/m)[1].to_s.gsub(/ *$/, '') #strip out divs
+ tableize_code(str, lang)
+ end
+
+ def self.pygments(code, lang)
+ if defined?(PYGMENTS_CACHE_DIR)
+ path = File.join(PYGMENTS_CACHE_DIR, "#{lang}-#{Digest::MD5.hexdigest(code)}.html")
+ if File.exist?(path)
+ highlighted_code = File.read(path)
+ else
+ begin
+ highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true})
+ rescue MentosError
+ raise "Pygments can't parse unknown language: #{lang}."
+ end
+ File.open(path, 'w') {|f| f.print(highlighted_code) }
+ end
+ else
+ highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true})
+ end
+ highlighted_code
+ end
+ def self.tableize_code (str, lang = '')
+ table = '
'
+ code = ''
+ str.lines.each_with_index do |line,index|
+ table += "#{index+1} \n"
+ code += "#{line} "
+ end
+ table += " #{code}
"
+ end
+end
diff --git a/plugins/raw.rb b/plugins/raw.rb
new file mode 100644
index 00000000..e97c9459
--- /dev/null
+++ b/plugins/raw.rb
@@ -0,0 +1,40 @@
+# Author: Brandon Mathis
+# Description: Provides plugins with a method for wrapping and unwrapping input to prevent Markdown and Textile from parsing it.
+# Purpose: This is useful for preventing Markdown and Textile from being too aggressive and incorrectly parsing in-line HTML.
+module TemplateWrapper
+ # Wrap input with a
+ def self.safe_wrap(input)
+ "
#{input}
"
+ end
+ # This must be applied after the
+ def self.unwrap(input)
+ input.gsub /
(.+?)<\/notextile><\/div>/m do
+ $1
+ end
+ end
+end
+
+# Author: phaer, https://github.com/phaer
+# Source: https://gist.github.com/1020852
+# Description: Raw tag for jekyll. Keeps liquid from parsing text betweeen {% raw %} and {% endraw %}
+
+module Jekyll
+ class RawTag < Liquid::Block
+ def parse(tokens)
+ @nodelist ||= []
+ @nodelist.clear
+
+ while token = tokens.shift
+ if token =~ FullToken
+ if block_delimiter == $1
+ end_tag
+ return
+ end
+ end
+ @nodelist << token if not token.empty?
+ end
+ end
+ end
+end
+
+Liquid::Template.register_tag('raw', Jekyll::RawTag)
diff --git a/plugins/render_partial.rb b/plugins/render_partial.rb
new file mode 100644
index 00000000..b6ebfe8b
--- /dev/null
+++ b/plugins/render_partial.rb
@@ -0,0 +1,69 @@
+# Title: Render Partial Tag for Jekyll
+# Author: Brandon Mathis http://brandonmathis.com
+# Description: Import files on your filesystem into any blog post and render them inline.
+# Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out.
+#
+# Syntax {% render_partial path/to/file %}
+#
+# Example 1:
+# {% render_partial about/_bio.markdown %}
+#
+# This will import source/about/_bio.markdown and render it inline.
+# In this example I used an underscore at the beginning of the filename to prevent Jekyll
+# from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores)
+#
+# Example 2:
+# {% render_partial ../README.markdown %}
+#
+# You can use relative pathnames, to include files outside of the source directory.
+# This might be useful if you want to have a page for a project's README without having
+# to duplicated the contents
+#
+#
+
+require 'pathname'
+require './plugins/octopress_filters'
+
+module Jekyll
+
+ class RenderPartialTag < Liquid::Tag
+ include OctopressFilters
+ def initialize(tag_name, markup, tokens)
+ @file = nil
+ @raw = false
+ if markup =~ /^(\S+)\s?(\w+)?/
+ @file = $1.strip
+ @raw = $2 == 'raw'
+ end
+ super
+ end
+
+ def render(context)
+ file_dir = (context.registers[:site].source || 'source')
+ file_path = Pathname.new(file_dir).expand_path
+ file = file_path + @file
+
+ unless file.file?
+ return "File #{file} could not be found"
+ end
+
+ Dir.chdir(file_path) do
+ contents = file.read
+ if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m
+ contents = $1.lstrip
+ end
+ contents = pre_filter(contents)
+ if @raw
+ contents
+ else
+ partial = Liquid::Template.parse(contents)
+ context.stack do
+ partial.render(context)
+ end
+ end
+ end
+ end
+ end
+end
+
+Liquid::Template.register_tag('render_partial', Jekyll::RenderPartialTag)
diff --git a/plugins/rubypants.rb b/plugins/rubypants.rb
new file mode 100644
index 00000000..e4f4502f
--- /dev/null
+++ b/plugins/rubypants.rb
@@ -0,0 +1,489 @@
+#
+# = RubyPants -- SmartyPants ported to Ruby
+#
+# Ported by Christian Neukirchen
+# Copyright (C) 2004 Christian Neukirchen
+#
+# Incooporates ideas, comments and documentation by Chad Miller
+# Copyright (C) 2004 Chad Miller
+#
+# Original SmartyPants by John Gruber
+# Copyright (C) 2003 John Gruber
+#
+
+#
+# = RubyPants -- SmartyPants ported to Ruby
+#
+# == Synopsis
+#
+# RubyPants is a Ruby port of the smart-quotes library SmartyPants.
+#
+# The original "SmartyPants" is a free web publishing plug-in for
+# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII
+# punctuation characters into "smart" typographic punctuation HTML
+# entities.
+#
+#
+# == Description
+#
+# RubyPants can perform the following transformations:
+#
+# * Straight quotes (" and ' ) into "curly" quote
+# HTML entities
+# * Backticks-style quotes (``like this'' ) into "curly" quote
+# HTML entities
+# * Dashes (-- and --- ) into en- and em-dash
+# entities
+# * Three consecutive dots (... or . . . ) into an
+# ellipsis entity
+#
+# This means you can write, edit, and save your posts using plain old
+# ASCII straight quotes, plain dashes, and plain dots, but your
+# published posts (and final HTML output) will appear with smart
+# quotes, em-dashes, and proper ellipses.
+#
+# RubyPants does not modify characters within ,
+# , , or
+# tag blocks. Typically, these tags are used to
+# display text where smart quotes and other "smart punctuation" would
+# not be appropriate, such as source code or example markup.
+#
+#
+# == Backslash Escapes
+#
+# If you need to use literal straight quotes (or plain hyphens and
+# periods), RubyPants accepts the following backslash escape sequences
+# to force non-smart punctuation. It does so by transforming the
+# escape sequence into a decimal-encoded HTML entity:
+#
+# \\ \" \' \. \- \`
+#
+# This is useful, for example, when you want to use straight quotes as
+# foot and inch marks: 6'2" tall; a 17" iMac. (Use 6\'2\"
+# resp. 17\" .)
+#
+#
+# == Algorithmic Shortcomings
+#
+# One situation in which quotes will get curled the wrong way is when
+# apostrophes are used at the start of leading contractions. For
+# example:
+#
+# 'Twas the night before Christmas.
+#
+# In the case above, RubyPants will turn the apostrophe into an
+# opening single-quote, when in fact it should be a closing one. I
+# don't think this problem can be solved in the general case--every
+# word processor I've tried gets this wrong as well. In such cases,
+# it's best to use the proper HTML entity for closing single-quotes
+# ("’ ") by hand.
+#
+#
+# == Bugs
+#
+# To file bug reports or feature requests (except see above) please
+# send email to: mailto:chneukirchen@gmail.com
+#
+# If the bug involves quotes being curled the wrong way, please send
+# example text to illustrate.
+#
+#
+# == Authors
+#
+# John Gruber did all of the hard work of writing this software in
+# Perl for Movable Type and almost all of this useful documentation.
+# Chad Miller ported it to Python to use with Pyblosxom.
+#
+# Christian Neukirchen provided the Ruby port, as a general-purpose
+# library that follows the *Cloth API.
+#
+#
+# == Copyright and License
+#
+# === SmartyPants license:
+#
+# Copyright (c) 2003 John Gruber
+# (http://daringfireball.net)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# * Neither the name "SmartyPants" nor the names of its contributors
+# may be used to endorse or promote products derived from this
+# software without specific prior written permission.
+#
+# This software is provided by the copyright holders and contributors
+# "as is" and any express or implied warranties, including, but not
+# limited to, the implied warranties of merchantability and fitness
+# for a particular purpose are disclaimed. In no event shall the
+# copyright owner or contributors be liable for any direct, indirect,
+# incidental, special, exemplary, or consequential damages (including,
+# but not limited to, procurement of substitute goods or services;
+# loss of use, data, or profits; or business interruption) however
+# caused and on any theory of liability, whether in contract, strict
+# liability, or tort (including negligence or otherwise) arising in
+# any way out of the use of this software, even if advised of the
+# possibility of such damage.
+#
+# === RubyPants license
+#
+# RubyPants is a derivative work of SmartyPants and smartypants.py.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# This software is provided by the copyright holders and contributors
+# "as is" and any express or implied warranties, including, but not
+# limited to, the implied warranties of merchantability and fitness
+# for a particular purpose are disclaimed. In no event shall the
+# copyright owner or contributors be liable for any direct, indirect,
+# incidental, special, exemplary, or consequential damages (including,
+# but not limited to, procurement of substitute goods or services;
+# loss of use, data, or profits; or business interruption) however
+# caused and on any theory of liability, whether in contract, strict
+# liability, or tort (including negligence or otherwise) arising in
+# any way out of the use of this software, even if advised of the
+# possibility of such damage.
+#
+#
+# == Links
+#
+# John Gruber:: http://daringfireball.net
+# SmartyPants:: http://daringfireball.net/projects/smartypants
+#
+# Chad Miller:: http://web.chad.org
+#
+# Christian Neukirchen:: http://kronavita.de/chris
+#
+
+
+class RubyPants < String
+
+ # Create a new RubyPants instance with the text in +string+.
+ #
+ # Allowed elements in the options array:
+ #
+ # 0 :: do nothing
+ # 1 :: enable all, using only em-dash shortcuts
+ # 2 :: enable all, using old school en- and em-dash shortcuts (*default*)
+ # 3 :: enable all, using inverted old school en and em-dash shortcuts
+ # -1 :: stupefy (translate HTML entities to their ASCII-counterparts)
+ #
+ # If you don't like any of these defaults, you can pass symbols to change
+ # RubyPants' behavior:
+ #
+ # :quotes :: quotes
+ # :backticks :: backtick quotes (``double'' only)
+ # :allbackticks :: backtick quotes (``double'' and `single')
+ # :dashes :: dashes
+ # :oldschool :: old school dashes
+ # :inverted :: inverted old school dashes
+ # :ellipses :: ellipses
+ # :convertquotes :: convert " entities to
+ # " for Dreamweaver users
+ # :stupefy :: translate RubyPants HTML entities
+ # to their ASCII counterparts.
+ #
+ def initialize(string, options=[2])
+ super string
+ @options = [*options]
+ end
+
+ # Apply SmartyPants transformations.
+ def to_html
+ do_quotes = do_backticks = do_dashes = do_ellipses = do_stupify = nil
+ convert_quotes = false
+
+ if @options.include? 0
+ # Do nothing.
+ return self
+ elsif @options.include? 1
+ # Do everything, turn all options on.
+ do_quotes = do_backticks = do_ellipses = true
+ do_dashes = :normal
+ elsif @options.include? 2
+ # Do everything, turn all options on, use old school dash shorthand.
+ do_quotes = do_backticks = do_ellipses = true
+ do_dashes = :oldschool
+ elsif @options.include? 3
+ # Do everything, turn all options on, use inverted old school
+ # dash shorthand.
+ do_quotes = do_backticks = do_ellipses = true
+ do_dashes = :inverted
+ elsif @options.include?(-1)
+ do_stupefy = true
+ else
+ do_quotes = @options.include? :quotes
+ do_backticks = @options.include? :backticks
+ do_backticks = :both if @options.include? :allbackticks
+ do_dashes = :normal if @options.include? :dashes
+ do_dashes = :oldschool if @options.include? :oldschool
+ do_dashes = :inverted if @options.include? :inverted
+ do_ellipses = @options.include? :ellipses
+ convert_quotes = @options.include? :convertquotes
+ do_stupefy = @options.include? :stupefy
+ end
+
+ # Parse the HTML
+ tokens = tokenize
+
+ # Keep track of when we're inside or tags.
+ in_pre = false
+
+ # Here is the result stored in.
+ result = ""
+
+ # This is a cheat, used to get some context for one-character
+ # tokens that consist of just a quote char. What we do is remember
+ # the last character of the previous text token, to use as context
+ # to curl single- character quote tokens correctly.
+ prev_token_last_char = nil
+
+ tokens.each { |token|
+ if token.first == :tag
+ result << token[1]
+ if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]!
+ in_pre = ($1 != "/") # Opening or closing tag?
+ end
+ else
+ t = token[1]
+
+ # Remember last char of this token before processing.
+ last_char = t[-1].chr
+
+ unless in_pre
+ t = process_escapes t
+
+ t.gsub!(/"/, '"') if convert_quotes
+
+ if do_dashes
+ t = educate_dashes t if do_dashes == :normal
+ t = educate_dashes_oldschool t if do_dashes == :oldschool
+ t = educate_dashes_inverted t if do_dashes == :inverted
+ end
+
+ t = educate_ellipses t if do_ellipses
+
+ # Note: backticks need to be processed before quotes.
+ if do_backticks
+ t = educate_backticks t
+ t = educate_single_backticks t if do_backticks == :both
+ end
+
+ if do_quotes
+ if t == "'"
+ # Special case: single-character ' token
+ if prev_token_last_char =~ /\S/
+ t = "’"
+ else
+ t = "‘"
+ end
+ elsif t == '"'
+ # Special case: single-character " token
+ if prev_token_last_char =~ /\S/
+ t = "”"
+ else
+ t = "“"
+ end
+ else
+ # Normal case:
+ t = educate_quotes t
+ end
+ end
+
+ t = stupefy_entities t if do_stupefy
+ end
+
+ prev_token_last_char = last_char
+ result << t
+ end
+ }
+
+ # Done
+ result
+ end
+
+ protected
+
+ # Return the string, with after processing the following backslash
+ # escape sequences. This is useful if you want to force a "dumb" quote
+ # or other character to appear.
+ #
+ # Escaped are:
+ # \\ \" \' \. \- \`
+ #
+ def process_escapes(str)
+ str.gsub('\\\\', '\').
+ gsub('\"', '"').
+ gsub("\\\'", ''').
+ gsub('\.', '.').
+ gsub('\-', '-').
+ gsub('\`', '`')
+ end
+
+ # The string, with each instance of "-- " translated to an
+ # em-dash HTML entity.
+ #
+ def educate_dashes(str)
+ str.gsub(/--/, '—')
+ end
+
+ # The string, with each instance of "-- " translated to an
+ # en-dash HTML entity, and each "--- " translated to an
+ # em-dash HTML entity.
+ #
+ def educate_dashes_oldschool(str)
+ str.gsub(/---/, '—').gsub(/--/, '–')
+ end
+
+ # Return the string, with each instance of "-- " translated
+ # to an em-dash HTML entity, and each "--- " translated to
+ # an en-dash HTML entity. Two reasons why: First, unlike the en- and
+ # em-dash syntax supported by +educate_dashes_oldschool+, it's
+ # compatible with existing entries written before SmartyPants 1.1,
+ # back when "-- " was only used for em-dashes. Second,
+ # em-dashes are more common than en-dashes, and so it sort of makes
+ # sense that the shortcut should be shorter to type. (Thanks to
+ # Aaron Swartz for the idea.)
+ #
+ def educate_dashes_inverted(str)
+ str.gsub(/---/, '–').gsub(/--/, '—')
+ end
+
+ # Return the string, with each instance of "... " translated
+ # to an ellipsis HTML entity. Also converts the case where there are
+ # spaces between the dots.
+ #
+ def educate_ellipses(str)
+ str.gsub('...', '…').gsub('. . .', '…')
+ end
+
+ # Return the string, with "``backticks'' "-style single quotes
+ # translated into HTML curly quote entities.
+ #
+ def educate_backticks(str)
+ str.gsub("``", '“').gsub("''", '”')
+ end
+
+ # Return the string, with "`backticks' "-style single quotes
+ # translated into HTML curly quote entities.
+ #
+ def educate_single_backticks(str)
+ str.gsub("`", '‘').gsub("'", '’')
+ end
+
+ # Return the string, with "educated" curly quote HTML entities.
+ #
+ def educate_quotes(str)
+ punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
+
+ str = str.dup
+
+ # Special case if the very first character is a quote followed by
+ # punctuation at a non-word-break. Close the quotes by brute
+ # force:
+ str.gsub!(/^'(?=#{punct_class}\B)/, '’')
+ str.gsub!(/^"(?=#{punct_class}\B)/, '”')
+
+ # Special case for double sets of quotes, e.g.:
+ # He said, "'Quoted' words in a larger quote."
+ str.gsub!(/"'(?=\w)/, '“‘')
+ str.gsub!(/'"(?=\w)/, '‘“')
+
+ # Special case for decade abbreviations (the '80s):
+ str.gsub!(/'(?=\d\ds)/, '’')
+
+ close_class = %![^\ \t\r\n\\[\{\(\-]!
+ dec_dashes = '–|—'
+
+ # Get most opening single quotes:
+ str.gsub!(/(\s| |--|&[mn]dash;|#{dec_dashes}|ȁ[34];)'(?=\w)/,
+ '\1‘')
+ # Single closing quotes:
+ str.gsub!(/(#{close_class})'/, '\1’')
+ str.gsub!(/'(\s|s\b|$)/, '’\1')
+ # Any remaining single quotes should be opening ones:
+ str.gsub!(/'/, '‘')
+
+ # Get most opening double quotes:
+ str.gsub!(/(\s| |--|&[mn]dash;|#{dec_dashes}|ȁ[34];)"(?=\w)/,
+ '\1“')
+ # Double closing quotes:
+ str.gsub!(/(#{close_class})"/, '\1”')
+ str.gsub!(/"(\s|s\b|$)/, '”\1')
+ # Any remaining quotes should be opening ones:
+ str.gsub!(/"/, '“')
+
+ str
+ end
+
+ # Return the string, with each RubyPants HTML entity translated to
+ # its ASCII counterpart.
+ #
+ # Note: This is not reversible (but exactly the same as in SmartyPants)
+ #
+ def stupefy_entities(str)
+ str.
+ gsub(/–/, '-'). # en-dash
+ gsub(/—/, '--'). # em-dash
+
+ gsub(/‘/, "'"). # open single quote
+ gsub(/’/, "'"). # close single quote
+
+ gsub(/“/, '"'). # open double quote
+ gsub(/”/, '"'). # close double quote
+
+ gsub(/…/, '...') # ellipsis
+ end
+
+ # Return an array of the tokens comprising the string. Each token is
+ # either a tag (possibly with nested, tags contained therein, such
+ # as , or a run of text between
+ # tags. Each element of the array is a two-element array; the first
+ # is either :tag or :text; the second is the actual value.
+ #
+ # Based on the _tokenize() subroutine from Brad Choate's
+ # MTRegex plugin.
+ #
+ # This is actually the easier variant using tag_soup, as used by
+ # Chad Miller in the Python port of SmartyPants.
+ #
+ def tokenize
+ tag_soup = /([^<]*)(<[^>]*>)/
+
+ tokens = []
+
+ prev_end = 0
+ scan(tag_soup) {
+ tokens << [:text, $1] if $1 != ""
+ tokens << [:tag, $2]
+
+ prev_end = $~.end(0)
+ }
+
+ if prev_end < size
+ tokens << [:text, self[prev_end..-1]]
+ end
+
+ tokens
+ end
+end
diff --git a/plugins/titlecase.rb b/plugins/titlecase.rb
new file mode 100644
index 00000000..7648932c
--- /dev/null
+++ b/plugins/titlecase.rb
@@ -0,0 +1,36 @@
+class String
+ def titlecase
+ small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
+
+ x = split(" ").map do |word|
+ # note: word could contain non-word characters!
+ # downcase all small_words, capitalize the rest
+ small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
+ word
+ end
+ # capitalize first and last words
+ x.first.to_s.smart_capitalize!
+ x.last.to_s.smart_capitalize!
+ # small words are capitalized after colon, period, exclamation mark, question mark
+ x.join(" ").gsub(/(:|\.|!|\?)\s?(\W*#{small_words.join("|")}\W*)\s/) { "#{$1} #{$2.smart_capitalize} " }
+ end
+
+ def titlecase!
+ replace(titlecase)
+ end
+
+ def smart_capitalize
+ # ignore any leading crazy characters and capitalize the first real character
+ if self =~ /^['"\(\[']*([a-z])/
+ i = index($1)
+ x = self[i,self.length]
+ # word with capitals and periods mid-word are left alone
+ self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
+ end
+ self
+ end
+
+ def smart_capitalize!
+ replace(smart_capitalize)
+ end
+end
diff --git a/plugins/video_tag.rb b/plugins/video_tag.rb
new file mode 100644
index 00000000..c6e67b77
--- /dev/null
+++ b/plugins/video_tag.rb
@@ -0,0 +1,56 @@
+# Title: Simple Video tag for Jekyll
+# Author: Brandon Mathis http://brandonmathis.com
+# Description: Easily output MPEG4 HTML5 video with a flash backup.
+#
+# Syntax {% video url/to/video [width height] [url/to/poster] %}
+#
+# Example:
+# {% video http://site.com/video.mp4 720 480 http://site.com/poster-frame.jpg %}
+#
+# Output:
+#
+#
+#
+#
+
+module Jekyll
+
+ class VideoTag < Liquid::Tag
+ @video = nil
+ @poster = ''
+ @height = ''
+ @width = ''
+
+ def initialize(tag_name, markup, tokens)
+ if markup =~ /(https?:\S+)(\s+(https?:\S+))?(\s+(https?:\S+))?(\s+(\d+)\s(\d+))?(\s+(https?:\S+))?/i
+ @video = [$1, $3, $5].compact
+ @width = $7
+ @height = $8
+ @poster = $10
+ end
+ super
+ end
+
+ def render(context)
+ output = super
+ type = {
+ 'mp4' => "type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'",
+ 'ogv' => "type='video/ogg; codecs=theora, vorbis'",
+ 'webm' => "type='video/webm; codecs=vp8, vorbis'"
+ }
+ if @video.size > 0
+ video = ""
+ @video.each do |v|
+ t = v.match(/([^\.]+)$/)[1]
+ video += ""
+ end
+ video += " "
+ else
+ "Error processing input, expected syntax: {% video url/to/video [url/to/video] [url/to/video] [width height] [url/to/poster] %}"
+ end
+ end
+ end
+end
+
+Liquid::Template.register_tag('video', Jekyll::VideoTag)
+
diff --git a/prospectivestudents/496.html b/prospectivestudents/496.html
new file mode 100644
index 00000000..3351413f
--- /dev/null
+++ b/prospectivestudents/496.html
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+ EECE 496 - SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 496 Projects
+
+
+
+The SALT lab is offering the following projects as part of EECE 496 at UBC.
+
+
+
+
+
+
+List of Projects
+
+
+
+
+
+
+CSS Analysis and Visualization: CSS is a widely used language for describing the presentation semantics of HTML elements on the web. The
+language has a number of characteristics, such as inheritance
+and cascading order, which makes maintaining CSS code a
+challenging task for web developers. As a result, it is common
+for unused rules to be accumulated over time. Our lab has developed a software tool called CILLA, which is written in Java and is capable of automatically detecting unused CSS code in web applications. The goal of this 496 project is to build a visualization component for the textual output produced by CILLA by linking the detected unused code to the original CSS code so that developers can easily see which parts of the code needs maintenance and cleaning up activities.
+
+Mobile Application Navigation : This project offers an opportunity to explore how web applications running on mobile operating systems such as iOS (on e.g., iPhone, iPad) and Android can be automatically navigated and analyzed for cross-platform compatibility.
+
+Crawljax Plugins: Crawljax is a web crawler (see crawljax.com ) that can navigate any modern standards-based web application including JavaScript and Ajax-based ones. Crawljax has a plugin-based architecture and there are already many plugins available. This 496 project aims at designing and developing new generic web crawling and analysis plugins.
+
+
+
+
+These projects require strong programming skills. Students are expected to be committed and be able to work relatively independently as far as the implementation steps are concerned. There will be regular meetings to discuss the milestones on a conceptual/design level throughout the project.
+
+
+If you have other interesting EECE 496 projects in the areas of web and software engineering, send me an email and we can discuss the possibilities.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/prospectivestudents/index.html b/prospectivestudents/index.html
new file mode 100644
index 00000000..35a72698
--- /dev/null
+++ b/prospectivestudents/index.html
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+ prospective students - SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SALT lab is always interested in motivated, bright students to work with on a variety of software engineering projects.
+
+
+
+ Graduate Students
+
+
+
+ Visit this page for general information about admission requirements and deadlines.
+
+
+
+ We currently have a number of exciting projects for graduate students with strong academic background and experience in software engineering, software testing, web engineering, and related areas of research. Interested candidates may contact me provided they meet the following criteria:
+
+
+
+
+ Excellent programming skills
+
+ Strong academic background
+
+ PhD applicants: Published or submitted ACM/IEEE conference/journal papers from your Master's work. Having publications will strengthen your case.
+
+
+
+
+ Undergraduate Students
+
+
+
+
+ We have a number of exciting 496 projects. See the list here .
+
+ International undergraduate students should consider the MITACS Global Link projects. These are fully funded summer research projects. We are offering a number of research projects there for top international students.
+
+
+
+
+
+
+
+
+ VIDEO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/Roest_2010.icst.html b/publications/Roest_2010.icst.html
new file mode 100644
index 00000000..5f5a14fc
--- /dev/null
+++ b/publications/Roest_2010.icst.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regression Testing Ajax Applications: Coping With Dynamism
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
D. Roest, A. Mesbah and A. van Deursen, “Regression Testing Ajax Applications: Coping with Dynamism” , in Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST) , 2010, 128--136, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{Roest:2010.icst,
+ author = {Roest, Danny and Mesbah, Ali and van Deursen, Arie},
+ title = {Regression Testing Ajax Applications: Coping with Dynamism},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST)},
+ year = {2010},
+ publisher = {IEEE Computer Society},
+ pages = {128--136}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/VanDeursen_2010.nier.html b/publications/VanDeursen_2010.nier.html
new file mode 100644
index 00000000..693383d8
--- /dev/null
+++ b/publications/VanDeursen_2010.nier.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adinda: A Knowledgeable, Browser-Based IDE
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
A. van Deursen, A. Mesbah, B. Cornelissen, A. Zaidman, M. Pinzger and A. Guzzi, “Adinda: A knowledgeable, Browser-Based IDE” , in Companion Proceedings of the 32nd International Conference on Software Engineering, New Ideas and Emerging Results Track (ICSE NIER) , 2010, 203--206, ACM .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{VanDeursen:2010.nier,
+ author = {van Deursen, Arie and Mesbah, Ali and Cornelissen, Bas and Zaidman, Andy and Pinzger, Martin and Guzzi, Anja},
+ title = {Adinda: A knowledgeable, Browser-Based IDE},
+ booktitle = {Companion Proceedings of the 32nd International Conference on Software Engineering, New Ideas and Emerging Results Track (ICSE NIER)},
+ publisher = {ACM},
+ year = {2010},
+ pages = {203--206}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/amin_issre13.html b/publications/amin_issre13.html
new file mode 100644
index 00000000..6c473b41
--- /dev/null
+++ b/publications/amin_issre13.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Feedback-directed Exploration of Web Applications to Derive Test Models
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
A. Milani Fard and A. Mesbah, “Feedback-directed Exploration of Web Applications to Derive Test Models” , in Proceedings of the 24th IEEE International Symposium on Software Reliability Engineering (ISSRE) , 2013, 10 pages, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{amin:issre13,
+ author = {Milani Fard, Amin and Mesbah, Ali},
+ title = {Feedback-directed Exploration of Web Applications to Derive Test Models},
+ booktitle = {Proceedings of the 24th IEEE International Symposium on Software Reliability Engineering (ISSRE)},
+ publisher = {IEEE Computer Society},
+ pages = {10 pages},
+ year = {2013}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/amin_scam13.html b/publications/amin_scam13.html
new file mode 100644
index 00000000..6f1650ff
--- /dev/null
+++ b/publications/amin_scam13.html
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ JSNose: Detecting JavaScript Code Smells
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Milani Fard and A. Mesbah, “JSNose: Detecting JavaScript Code Smells” , in Proceedings of the IEEE International Conference on Source Code Analysis and Manipulation (SCAM) , 2013, 10 pages, IEEE Computer Society .
+
+
+
+
+
+ Abstract
+
+ JavaScript is a powerful and flexible prototype-based scripting language that is increasingly used by developers to create interactive web applications. The language is interpreted, dynamic, weakly-typed, and has first-class functions. In addition, it interacts with other web languages such as CSS and HTML at runtime. All these characteristics make JavaScript code particularly error-prone and challenging to write and maintain. Code smells are patterns in the source code that can adversely influence program comprehension and maintainability of the program in the long term. We propose a set of 13 JavaScript code smells, collected from various developer resources. We present a JavaScript code smell detection technique called JSNose. Our metric-based approach combines static and dynamic analysis to detect smells in client-side code. This automated technique can help developers to spot code that could benefit from refactoring. We evaluate the smell finding capabilities of our technique through an empirical study. By analyzing 11 web applications, we investigate which smells detected by JSNose are more prevalent.
+
+
+ BibTeX
+
+
@inproceedings{amin:scam13,
+ author = {Milani Fard, Amin and Mesbah, Ali},
+ title = {JSNose: Detecting JavaScript Code Smells},
+ booktitle = {Proceedings of the IEEE International Conference on Source Code Analysis and Manipulation (SCAM)},
+ publisher = {IEEE Computer Society},
+ pages = {10 pages},
+ year = {2013},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/scam13.pdf},
+ abstract = {JavaScript is a powerful and flexible prototype-based scripting language that is increasingly used by developers to create interactive web applications. The language is interpreted, dynamic, weakly-typed, and has first-class functions. In addition, it interacts with other web languages such as CSS and HTML at runtime. All these characteristics make JavaScript code particularly error-prone and challenging to write and maintain. Code smells are patterns in the source code that can adversely influence program comprehension and maintainability of the program in the long term. We propose a set of 13 JavaScript code smells, collected from various developer resources. We present a JavaScript code smell detection technique called JSNose. Our metric-based approach combines static and dynamic analysis to detect smells in client-side code. This automated technique can help developers to spot code that could benefit from refactoring. We evaluate the smell finding capabilities of our technique through an empirical study. By analyzing 11 web applications, we investigate which smells detected by JSNose are more prevalent.}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/bezemer_esec09.html b/publications/bezemer_esec09.html
new file mode 100644
index 00000000..233019fc
--- /dev/null
+++ b/publications/bezemer_esec09.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Automated Security Testing of Web Widget Interactions
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
C.-P. Bezemer, A. Mesbah and A. van Deursen, “Automated Security Testing of Web Widget Interactions” , in Proceedings of the 7th joint meeting of the European Software Engineering Conference and the ACM SIGSOFT symposium on the Foundations of Software Engineering (ESEC-FSE) , 2009, 81--91, ACM .
+
+
[Acceptance rate 14.7%]
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{bezemer:esec09,
+ author = {Bezemer, Cor-Paul and Mesbah, Ali and van Deursen, Arie},
+ title = {Automated Security Testing of Web Widget Interactions},
+ booktitle = {Proceedings of the 7th joint meeting of the European Software Engineering Conference and the ACM SIGSOFT symposium on the Foundations of Software Engineering (ESEC-FSE)},
+ year = {2009},
+ pages = {81--91},
+ publisher = {ACM},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/fse09.pdf},
+ note = {[Acceptance rate 14.7%]}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/bozdag_jwe.html b/publications/bozdag_jwe.html
new file mode 100644
index 00000000..1abaace3
--- /dev/null
+++ b/publications/bozdag_jwe.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Performance Testing of Data Delivery Techniques for Ajax Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
E. Bozdag, A. Mesbah and A. van Deursen, “Performance Testing of Data Delivery Techniques for Ajax Applications” , Journal of Web Engineering , vol. 8, no. 4, 287--315, 2009.
+
+
+
+
+
+
+ BibTeX
+
+
@article{bozdag:jwe,
+ author = {Bozdag, Engin and Mesbah, Ali and van Deursen, Arie},
+ title = {Performance Testing of Data Delivery Techniques for Ajax Applications},
+ journal = {Journal of Web Engineering},
+ year = {2009},
+ volume = {8},
+ number = {4},
+ pages = {287--315},
+ url = {http://swerl.tudelft.nl/twiki/pub/Main/TechnicalReports/TUD-SERG-2008-009.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/bozdag_wse2007.html b/publications/bozdag_wse2007.html
new file mode 100644
index 00000000..1c2d3df4
--- /dev/null
+++ b/publications/bozdag_wse2007.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A Comparison of Push and Pull Techniques for Ajax
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
E. Bozdag, A. Mesbah and A. van Deursen, “A Comparison of Push and Pull Techniques for Ajax” , in Proceedings of the 9th IEEE International Symposium on Web Site Evolution (WSE) , 2007, 15--22, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{bozdag:wse2007,
+ author = {Bozdag, Engin and Mesbah, Ali and van Deursen, Arie},
+ title = {A Comparison of Push and Pull Techniques for Ajax},
+ booktitle = {Proceedings of the 9th IEEE International Symposium on Web Site Evolution (WSE)},
+ year = {2007},
+ pages = {15--22},
+ publisher = {IEEE Computer Society}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/deursen_sofsem.html b/publications/deursen_sofsem.html
new file mode 100644
index 00000000..22c46415
--- /dev/null
+++ b/publications/deursen_sofsem.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Research Issues in the Automated Testing of Ajax Applications
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
A. van Deursen and A. Mesbah, “Research Issues in the Automated Testing
+of Ajax Applications” , in Proceedings of the 36th International Conference on Current Trends in Theory and Practice of Computer Science (SOFSEM) , 2010, 16--28, Lecture Notes in Computer Science 5901Springer-Verlag .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{deursen:sofsem,
+ author = {van Deursen, Arie and Mesbah, Ali},
+ title = {Research Issues in the Automated Testing
+ of Ajax Applications},
+ booktitle = {Proceedings of the 36th International Conference on Current Trends in Theory and Practice of Computer Science (SOFSEM)},
+ year = {2010},
+ pages = {16--28},
+ publisher = {Lecture Notes in Computer Science 5901, Springer-Verlag}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/frolin_jsbugs.html b/publications/frolin_jsbugs.html
new file mode 100644
index 00000000..608486e5
--- /dev/null
+++ b/publications/frolin_jsbugs.html
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An Empirical Study of Client-Side JavaScript Bugs
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
F. Ocariza, K. Bajaj, K. Pattabiraman and A. Mesbah, “An Empirical Study of Client-Side JavaScript Bugs” , in Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM) , 2013, 10 pages, IEEE Computer Society .
+
+
+
+
+
+ Abstract
+
+ Context: Client-side JavaScript is widely used in web applications to improve user-interactivity and minimize client-server communications. Unfortunately, web applications are prone to JavaScript faults. While prior studies have demonstrated the prevalence of these faults, no attempts have been made to determine their root causes and consequences. Objective: The goal of our study is to understand the root causes and impact of JavaScript faults and how the results can impact JavaScript programmers, testers and tool developers. Method: We perform an empirical study of 317 bug reports from 12 bug repositories. The bug reports are thoroughly examined to classify and extract information about the fault's cause (the error) and consequence (the failure and impact). Result: The majority (65\%) of JavaScript faults are DOM-related, meaning they are caused by faulty interactions of the JavaScript
+code with the Document Object Model (DOM). Further, 80\% of
+the highest impact JavaScript faults are DOM-related. Finally, most JavaScript faults originate from programmer mistakes committed in the JavaScript code itself, as opposed to other web application components such as the server-side or HTML code. Conclusion: Given the prevalence of DOM-related faults, JavaScript programmers need development tools that can help them reason about the DOM. Also, testers should prioritize detection of DOM-related faults as most high impact faults belong to this category. Finally, developers can use the error patterns we found to design more powerful static analysis tools for JavaScript.
+
+
+ BibTeX
+
+
@inproceedings{frolin:jsbugs,
+ author = {Ocariza, Frolin and Bajaj, Kartik and Pattabiraman, Karthik and Mesbah, Ali},
+ title = {An Empirical Study of Client-Side JavaScript Bugs},
+ booktitle = {Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)},
+ publisher = {IEEE Computer Society},
+ pages = {10 pages},
+ year = {2013},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/frolin-esem13.pdf},
+ abstract = {Context: Client-side JavaScript is widely used in web applications to improve user-interactivity and minimize client-server communications. Unfortunately, web applications are prone to JavaScript faults. While prior studies have demonstrated the prevalence of these faults, no attempts have been made to determine their root causes and consequences. Objective: The goal of our study is to understand the root causes and impact of JavaScript faults and how the results can impact JavaScript programmers, testers and tool developers. Method: We perform an empirical study of 317 bug reports from 12 bug repositories. The bug reports are thoroughly examined to classify and extract information about the fault's cause (the error) and consequence (the failure and impact). Result: The majority (65\%) of JavaScript faults are DOM-related, meaning they are caused by faulty interactions of the JavaScript
+ code with the Document Object Model (DOM). Further, 80\% of
+ the highest impact JavaScript faults are DOM-related. Finally, most JavaScript faults originate from programmer mistakes committed in the JavaScript code itself, as opposed to other web application components such as the server-side or HTML code. Conclusion: Given the prevalence of DOM-related faults, JavaScript programmers need development tools that can help them reason about the DOM. Also, testers should prioritize detection of DOM-related faults as most high impact faults belong to this category. Finally, developers can use the error patterns we found to design more powerful static analysis tools for JavaScript.}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/garousi_ist13.html b/publications/garousi_ist13.html
new file mode 100644
index 00000000..b9d9ea2e
--- /dev/null
+++ b/publications/garousi_ist13.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A Systematic Mapping Study of Web Application Testing
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
V. Garousi, A. Mesbah, A. Betin Can and S. Mirshokraie, “A Systematic Mapping Study of Web Application Testing” , Information and Software Technology , vol. 55, no. 8, 1374--1396, 2013.
+
+
+
+
+
+
+ BibTeX
+
+
@article{garousi:ist13,
+ author = {Garousi, Vahid and Mesbah, Ali and Betin Can, A. and Mirshokraie, Shabnam},
+ title = {A Systematic Mapping Study of Web Application Testing},
+ journal = {Information and Software Technology},
+ volume = {55},
+ number = {8},
+ year = {2013},
+ pages = {1374--1396},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/ist13.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/gharavi_iwwost08.html b/publications/gharavi_iwwost08.html
new file mode 100644
index 00000000..c88d1f1f
--- /dev/null
+++ b/publications/gharavi_iwwost08.html
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Modelling and Generating Ajax Applications: A Model-Driven Approach
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
V. Gharavi, A. Mesbah and A. van Deursen, “Modelling and Generating Ajax Applications: A Model-Driven Approach” , in Proceedings of the 7th ICWE International Workshop on Web-Oriented
+ Software Technologies (IWWOST'08) , 2008, 38-43 .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{gharavi:iwwost08,
+ author = {Gharavi, Vahid and Mesbah, Ali and van Deursen, Arie},
+ title = {Modelling and Generating Ajax Applications: A Model-Driven Approach},
+ booktitle = {Proceedings of the 7th ICWE International Workshop on Web-Oriented
+ Software Technologies (IWWOST'08)},
+ year = {2008},
+ pages = {38-43}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/index.html b/publications/index.html
new file mode 100644
index 00000000..75b05f9e
--- /dev/null
+++ b/publications/index.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+ Publications - SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2013 A. Milani Fard and A. Mesbah,
“Feedback-directed Exploration of Web Applications to Derive Test Models” , in
Proceedings of the 24th IEEE International Symposium on Software Reliability Engineering (ISSRE) , 2013, 10 pages, IEEE Computer Society .
Details .
+
S. Mirshokraie, A. Mesbah and K. Pattabiraman,
“Pythia: Generating Test Cases with Oracles for JavaScript Applications” , in
Proceedings of the ACM/IEEE International Conference on Automated Software Engineering (ASE), New Ideas Track , 2013, IEEE Computer Society .
Details .
+
A. Milani Fard and A. Mesbah,
“JSNose: Detecting JavaScript Code Smells” , in
Proceedings of the IEEE International Conference on Source Code Analysis and Manipulation (SCAM) , 2013, 10 pages, IEEE Computer Society .
Details .
Downloads: paper
+
F. Ocariza, K. Bajaj, K. Pattabiraman and A. Mesbah,
“An Empirical Study of Client-Side JavaScript Bugs” , in
Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM) , 2013, 10 pages, IEEE Computer Society .
Details .
Downloads: paper
+
M. Erfani Joorabchi, A. Mesbah and P. Kruchten,
“Real Challenges in Mobile App Development” , in
Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM) , 2013, 10 pages, IEEE Computer Society .
Details .
Downloads: paper
+
J. Lo, E. Wohlstadter and A. Mesbah,
“Live Migration of JavaScript Web Apps” , in
Proceedings of the International World Wide Web Conference, Demo Track (WWW) , 2013, 4 pages, ACM .
Details .
+
J. Lo, E. Wohlstadter and A. Mesbah,
“Imagen: Runtime Migration of Browser Sessions for JavaScript Web Applications” , in
Proceedings of the International World Wide Web Conference (WWW) , 2013, 815–825, ACM .
Details .
Downloads: paper
+
V. Garousi, A. Mesbah, A. Betin Can and S. Mirshokraie,
“A Systematic Mapping Study of Web Application Testing” ,
Information and Software Technology , vol. 55, no. 8, 1374–1396, 2013.
Details .
Downloads: paper
+
S. Mirshokraie, A. Mesbah and K. Pattabiraman,
“Efficient JavaScript Mutation Testing” , in
Proceedings of the International Conference on Software Testing, Verification and Validation (ICST) , 2013, IEEE Computer Society,
[Best Paper Runner-up Award] .
Details .
Downloads: paper
+
Z. Behfarshad and A. Mesbah,
“Hidden-Web Induced by Client-Side Scripting: An Empirical Study” , in
Proceedings of the International Conference on Web Engineering (ICWE) , 2013, vol. 7977, 52–67, Springer,
[Best Paper Award] .
Details .
Downloads: paper
+
2012 M. Erfani Joorabchi and A. Mesbah,
“Reverse Engineering iOS Mobile Applications” , in
Proceedings of the 19th Working Conference on Reverse Engineering (WCRE) , 2012, 177–186, IEEE Computer Society .
Details .
Downloads: paper
+
S. Mirshokraie and A. Mesbah,
“JSART: JavaScript Assertion-based Regression Testing” , in
Proceedings of the 12th International Conference on Web Engineering (ICWE) , 2012, 238–252, Springer .
Details .
Downloads: paper
+
A. Mesbah and S. Mirshokraie,
“Automated Analysis of CSS Rules to Support Style Maintenance” , in
Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE) , 2012, 408–418, IEEE Computer Society .
Details .
Downloads: paper
+
F. J. Ocariza, K. Pattabiraman and A. Mesbah,
“AutoFLox: An Automatic Fault Localizer for Client-Side JavaScript” , in
Proceedings of the IEEE International Conference on Software Testing, Verification and Validation (ICST) , 2012, 31–40, IEEE Computer Society .
Details .
Downloads: paper
+
A. Mesbah, A. van Deursen and S. Lenselink,
“Crawling Ajax-based Web Applications through Dynamic Analysis of User Interface State Changes” ,
ACM Transactions on the Web (TWEB) , vol. 6, no. 1, 3:1–3:30, 2012.
Details .
Downloads: paper
+
A. Mesbah, A. van Deursen and D. Roest,
“Invariant-based Automatic Testing of Modern Web Applications” ,
IEEE Transactions on Software Engineering (TSE) , vol. 38, no. 1, 35–53, 2012.
Details .
Downloads: paper
+
2011 A. Mesbah and M. R. Prasad,
“Automated Cross-Browser Compatibility Testing” , in
Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE) , 2011, 561–570, ACM .
Details .
Downloads: paper
+
2010 A. van Deursen, A. Mesbah, B. Cornelissen, A. Zaidman, M. Pinzger and A. Guzzi,
“Adinda: A knowledgeable, Browser-Based IDE” , in
Companion Proceedings of the 32nd International Conference on Software Engineering, New Ideas and Emerging Results Track (ICSE NIER) , 2010, 203–206, ACM .
Details .
+
D. Roest, A. Mesbah and A. van Deursen,
“Regression Testing Ajax Applications: Coping with Dynamism” , in
Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST) , 2010, 128–136, IEEE Computer Society .
Details .
+
A. van Deursen and A. Mesbah,
“Research Issues in the Automated Testing of Ajax Applications” , in
Proceedings of the 36th International Conference on Current Trends in Theory and Practice of Computer Science (SOFSEM) , 2010, 16–28, Lecture Notes in Computer Science 5901Springer-Verlag .
Details .
+
2009 A. Mesbah,
“Analysis and Testing of Ajax-based Single-Page Web Applications” , PhD thesis, 2009.
Details .
Downloads: paper
+
C.-P. Bezemer, A. Mesbah and A. van Deursen,
“Automated Security Testing of Web Widget Interactions” , in
Proceedings of the 7th joint meeting of the European Software Engineering Conference and the ACM SIGSOFT symposium on the Foundations of Software Engineering (ESEC-FSE) , 2009, 81–91, ACM .
Details .
Downloads: paper
+
E. Bozdag, A. Mesbah and A. van Deursen,
“Performance Testing of Data Delivery Techniques for Ajax Applications” ,
Journal of Web Engineering , vol. 8, no. 4, 287–315, 2009.
Details .
Downloads: paper
+
A. Mesbah and A. van Deursen,
“Invariant-Based Automatic Testing of Ajax User Interfaces” , in
Proceedings of the 31st ACM/IEEE International Conference on Software Engineering (ICSE) , 2009, 210–220, IEEE Computer Society,
[ACM SIGSOFT Distinguished Paper Award] .
Details .
Downloads: paper
+
2008 A. Mesbah, E. Bozdag and A. van Deursen,
“Crawling Ajax by Inferring User Interface State Changes” , in
Proceedings of the 8th International Conference on Web Engineering (ICWE) , 2008, 122–134, IEEE Computer Society .
Details .
Downloads: paper
+
V. Gharavi, A. Mesbah and A. van Deursen,
“Modelling and Generating Ajax Applications: A Model-Driven Approach” , in
Proceedings of the 7th ICWE International Workshop on Web-Oriented Software Technologies (IWWOST’08) , 2008, 38-43 .
Details .
+
A. Mesbah and A. van Deursen,
“A Component- and Push-based Architectural Style for Ajax Applications” ,
Journal of Systems and Software (JSS) , vol. 81, no. 12, 2194–2209, 2008.
Details .
+
2007 A. Mesbah and A. van Deursen,
“Migrating Multi-page Web Applications to Single-page Ajax Interfaces” , in
Proceedings of the 11th Conference on Software Maintenance and Reengineering (CSMR) , 2007, 181–190, IEEE Computer Society .
Details .
+
A. Mesbah and A. van Deursen,
“An Architectural Style for Ajax” , in
Proceedings of the 6th Working IEEE/IFIP Conference on Software Architecture (WICSA) , 2007, 44–53, IEEE Computer Society .
Details .
+
E. Bozdag, A. Mesbah and A. van Deursen,
“A Comparison of Push and Pull Techniques for Ajax” , in
Proceedings of the 9th IEEE International Symposium on Web Site Evolution (WSE) , 2007, 15–22, IEEE Computer Society .
Details .
+
A. Mesbah,
“Ajaxifying Classic Web Applications” , in
Proceedings of the 29th International Conference on Software Engineering, Doctoral Symposium (ICSE) , 2007, 81–82, IEEE Computer Society .
Details .
Downloads: paper
+
2005 A. Mesbah and A. van Deursen,
“Crosscutting Concerns in J2EE Applications” , in
Proceedings of the 7th International Symposium on Web Site Evolution (WSE) , 2005, 14–21, IEEE Computer Society .
Details .
Downloads: paper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/james_imagen.html b/publications/james_imagen.html
new file mode 100644
index 00000000..dde00f22
--- /dev/null
+++ b/publications/james_imagen.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Imagen: Runtime Migration of Browser Sessions for JavaScript Web Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
J. Lo, E. Wohlstadter and A. Mesbah, “Imagen: Runtime Migration of Browser Sessions for JavaScript Web Applications” , in Proceedings of the International World Wide Web Conference (WWW) , 2013, 815--825, ACM .
+
+
[Acceptance rate 15%]
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{james:imagen,
+ author = {Lo, James and Wohlstadter, Eric and Mesbah, Ali},
+ title = {Imagen: Runtime Migration of Browser Sessions for JavaScript Web Applications},
+ booktitle = {Proceedings of the International World Wide Web Conference (WWW)},
+ publisher = {ACM},
+ pages = {815--825},
+ year = {2013},
+ url = {http://ece.ubc.ca/~amesbah/docs/www13.pdf},
+ note = {[Acceptance rate 15%]}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/james_imagendemo.html b/publications/james_imagendemo.html
new file mode 100644
index 00000000..6a697633
--- /dev/null
+++ b/publications/james_imagendemo.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Live Migration of JavaScript Web Apps
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
J. Lo, E. Wohlstadter and A. Mesbah, “Live Migration of JavaScript Web Apps” , in Proceedings of the International World Wide Web Conference, Demo Track (WWW) , 2013, 4 pages, ACM .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{james:imagendemo,
+ author = {Lo, James and Wohlstadter, Eric and Mesbah, Ali},
+ title = {Live Migration of JavaScript Web Apps},
+ booktitle = {Proceedings of the International World Wide Web Conference, Demo Track (WWW)},
+ publisher = {ACM},
+ pages = {4 pages},
+ year = {2013}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/jana_icwe13.html b/publications/jana_icwe13.html
new file mode 100644
index 00000000..300a125f
--- /dev/null
+++ b/publications/jana_icwe13.html
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hidden-Web Induced by Client-Side Scripting: An Empirical Study
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
Z. Behfarshad and A. Mesbah, “Hidden-Web Induced by Client-Side Scripting: An Empirical Study” , in Proceedings of the International Conference on Web Engineering (ICWE) , 2013, vol. 7977, 52--67, Springer, [Best Paper Award] .
+
+
+
+
+
+ Abstract
+
+ Client-side JavaScript is increasingly used for enhancing web application functionality, interactivity, and responsiveness. Through the execution of JavaScript code in browsers, the DOM tree representing a webpage at runtime, can be incrementally updated without requiring a URL change. This dynamically updated content is hidden from general search engines. In this paper, we present the first empirical study on measuring and characterizing the hidden-web induced as a result of client-side JavaScript execution. Our study reveals that this type of hidden-web content is prevalent in online web applications today: from the 500 websites we analyzed, 95\% contain client-side hidden-web content; On those websites that contain client-side hidden-web content, (1) on average, 62\% of the web states are hidden, (2) per hidden state, there is an average of 19 kilobytes of data that is hidden from which 0.6 kilobytes contain textual content, (3) the DIV element is the most common clickable element used (61\%) to initiate this type of hidden-web state transition, and (4) on average 25 minutes is required to dynamically crawl 50 DOM states. Further, our study indicates that there is a correlation between DOM tree size and hidden-web content, but no correlation exists between the amount of JavaScript code and client-side hidden-web.
+
+
+ BibTeX
+
+
@inproceedings{jana:icwe13,
+ author = {Behfarshad, Zahra and Mesbah, Ali},
+ title = {Hidden-Web Induced by Client-Side Scripting: An Empirical Study},
+ booktitle = {Proceedings of the International Conference on Web Engineering (ICWE)},
+ year = {2013},
+ series = {Lecture Notes in Computer Science},
+ volume = {7977},
+ publisher = {Springer},
+ pages = {52--67},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icwe13.pdf},
+ award = {[Best Paper Award]},
+ abstract = {Client-side JavaScript is increasingly used for enhancing web application functionality, interactivity, and responsiveness. Through the execution of JavaScript code in browsers, the DOM tree representing a webpage at runtime, can be incrementally updated without requiring a URL change. This dynamically updated content is hidden from general search engines. In this paper, we present the first empirical study on measuring and characterizing the hidden-web induced as a result of client-side JavaScript execution. Our study reveals that this type of hidden-web content is prevalent in online web applications today: from the 500 websites we analyzed, 95\% contain client-side hidden-web content; On those websites that contain client-side hidden-web content, (1) on average, 62\% of the web states are hidden, (2) per hidden state, there is an average of 19 kilobytes of data that is hidden from which 0.6 kilobytes contain textual content, (3) the DIV element is the most common clickable element used (61\%) to initiate this type of hidden-web state transition, and (4) on average 25 minutes is required to dynamically crawl 50 DOM states. Further, our study indicates that there is a correlation between DOM tree size and hidden-web content, but no correlation exists between the amount of JavaScript code and client-side hidden-web.}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_ccc.html b/publications/mesbah_ccc.html
new file mode 100644
index 00000000..e32935bb
--- /dev/null
+++ b/publications/mesbah_ccc.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Crosscutting Concerns in J2EE Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and A. van Deursen, “Crosscutting Concerns in J2EE Applications” , in Proceedings of the 7th International Symposium on Web Site Evolution (WSE) , 2005, 14--21, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:ccc,
+ author = {Mesbah, Ali and van Deursen, Arie},
+ title = {Crosscutting Concerns in J2EE Applications},
+ booktitle = {Proceedings of the 7th International Symposium on Web Site Evolution (WSE)},
+ year = {2005},
+ pages = {14--21},
+ publisher = {IEEE Computer Society},
+ url = {http://dx.doi.org/10.1109/WSE.2005.4}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_icse07.html b/publications/mesbah_icse07.html
new file mode 100644
index 00000000..698064d4
--- /dev/null
+++ b/publications/mesbah_icse07.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ajaxifying Classic Web Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah, “Ajaxifying Classic Web Applications” , in Proceedings of the 29th International Conference on Software Engineering, Doctoral Symposium (ICSE) , 2007, 81--82, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:icse07,
+ author = {Mesbah, Ali},
+ title = {Ajaxifying Classic Web Applications},
+ booktitle = {Proceedings of the 29th International Conference on Software Engineering, Doctoral Symposium (ICSE)},
+ year = {2007},
+ pages = {81--82},
+ publisher = {IEEE Computer Society},
+ url = {http://dx.doi.org/10.1109/ICSECOMPANION.2007.19}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_icse09.html b/publications/mesbah_icse09.html
new file mode 100644
index 00000000..1b5f9337
--- /dev/null
+++ b/publications/mesbah_icse09.html
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Invariant-Based Automatic Testing of Ajax User Interfaces
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and A. van Deursen, “Invariant-Based Automatic Testing of Ajax User Interfaces” , in Proceedings of the 31st ACM/IEEE International Conference on Software Engineering (ICSE) , 2009, 210--220, IEEE Computer Society, [ACM SIGSOFT Distinguished Paper Award] .
+
+
[Acceptance rate 12\%]
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:icse09,
+ author = {Mesbah, Ali and van Deursen, Arie},
+ title = {Invariant-Based Automatic Testing of Ajax User Interfaces},
+ booktitle = {Proceedings of the 31st ACM/IEEE International Conference on Software Engineering (ICSE)},
+ year = {2009},
+ pages = {210--220},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icse09.pdf},
+ note = {[Acceptance rate 12\%]},
+ award = {[ACM SIGSOFT Distinguished Paper Award]}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_icse11.html b/publications/mesbah_icse11.html
new file mode 100644
index 00000000..0ac43730
--- /dev/null
+++ b/publications/mesbah_icse11.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Automated Cross-Browser Compatibility Testing
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and M. R. Prasad, “Automated Cross-Browser Compatibility Testing” , in Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE) , 2011, 561--570, ACM .
+
+
[Acceptance rate 14%]
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:icse11,
+ author = {Mesbah, Ali and Prasad, Mukul R.},
+ title = {Automated Cross-Browser Compatibility Testing},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ year = {2011},
+ pages = {561--570},
+ publisher = {ACM},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icse11.pdf},
+ note = {[Acceptance rate 14%]}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_icse2012.html b/publications/mesbah_icse2012.html
new file mode 100644
index 00000000..7f41b80f
--- /dev/null
+++ b/publications/mesbah_icse2012.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Automated Analysis of CSS Rules to Support Style Maintenance
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and S. Mirshokraie, “Automated Analysis of CSS Rules to Support Style Maintenance” , in Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE) , 2012, 408--418, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:icse2012,
+ author = {Mesbah, Ali and Mirshokraie, Shabnam},
+ title = {Automated Analysis of CSS Rules to Support Style Maintenance},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ year = {2012},
+ pages = {408--418},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icse12.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_icwe08.html b/publications/mesbah_icwe08.html
new file mode 100644
index 00000000..1c561b0d
--- /dev/null
+++ b/publications/mesbah_icwe08.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Crawling Ajax by Inferring User Interface State Changes
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah, E. Bozdag and A. van Deursen, “Crawling Ajax by Inferring User Interface State Changes” , in Proceedings of the 8th International Conference on Web Engineering (ICWE) , 2008, 122--134, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:icwe08,
+ author = {Mesbah, Ali and Bozdag, Engin and van Deursen, Arie},
+ title = {Crawling Ajax by Inferring User Interface State Changes},
+ booktitle = {Proceedings of the 8th International Conference on Web Engineering (ICWE)},
+ year = {2008},
+ pages = {122--134},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icwe08.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_jss08.html b/publications/mesbah_jss08.html
new file mode 100644
index 00000000..5cbae73a
--- /dev/null
+++ b/publications/mesbah_jss08.html
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A Component- and Push-based Architectural Style for Ajax Applications
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and A. van Deursen, “A Component- and Push-based Architectural Style for Ajax Applications” , Journal of Systems and Software (JSS) , vol. 81, no. 12, 2194--2209, 2008.
+
+
+
+
+
+
+ BibTeX
+
+
@article{mesbah:jss08,
+ author = {Mesbah, Ali and van Deursen, Arie},
+ title = {A Component- and Push-based Architectural Style for Ajax Applications},
+ journal = {Journal of Systems and Software (JSS)},
+ year = {2008},
+ volume = {81},
+ pages = {2194--2209},
+ number = {12}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_migrate07.html b/publications/mesbah_migrate07.html
new file mode 100644
index 00000000..0dcbf4d1
--- /dev/null
+++ b/publications/mesbah_migrate07.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Migrating Multi-page Web Applications to Single-page Ajax Interfaces
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and A. van Deursen, “Migrating Multi-page Web Applications to Single-page Ajax Interfaces” , in Proceedings of the 11th Conference on Software Maintenance and Reengineering (CSMR) , 2007, 181--190, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:migrate07,
+ author = {Mesbah, Ali and van Deursen, Arie},
+ title = {Migrating Multi-page Web Applications to Single-page Ajax Interfaces},
+ booktitle = {Proceedings of the 11th Conference on Software Maintenance and Reengineering (CSMR)},
+ year = {2007},
+ pages = {181--190},
+ publisher = {IEEE Computer Society}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_phd.html b/publications/mesbah_phd.html
new file mode 100644
index 00000000..ab0038ee
--- /dev/null
+++ b/publications/mesbah_phd.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Analysis and Testing of Ajax-based Single-Page Web Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah, “Analysis and Testing of Ajax-based Single-Page Web Applications” , PhD thesis, 2009.
+
+
+
+
+
+
+ BibTeX
+
+
@phdthesis{mesbah:phd,
+ author = {Mesbah, Ali},
+ title = {Analysis and Testing of Ajax-based Single-Page Web Applications},
+ school = {Delft University of Technology},
+ year = {2009},
+ tutor = {Arie van Deursen},
+ isbn = {978-90-79982-02-8},
+ url = {http://www.st.ewi.tudelft.nl/%7Emesbah/docs/mesbah-dissertation.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_tse12.html b/publications/mesbah_tse12.html
new file mode 100644
index 00000000..d452e636
--- /dev/null
+++ b/publications/mesbah_tse12.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Invariant-based Automatic Testing of Modern Web Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah, A. van Deursen and D. Roest, “Invariant-based Automatic Testing of Modern Web Applications” , IEEE Transactions on Software Engineering (TSE) , vol. 38, no. 1, 35--53, 2012.
+
+
+
+
+
+
+ BibTeX
+
+
@article{mesbah:tse12,
+ author = {Mesbah, Ali and van Deursen, Arie and Roest, Danny},
+ title = {Invariant-based Automatic Testing of Modern Web Applications},
+ journal = {IEEE Transactions on Software Engineering (TSE)},
+ year = {2012},
+ volume = {38},
+ number = {1},
+ pages = {35--53},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/tse11.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_tweb12.html b/publications/mesbah_tweb12.html
new file mode 100644
index 00000000..c6af8746
--- /dev/null
+++ b/publications/mesbah_tweb12.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Crawling Ajax-based Web Applications Through Dynamic Analysis of User Interface State Changes
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah, A. van Deursen and S. Lenselink, “Crawling Ajax-based Web Applications through Dynamic Analysis of User Interface State Changes” , ACM Transactions on the Web (TWEB) , vol. 6, no. 1, 3:1--3:30, 2012.
+
+
+
+
+
+
+ BibTeX
+
+
@article{mesbah:tweb12,
+ author = {Mesbah, Ali and van Deursen, Arie and Lenselink, Stefan},
+ title = {Crawling Ajax-based Web Applications through Dynamic Analysis of User Interface State Changes},
+ journal = {ACM Transactions on the Web (TWEB)},
+ year = {2012},
+ volume = {6},
+ number = {1},
+ pages = {3:1--3:30},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/tweb-final.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mesbah_wicsa07.html b/publications/mesbah_wicsa07.html
new file mode 100644
index 00000000..4bb92755
--- /dev/null
+++ b/publications/mesbah_wicsa07.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An Architectural Style for Ajax
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
A. Mesbah and A. van Deursen, “An Architectural Style for Ajax” , in Proceedings of the 6th Working IEEE/IFIP Conference on Software Architecture
+ (WICSA) , 2007, 44--53, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mesbah:wicsa07,
+ author = {Mesbah, Ali and van Deursen, Arie},
+ title = {An Architectural Style for Ajax},
+ booktitle = {Proceedings of the 6th Working IEEE/IFIP Conference on Software Architecture
+ (WICSA)},
+ year = {2007},
+ pages = {44--53},
+ publisher = {IEEE Computer Society}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mona_esem13.html b/publications/mona_esem13.html
new file mode 100644
index 00000000..7f7ccbeb
--- /dev/null
+++ b/publications/mona_esem13.html
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Real Challenges in Mobile App Development
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
M. Erfani Joorabchi, A. Mesbah and P. Kruchten, “Real Challenges in Mobile App Development” , in Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM) , 2013, 10 pages, IEEE Computer Society .
+
+
+
+
+
+ Abstract
+
+ Context: Mobile app development is a relatively new phenomenon that is increasing rapidly due to the ubiquity and popularity of smartphones among end-users. Objective: The goal of our study is to gain an understanding of the main challenges developers face in practice when they build apps for different mobile devices. Method: We conducted a qualitative study, following a Grounded Theory approach, in which we interviewed 12
+senior mobile developers from 9 different companies, followed by a semi-structured survey, with 188 respondents from the mobile development community. Results: The outcome is an overview of the current challenges faced by mobile developers in practice, such as developing apps across multiple platforms, lack of robust monitoring, analysis, and testing tools, and emulators that are slow or miss many features of mobile devices. Conclusion: Based
+on our findings of the current practices and challenges, we highlight areas that require more attention from the research and development community.
+
+
+ BibTeX
+
+
@inproceedings{mona:esem13,
+ author = {Erfani Joorabchi, Mona and Mesbah, Ali and Kruchten, Philippe},
+ title = {Real Challenges in Mobile App Development},
+ booktitle = {Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)},
+ year = {2013},
+ publisher = {IEEE Computer Society},
+ pages = {10 pages},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/mona-esem13.pdf},
+ abstract = {Context: Mobile app development is a relatively new phenomenon that is increasing rapidly due to the ubiquity and popularity of smartphones among end-users. Objective: The goal of our study is to gain an understanding of the main challenges developers face in practice when they build apps for different mobile devices. Method: We conducted a qualitative study, following a Grounded Theory approach, in which we interviewed 12
+ senior mobile developers from 9 different companies, followed by a semi-structured survey, with 188 respondents from the mobile development community. Results: The outcome is an overview of the current challenges faced by mobile developers in practice, such as developing apps across multiple platforms, lack of robust monitoring, analysis, and testing tools, and emulators that are slow or miss many features of mobile devices. Conclusion: Based
+ on our findings of the current practices and challenges, we highlight areas that require more attention from the research and development community.}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/mona_wcre12.html b/publications/mona_wcre12.html
new file mode 100644
index 00000000..45bc96cb
--- /dev/null
+++ b/publications/mona_wcre12.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reverse Engineering iOS Mobile Applications
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
M. Erfani Joorabchi and A. Mesbah, “Reverse Engineering iOS Mobile Applications” , in Proceedings of the 19th Working Conference on Reverse Engineering (WCRE) , 2012, 177--186, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{mona:wcre12,
+ author = {Erfani Joorabchi, Mona and Mesbah, Ali},
+ title = {Reverse Engineering iOS Mobile Applications},
+ booktitle = {Proceedings of the 19th Working Conference on Reverse Engineering (WCRE)},
+ year = {2012},
+ publisher = {IEEE Computer Society},
+ pages = {177--186},
+ url = {http://ece.ubc.ca/~amesbah/docs/wcre12.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/ocariza_icst12.html b/publications/ocariza_icst12.html
new file mode 100644
index 00000000..7e0c395d
--- /dev/null
+++ b/publications/ocariza_icst12.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AutoFLox: An Automatic Fault Localizer for Client-Side JavaScript
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
F. J. Ocariza, K. Pattabiraman and A. Mesbah, “AutoFLox: An Automatic Fault Localizer for Client-Side JavaScript” , in Proceedings of the IEEE International Conference on Software Testing, Verification and Validation (ICST) , 2012, 31--40, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{ocariza:icst12,
+ title = {AutoFLox: An Automatic Fault Localizer for Client-Side JavaScript},
+ author = {Ocariza, Frolin Jr and Pattabiraman, Karthik and Mesbah, Ali},
+ booktitle = {Proceedings of the IEEE International Conference on Software Testing, Verification and Validation (ICST)},
+ year = {2012},
+ pages = {31--40},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icst12.pdf}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/shabnam_ase13.html b/publications/shabnam_ase13.html
new file mode 100644
index 00000000..86128e72
--- /dev/null
+++ b/publications/shabnam_ase13.html
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pythia: Generating Test Cases With Oracles for JavaScript Applications
+
+
+
+
+
+
+
+
+
+
+ Citation
+
+
S. Mirshokraie, A. Mesbah and K. Pattabiraman, “Pythia: Generating Test Cases with Oracles for JavaScript Applications” , in Proceedings of the ACM/IEEE International Conference on Automated Software Engineering (ASE), New Ideas Track , 2013, IEEE Computer Society .
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{shabnam:ase13,
+ author = {Mirshokraie, Shabnam and Mesbah, Ali and Pattabiraman, Karthik},
+ title = {Pythia: Generating Test Cases with Oracles for JavaScript Applications},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Automated Software Engineering (ASE), New Ideas Track},
+ publisher = {IEEE Computer Society},
+ year = {2013}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/shabnam_icwe12.html b/publications/shabnam_icwe12.html
new file mode 100644
index 00000000..bf1fa150
--- /dev/null
+++ b/publications/shabnam_icwe12.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ JSART: JavaScript Assertion-based Regression Testing
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
S. Mirshokraie and A. Mesbah, “JSART: JavaScript Assertion-based Regression Testing” , in Proceedings of the 12th International Conference on Web Engineering (ICWE) , 2012, 238--252, Springer .
+
+
[Acceptance rate 20%]
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{shabnam:icwe12,
+ author = {Mirshokraie, Shabnam and Mesbah, Ali},
+ title = {JSART: JavaScript Assertion-based Regression Testing},
+ booktitle = {Proceedings of the 12th International Conference on Web Engineering (ICWE)},
+ year = {2012},
+ pages = {238--252},
+ publisher = {Springer},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icwe12.pdf},
+ note = {[Acceptance rate 20%]}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/publications/shabnam_mutandis.html b/publications/shabnam_mutandis.html
new file mode 100644
index 00000000..b47b3677
--- /dev/null
+++ b/publications/shabnam_mutandis.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+ SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Efficient JavaScript Mutation Testing
+
+
+
+
+ [PDF ]
+
+
+
+
+
+
+ Citation
+
+
S. Mirshokraie, A. Mesbah and K. Pattabiraman, “Efficient JavaScript Mutation Testing” , in Proceedings of the International Conference on Software Testing, Verification and Validation (ICST) , 2013, IEEE Computer Society, [Best Paper Runner-up Award] .
+
+
[Acceptance rate 25%]
+
+
+
+
+
+
+ BibTeX
+
+
@inproceedings{shabnam:mutandis,
+ author = {Mirshokraie, Shabnam and Mesbah, Ali and Pattabiraman, Karthik},
+ title = {Efficient JavaScript Mutation Testing},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ year = {2013},
+ url = {http://ece.ubc.ca/~amesbah/docs/icst13.pdf},
+ note = {[Acceptance rate 25%]},
+ award = {[Best Paper Runner-up Award]}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/robots.txt b/robots.txt
new file mode 100644
index 00000000..ef99e8bb
--- /dev/null
+++ b/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Disallow:
+
+Sitemap: http://saltlab.github.com/sitemap.xml
\ No newline at end of file
diff --git a/sass/_base.scss b/sass/_base.scss
new file mode 100644
index 00000000..05fdd005
--- /dev/null
+++ b/sass/_base.scss
@@ -0,0 +1,5 @@
+@import "base/utilities";
+@import "base/solarized";
+@import "base/theme";
+@import "base/typography";
+@import "base/layout";
diff --git a/sass/_partials.scss b/sass/_partials.scss
new file mode 100644
index 00000000..99c28b63
--- /dev/null
+++ b/sass/_partials.scss
@@ -0,0 +1,8 @@
+@import "partials/header";
+@import "partials/navigation";
+@import "partials/blog";
+@import "partials/sharing";
+@import "partials/syntax";
+@import "partials/archive";
+@import "partials/sidebar";
+@import "partials/footer";
diff --git a/sass/base/_layout.scss b/sass/base/_layout.scss
new file mode 100644
index 00000000..81903428
--- /dev/null
+++ b/sass/base/_layout.scss
@@ -0,0 +1,192 @@
+$max-width: 1200px !default;
+
+// Padding used for layout margins
+$pad-min: 18px !default;
+$pad-narrow: 25px !default;
+$pad-medium: 35px !default;
+$pad-wide: 55px !default;
+
+// Sidebar widths used in media queries
+$sidebar-width-medium: 240px !default;
+$sidebar-pad-medium: 15px !default;
+$sidebar-pad-wide: 20px !default;
+$sidebar-width-wide: 300px !default;
+
+$indented-lists: false !default;
+
+$header-font-size: 1em !default;
+$header-padding-top: 1.5em !default;
+$header-padding-bottom: 1.5em !default;
+
+.group { @include pie-clearfix; }
+
+@mixin collapse-sidebar {
+ float: none;
+ width: auto;
+ clear: left;
+ margin: 0;
+ padding: 0 $pad-medium 1px;
+ background-color: lighten($sidebar-bg, 2);
+ border-top: 1px solid lighten($sidebar-border, 4);
+ section {
+ &.odd, &.even { float: left; width: 48%; }
+ &.odd { margin-left: 0; }
+ &.even { margin-left: 4%; }
+ }
+ &.thirds section {
+ width: 30%;
+ margin-left: 5%;
+ &.first {
+ margin-left: 0;
+ clear: both;
+ }
+ }
+}
+
+body {
+ -webkit-text-size-adjust: none;
+ max-width: $max-width;
+ position: relative;
+ margin: 0 auto;
+ > header, > nav, > footer, #content > article, #content > div > article, #content > div > section {
+ @extend .group;
+ padding-left: $pad-min;
+ padding-right: $pad-min;
+ @media only screen and (min-width: 480px) {
+ padding-left: $pad-narrow;
+ padding-right: $pad-narrow;
+ }
+ @media only screen and (min-width: 768px) {
+ padding-left: $pad-medium;
+ padding-right: $pad-medium;
+ }
+ @media only screen and (min-width: 992px) {
+ padding-left: $pad-wide;
+ padding-right: $pad-wide;
+ }
+ }
+ div.pagination {
+ @extend .group;
+ margin-left: $pad-min;
+ margin-right: $pad-min;
+ @media only screen and (min-width: 480px) {
+ margin-left: $pad-narrow;
+ margin-right: $pad-narrow;
+ }
+ @media only screen and (min-width: 768px) {
+ margin-left: $pad-medium;
+ margin-right: $pad-medium;
+ }
+ @media only screen and (min-width: 992px) {
+ margin-left: $pad-wide;
+ margin-right: $pad-wide;
+ }
+ }
+ > header {
+ font-size: $header-font-size;
+ padding-top: $header-padding-top;
+ padding-bottom: $header-padding-bottom;
+ }
+}
+
+#content {
+ overflow: hidden;
+ > div, > article { width: 100%; }
+}
+
+aside.sidebar {
+ float: none;
+ padding: 0 $pad-min 1px;
+ background-color: lighten($sidebar-bg, 2);
+ border-top: 1px solid $sidebar-border;
+ @extend .group;
+}
+
+.flex-content { max-width: 100%; height: auto; }
+
+.basic-alignment {
+ &.left { float: left; margin-right: 1.5em; }
+ &.right { float: right; margin-left: 1.5em; }
+ &.center { display:block; margin: 0 auto 1.5em; }
+ &.left, &.right { margin-bottom: .8em; }
+}
+
+.toggle-sidebar { &, .no-sidebar & { display: none; }}
+
+body.sidebar-footer {
+ @media only screen and (min-width: 750px) {
+ aside.sidebar{ @include collapse-sidebar; }
+ }
+ #content { margin-right: 0px; }
+ .toggle-sidebar { display: none; }
+}
+
+@media only screen and (min-width: 550px) {
+ body > header { font-size: $header-font-size; }
+}
+@media only screen and (min-width: 750px) {
+ aside.sidebar { @include collapse-sidebar; }
+}
+#main, #content, .sidebar {
+ @extend .group;
+}
+@media only screen and (min-width: 768px) {
+ body { -webkit-text-size-adjust: auto; }
+ body > header { font-size: $header-font-size * 1.2; }
+ #main {
+ padding: 0;
+ margin: 0 auto;
+ }
+ #content {
+ overflow: visible;
+ margin-right: $sidebar-width-medium;
+ position: relative;
+ .no-sidebar & { margin-right: 0; border-right: 0; }
+ .collapse-sidebar & { margin-right: 20px; }
+ > div, > article {
+ padding-top: $pad-medium/2;
+ padding-bottom: $pad-medium/2;
+ float: left;
+ }
+ }
+ aside.sidebar {
+ width: $sidebar-width-medium - $sidebar-pad-medium*2;
+ padding: 0 $sidebar-pad-medium $sidebar-pad-medium;
+ background: none;
+ clear: none;
+ float: left;
+ margin: 0 -100% 0 0;
+ section {
+ width: auto; margin-left: 0;
+ &.odd, &.even { float: none; width: auto; margin-left: 0; }
+ }
+ .collapse-sidebar & {
+ @include collapse-sidebar;
+ }
+ }
+}
+
+@media only screen and (min-width: 992px) {
+ body > header { font-size: $header-font-size * 1.3; }
+ #content { margin-right: $sidebar-width-wide; }
+ #content {
+ > div, > article {
+ padding-top: $pad-wide/2;
+ padding-bottom: $pad-wide/2;
+ }
+ }
+ aside.sidebar {
+ width: $sidebar-width-wide - $sidebar-pad-wide*2;
+ padding: 1.2em $sidebar-pad-wide $sidebar-pad-wide;
+ .collapse-sidebar & {
+ padding: { left: $pad-wide; right: $pad-wide; }
+ }
+ }
+}
+
+@if $indented-lists == false {
+ @media only screen and (min-width: 768px) {
+ ul, ol { margin-left: 0; }
+ }
+}
+
diff --git a/sass/base/_solarized.scss b/sass/base/_solarized.scss
new file mode 100644
index 00000000..45d8fc5e
--- /dev/null
+++ b/sass/base/_solarized.scss
@@ -0,0 +1,46 @@
+$base03: #002b36 !default; //darkest blue
+$base02: #073642 !default; //dark blue
+$base01: #586e75 !default; //darkest gray
+$base00: #657b83 !default; //dark gray
+$base0: #839496 !default; //medium gray
+$base1: #93a1a1 !default; //medium light gray
+$base2: #eee8d5 !default; //cream
+$base3: #fdf6e3 !default; //white
+$solar-yellow: #b58900 !default;
+$solar-orange: #cb4b16 !default;
+$solar-red: #dc322f !default;
+$solar-magenta: #d33682 !default;
+$solar-violet: #6c71c4 !default;
+$solar-blue: #268bd2 !default;
+$solar-cyan: #2aa198 !default;
+$solar-green: #859900 !default;
+
+$solarized: dark !default;
+
+@if $solarized == light {
+
+ $_base03: $base03;
+ $_base02: $base02;
+ $_base01: $base01;
+ $_base00: $base00;
+ $_base0: $base0;
+ $_base1: $base1;
+ $_base2: $base2;
+ $_base3: $base3;
+
+ $base03: $_base3;
+ $base02: $_base2;
+ $base01: $_base1;
+ $base00: $_base0;
+ $base0: $_base00;
+ $base1: $_base01;
+ $base2: $_base02;
+ $base3: $_base03;
+}
+
+/* non highlighted code colors */
+$pre-bg: $base03 !default;
+$pre-border: darken($base02, 5) !default;
+$pre-color: $base1 !default;
+
+
diff --git a/sass/base/_theme.scss b/sass/base/_theme.scss
new file mode 100644
index 00000000..c35136d5
--- /dev/null
+++ b/sass/base/_theme.scss
@@ -0,0 +1,85 @@
+$noise-bg: image-url('noise.png') top left !default;
+$img-border: inline-image('dotted-border.png') !default;
+
+// Main Link Colors
+$link-color: lighten(#165b94, 3) !default;
+$link-color-hover: adjust-color($link-color, $lightness: 10, $saturation: 25) !default;
+$link-color-visited: adjust-color($link-color, $hue: 80, $lightness: -4) !default;
+$link-color-active: adjust-color($link-color-hover, $lightness: -15) !default;
+
+// Main Section Colors
+$main-bg: #f8f8f8 !default;
+$page-bg: #252525 !default;
+$article-border: #eeeeee !default;
+
+$header-bg: #333 !default;
+$header-border: lighten($header-bg, 15) !default;
+$title-color: #f2f2f2 !default;
+$subtitle-color: #aaa !default;
+
+$text-color: #222 !default;
+$text-color-light: #aaa !default;
+$type-border: #ddd !default;
+
+/* Navigation */
+$nav-bg: #ccc !default;
+$nav-bg-front: image-url('noise.png') !default;
+$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11)) !default;
+$nav-color: darken($nav-bg, 38) !default;
+$nav-color-hover: darken($nav-color, 25) !default;
+$nav-placeholder: desaturate(darken($nav-bg, 10), 15) !default;
+$nav-border: darken($nav-bg, 10) !default;
+$nav-border-top: lighten($nav-bg, 15) !default;
+$nav-border-bottom: darken($nav-bg, 25) !default;
+$nav-border-left: darken($nav-bg, 11) !default;
+$nav-border-right: lighten($nav-bg, 7) !default;
+
+/* Sidebar colors */
+$sidebar-bg: #f2f2f2 !default;
+$sidebar-link-color: $text-color !default;
+$sidebar-link-color-hover: $link-color-hover !default;
+$sidebar-link-color-active: $link-color-active !default;
+$sidebar-color: change-color(mix($text-color, $sidebar-bg, 80), $hue: hue($sidebar-bg), $saturation: saturation($sidebar-bg)/2) !default;
+$sidebar-border: desaturate(darken($sidebar-bg, 7), 10) !default;
+$sidebar-border-hover: darken($sidebar-bg, 7) !default;
+$sidebar-link-color-subdued: lighten($sidebar-color, 20) !default;
+$sidebar-link-color-subdued-hover: $sidebar-link-color-hover !default;
+
+$footer-color: #888 !default;
+$footer-bg: #ccc !default;
+$footer-bg-front: image-url('noise.png') !default;
+$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11)) !default;
+$footer-color: darken($footer-bg, 38) !default;
+$footer-color-hover: darken($footer-color, 10) !default;
+$footer-border-top: lighten($footer-bg, 15) !default;
+$footer-border-bottom: darken($footer-bg, 15) !default;
+$footer-link-color: darken($footer-bg, 38) !default;
+$footer-link-color-hover: darken($footer-color, 25) !default;
+$page-border-bottom: darken($footer-bg, 5) !default;
+
+
+/* Core theme application */
+
+a {
+ @include link-colors($link-color, $hover: $link-color-hover, $focus: $link-color-hover, $visited: $link-color-visited, $active: $link-color-active);
+}
+aside.sidebar a {
+ @include link-colors($sidebar-link-color, $hover: $sidebar-link-color-hover, $focus: $sidebar-link-color-hover, $active: $sidebar-link-color-active);
+}
+a {
+ @include transition(color .3s);
+}
+
+html {
+ background: $page-bg image-url('line-tile.png') top left;
+}
+body {
+ > div {
+ background: $sidebar-bg $noise-bg;
+ border-bottom: 1px solid $page-border-bottom;
+ > div {
+ background: $main-bg $noise-bg;
+ border-right: 1px solid $sidebar-border;
+ }
+ }
+}
diff --git a/sass/base/_typography.scss b/sass/base/_typography.scss
new file mode 100644
index 00000000..0177aef6
--- /dev/null
+++ b/sass/base/_typography.scss
@@ -0,0 +1,164 @@
+$blockquote: $type-border !default;
+$sans: "PT Sans", "Helvetica Neue", Arial, sans-serif !default;
+$serif: "PT Serif", Georgia, Times, "Times New Roman", serif !default;
+$mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default;
+$heading-font-family: "Varela Round","Helvetica Neue",Arial,sans-serif !default;
+$header-title-font-family: $heading-font-family !default;
+$header-subtitle-font-family: $heading-font-family !default;
+
+// Fonts
+.heading {
+ font-family: $heading-font-family;
+}
+.sans { font-family: $sans; }
+.serif { font-family: $serif; }
+.mono { font-family: $mono; }
+
+body > header h1 {
+ font-size: 2.2em;
+ @extend .heading;
+ font-family: $header-title-font-family;
+ font-weight: normal;
+ line-height: 1.2em;
+ margin-bottom: 0.6667em;
+}
+body > header h2 {
+ font-family: $header-subtitle-font-family;
+}
+
+body {
+ line-height: 1.5em;
+ color: $text-color;
+ @extend .serif;
+}
+h1 {
+ font-size: 2.2em;
+ line-height: 1.2em;
+}
+
+@media only screen and (min-width: 992px) {
+ body { font-size: 1.15em; }
+ h1 { font-size: 2.6em; line-height: 1.2em; }
+}
+
+#{headings()}{
+ @extend .heading;
+ text-rendering: optimizelegibility;
+ margin-bottom: 1em;
+ font-weight: bold;
+}
+h2, section h1 {
+ font-size: 1.5em;
+}
+h3, section h2, section section h1 {
+ font-size: 1.3em;
+}
+h4, section h3, section section h2, section section section h1 {
+ font-size: 1em;
+}
+h5, section h4, section section h3 {
+ font-size: .9em;
+}
+h6, section h5, section section h4, section section section h3 {
+ font-size: .8em;
+}
+
+p, article blockquote, ul, ol { margin-bottom: 1.5em; }
+
+ul { list-style-type: disc;
+ ul { list-style-type: circle; margin-bottom: 0px;
+ ul { list-style-type: square; margin-bottom: 0px; }}}
+
+ol { list-style-type: decimal;
+ ol { list-style-type: lower-alpha; margin-bottom: 0px;
+ ol { list-style-type: lower-roman; margin-bottom: 0px; }}}
+
+ul, ol { &, ul, ol { margin-left: 1.3em; }}
+ul, ol { ul, ol { margin-bottom: 0em; }}
+
+strong { font-weight: bold; }
+
+em { font-style: italic; }
+
+sup, sub { font-size: 0.75em; position: relative; display: inline-block; padding: 0 .2em; line-height: .8em;}
+sup { top: -.5em; }
+sub { bottom: -.5em; }
+
+a[rev='footnote']{ font-size: .75em; padding: 0 .3em; line-height: 1; }
+
+q { font-style: italic;
+ &:before { content: "\201C"; }
+ &:after { content: "\201D"; }
+}
+
+em, dfn { font-style: italic; }
+
+strong, dfn { font-weight: bold; }
+
+del, s { text-decoration: line-through; }
+
+abbr, acronym { border-bottom: 1px dotted; cursor: help; }
+
+pre, code, tt { @extend .mono; }
+
+hr { margin-bottom: 0.2em; }
+
+small { font-size: .8em; }
+
+big { font-size: 1.2em; }
+
+article blockquote {
+ $bq-margin: 1.2em;
+ font-style: italic;
+ position: relative;
+ font-size: 1.2em;
+ line-height: 1.5em;
+ padding-left: 1em;
+ border-left: 4px solid rgba($text-color-light, .5);
+ cite {
+ font-style: italic;
+ a { color: $text-color-light !important; word-wrap: break-word; }
+ &:before { content: '\2014'; padding:{right: .3em; left: .3em;} color: $text-color-light; }
+ }
+ @media only screen and (min-width: 992px) {
+ padding-left: 1.5em;
+ border-left-width: 4px;
+ }
+}
+
+.pullquote-right:before,
+.pullquote-left:before {
+ /* Reset metrics. */
+ padding: 0;
+ border: none;
+
+ /* Content */
+ content: attr(data-pullquote);
+
+ /* Pull out to the right, modular scale based margins. */
+ float: right;
+ width: 45%;
+ margin: .5em 0 1em 1.5em;
+
+ /* Baseline correction */
+ position: relative;
+ top: 7px;
+ font-size: 1.4em;
+ line-height: 1.45em;
+}
+
+.pullquote-left:before {
+ /* Make left pullquotes align properly. */
+ float: left;
+ margin: .5em 1.5em 1em 0;
+}
+
+/* @extend this to force long lines of continuous text to wrap */
+.force-wrap {
+ white-space: -moz-pre-wrap;
+ white-space: -pre-wrap;
+ white-space: -o-pre-wrap;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
diff --git a/sass/base/_utilities.scss b/sass/base/_utilities.scss
new file mode 100644
index 00000000..2d49e659
--- /dev/null
+++ b/sass/base/_utilities.scss
@@ -0,0 +1,28 @@
+@mixin mask-image($img, $repeat: no-repeat){
+ @include experimental(mask-image, image-url($img), -webkit, -moz, -o, -ms);
+ @include experimental(mask-repeat, $repeat, -webkit, -moz, -o, -ms);
+ width: image-width($img);
+ height: image-height($img);
+}
+
+@mixin shadow-box($border: #fff .5em solid, $shadow: rgba(#000, .15) 0 1px 4px, $border-radius: .3em) {
+ @include border-radius($border-radius);
+ @include box-shadow($shadow);
+ @include box-sizing(border-box);
+ border: $border;
+}
+
+@mixin selection($bg, $color: inherit, $text-shadow: none){
+ * {
+ &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
+ &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
+ &::selection { background: $bg; color: $color; text-shadow: $text-shadow; }
+ }
+}
+
+@function text-color($color, $dark: dark, $light: light){
+ $text-color: ( (red($color)*299) + (green($color)*587) + (blue($color)*114) ) / 1000;
+ $text-color: if($text-color >= 150, $dark, $light);
+ @return $text-color;
+}
+
diff --git a/sass/custom/_colors.scss b/sass/custom/_colors.scss
new file mode 100644
index 00000000..e15ee00e
--- /dev/null
+++ b/sass/custom/_colors.scss
@@ -0,0 +1,45 @@
+// Here you can easily change your sites's color scheme.
+// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works.
+// If you need a handy color picker try http://hslpicker.com
+
+//$header-bg: #263347;
+//$subtitle-color: lighten($header-bg, 58);
+//$nav-bg: desaturate(lighten(#8fc17a, 18), 5);
+//$nav-bg-front: image-url('noise.png');
+//$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11));
+//$sidebar-bg: desaturate(#eceff5, 8);
+//$sidebar-link-color: saturate(#526f9a, 10);
+//$sidebar-link-color-hover: darken(#7ab662, 9);
+//$footer-bg: #ccc !default;
+//$footer-bg-front: image-url('noise.png');
+//$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11));
+
+
+/* To use the light Solarized highlighting theme uncomment the following line */
+//$solarized: light;
+
+/* If you want to tweak the Solarized colors you can do that here */
+//$base03: #002b36; //darkest blue
+//$base02: #073642; //dark blue
+//$base01: #586e75; //darkest gray
+//$base00: #657b83; //dark gray
+//$base0: #839496; //medium gray
+//$base1: #93a1a1; //medium light gray
+//$base2: #eee8d5; //cream
+//$base3: #fdf6e3; //white
+//$solar-yellow: #b58900;
+//$solar-orange: #cb4b16;
+//$solar-red: #dc322f;
+//$solar-magenta: #d33682;
+//$solar-violet: #6c71c4;
+//$solar-blue: #268bd2;
+//$solar-cyan: #2aa198;
+//$solar-green: #859900;
+
+
+/* Non highlighted code colors */
+//$pre-bg: $base03;
+//$pre-border: darken($base02, 5);
+//$pre-color: $base1;
+
+$page-bg: #F0EDED
diff --git a/sass/custom/_fonts.scss b/sass/custom/_fonts.scss
new file mode 100644
index 00000000..1a6b2a06
--- /dev/null
+++ b/sass/custom/_fonts.scss
@@ -0,0 +1,10 @@
+// Here you can easily change font faces which are used in your site.
+// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works. your sites's.
+// If you love to use Web Fonts, you also need to add some lines to source/_includes/custom/head.html
+
+//$sans: "Optima", sans-serif;
+//$serif: "Baskerville", serif;
+//$mono: "Courier", monospace;
+//$heading-font-family: "Verdana", sans-serif;
+//$header-title-font-family: "Futura", sans-serif;
+//$header-subtitle-font-family: "Futura", sans-serif;
diff --git a/sass/custom/_layout.scss b/sass/custom/_layout.scss
new file mode 100644
index 00000000..7f24a8a2
--- /dev/null
+++ b/sass/custom/_layout.scss
@@ -0,0 +1,21 @@
+// Here you can easily change your sites's layout.
+// To give it a try, uncomment some of the lines below, make changes, rebuild your blog, and see how it works.
+
+//$header-font-size: 1em;
+$header-padding-top: 0.1em;
+$header-padding-bottom: 0.1em;
+
+//$max-width: 1350px;
+//$indented-lists: true;
+
+// Padding used for layout margins
+//$pad-min: 18px;
+//$pad-narrow: 25px;
+//$pad-medium: 35px;
+//$pad-wide: 55px;
+
+// Sidebar widths used in media queries
+//$sidebar-width-medium: 240px;
+//$sidebar-pad-medium: 15px;
+//$sidebar-pad-wide: 20px;
+//$sidebar-width-wide: 300px;
diff --git a/sass/custom/_styles.scss b/sass/custom/_styles.scss
new file mode 100644
index 00000000..2e5b9b4f
--- /dev/null
+++ b/sass/custom/_styles.scss
@@ -0,0 +1,170 @@
+// This File is imported last, and will override other styles in the cascade
+// Add styles here to make changes without digging in too much
+
+h1 {
+ font-size: 1.5em;
+ line-height: 1.2em;
+}
+
+#content .blog-index article h1 {
+ font-size: 1.2em;
+}
+
+p {
+ font-size: 11pt;
+}
+
+.year {
+
+font-weight: bold;
+
+}
+
+ul {
+ font-size: 11pt;
+ margin: 18px;
+}
+
+.pub {
+
+font-size: 11pt;
+
+}
+
+strong, b {
+ font-weight: bold;
+}
+
+
+// Publications Formatting
+#publications {
+ font-size: 11pt;
+ line-height: 19px;
+ font-family: Georgia, "Times New Roman", Times, serif;
+
+ #paper-title {
+ font-style: bold;
+ }
+
+ li {
+ margin: 0px 20px 10px 0;
+ }
+
+ #paper-notes {
+ font-size: 11pt;
+ }
+ // Quotes
+ q:before {
+ content: "\201C";
+ }
+ q:after {
+ content: "\201D";
+ }
+ q {
+ font-style: normal;
+ font-weight: bold;
+ text-decoration: underline;
+ }
+ // Italics
+ i {
+ font-style: italic;
+ }
+ // Links
+ a:before {
+ content: "(";
+ }
+ a:after {
+ content: ")";
+ }
+ a {
+ font-family: $sans;
+ font-size: 80%;
+ }
+}
+
+// Theorem-like Environments
+
+.theorem {
+ display: block;
+ margin: 12px 0;
+ font-style: italic;
+}
+.theorem:before {
+ content: "Theorem.";
+ font-weight: bold;
+ font-style: normal;
+}
+
+.lemma {
+ display: block;
+ margin: 12px 0;
+ font-style: italic;
+}
+.lemma:before {
+ content: "Lemma.";
+ font-weight: bold;
+ font-style: normal;
+}
+
+.proof {
+ display: block;
+ margin: 12px 0;
+ font-style: normal;
+}
+.proof:before {
+ content: "Proof.";
+ font-style: italic;
+}
+.proof:after {
+ content: "\25FC";
+ float:right;
+}
+
+.definition {
+ display: block;
+ margin: 12px 0;
+ font-style: normal;
+}
+.definition:before {
+ content: "Definition.";
+ font-weight: bold;
+ font-style: normal;
+}
+
+// Table styling
+
+* + table {
+ border-style:solid;
+ border-width:1px;
+ border-color:#e7e3e7;
+}
+
+* + table th, * + table td {
+ border-style:dashed;
+ border-width:1px;
+ border-color:#e7e3e7;
+ padding-left: 3px;
+ padding-right: 3px;
+}
+
+* + table th {
+ border-style:solid;
+ font-weight:bold;
+ background: url("/images/noise.png?1330434582") repeat scroll left top #F7F3F7;
+}
+
+* + table th[align="left"], * + table td[align="left"] {
+ text-align:left;
+}
+
+* + table th[align="right"], * + table td[align="right"] {
+ text-align:right;
+}
+
+* + table th[align="center"], * + table td[align="center"] {
+ text-align:center;
+}
+
+* + table img {
+ max-width: none !important;
+}
\ No newline at end of file
diff --git a/sass/partials/_archive.scss b/sass/partials/_archive.scss
new file mode 100644
index 00000000..9ef1e824
--- /dev/null
+++ b/sass/partials/_archive.scss
@@ -0,0 +1,72 @@
+#archive {
+ #content > div { &, > article { padding-top: 0; } }
+}
+#blog-archives {
+ article {
+ padding: 1em 0 1em;
+ position: relative;
+ background: $img-border bottom left repeat-x;
+ &:last-child {
+ background: none;
+ }
+ footer { padding: 0; margin: 0;}
+ }
+ h1 { color: $text-color; margin-bottom: .3em; }
+ h2 { display: none; }
+ h1 {
+ font-size: 1.5em;
+ a {
+ @include hover-link;
+ color: inherit;
+ &:hover { color: $link-color-hover; }
+ font-weight: normal;
+ display: inline-block;
+ }
+ }
+ a.category, time {
+ @extend .sans;
+ color: $text-color-light;
+ }
+ color: $text-color-light;
+ .entry-content { display: none; }
+ time {
+ font-size: .9em;
+ line-height: 1.2em;
+ .month, .day { display: inline-block; }
+ .month { text-transform: uppercase; }
+ }
+ p { margin-bottom: 1em; }
+ &, .entry-content { a { @include link-colors(inherit, $link-color-hover); }}
+ a:hover { color: $link-color-hover; }
+ @media only screen and (min-width: 550px) {
+ article { margin-left: 5em; }
+ h2 {
+ margin-bottom: .3em;
+ font-weight: normal;
+ display: inline-block;
+ position: relative; top: -1px;
+ float: left;
+ &:first-child { padding-top: .75em; }
+ }
+ time {
+ position: absolute;
+ text-align: right;
+ left: 0em;
+ top: 1.8em;
+ }
+ .year { display: none; }
+ article {
+ padding:{left: 4.5em; bottom: .7em;}
+ }
+ a.category {
+ line-height: 1.1em;
+ }
+ }
+}
+#content > .category {
+ article {
+ margin-left: 0;
+ padding-left: 6.8em;
+ }
+ .year { display: inline; }
+}
diff --git a/sass/partials/_blog.scss b/sass/partials/_blog.scss
new file mode 100644
index 00000000..57fe7a8a
--- /dev/null
+++ b/sass/partials/_blog.scss
@@ -0,0 +1,141 @@
+article {
+ padding-top: 1em;
+ a { @extend .force-wrap; }
+ header {
+ position: relative;
+ padding-top: 2em;
+ padding-bottom: 1em;
+ margin-bottom: 1em;
+ background: $img-border bottom left repeat-x;
+ h1 {
+ margin: 0;
+ a { text-decoration: none;
+ &:hover { text-decoration: underline; } }
+ }
+ p {
+ font-size: .9em;
+ color: $text-color-light;
+ margin: 0;
+ &.meta {
+ @extend .sans;
+ text-transform: uppercase;
+ position: absolute; top: 0;
+ }
+ }
+ @media only screen and (min-width: 768px) {
+ margin-bottom: 1.5em;
+ padding-bottom: 1em;
+ background: $img-border bottom left repeat-x;
+ }
+ }
+ h2 {
+ padding-top: 0.8em;
+ background: $img-border top left repeat-x;
+ }
+ .entry-content & h2:first-child, header + h2 { padding-top: 0; }
+ h2:first-child, header + h2 { background: none; }
+ .feature {
+ padding-top: .5em;
+ margin-bottom: 1em;
+ padding-bottom: 1em;
+ background: $img-border bottom left repeat-x;
+ font-size: 2.0em; font-style: italic;
+ line-height: 1.3em;
+ }
+ img, video, .flash-video {
+ @extend .flex-content;
+ @extend .basic-alignment;
+ @include shadow-box;
+ }
+ video, .flash-video { margin: 0 auto 1.5em; }
+ video { display: block; width: 100%; }
+ .flash-video {
+ > div {
+ position: relative;
+ display: block;
+ padding-bottom: 56.25%;
+ padding-top: 1px;
+ height: 0;
+ overflow: hidden;
+ iframe, object, embed {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ }
+ }
+ }
+ > footer {
+ padding-bottom: 2.5em;
+ margin-top: 2em;
+ @extend .sans;
+ p.meta {
+ margin-bottom: .8em;
+ font-size: .85em;
+ clear: both;
+ overflow: hidden;
+ }
+ .byline + time:before, time +time:before, .comments:before, .byline ~ .categories:before {
+ @extend .separator;
+ }
+ }
+
+}
+article + article {
+ .blog-index & {
+ background: $img-border top left repeat-x;
+ }
+}
+#content .blog-index {
+ padding: { top: 0; bottom: 0; }
+ article { padding-top: 2em; }
+ article header { background: none; padding-bottom: 0; }
+ article h1 {
+ font-size: 2.2em;
+ a { color: inherit; &:hover { color: $link-color-hover; } }
+ }
+ a[rel=full-article] {
+ background: darken($main-bg, 5);
+ display: inline-block;
+ padding: .4em .8em;
+ margin-right: .5em;
+ text-decoration: none;
+ color: mix($text-color, $text-color-light);
+ @extend .serif;
+ @include transition(background-color .5s);
+ &:hover {
+ background: $link-color-hover;
+ text-shadow: none;
+ color: $main-bg;
+ }
+ }
+ footer {
+ @extend .sans;
+ margin-top: 1em;
+ }
+}
+
+.separator {
+ content: "\2022 ";
+ padding: 0 .4em 0 .2em;
+ display: inline-block;
+}
+
+#content div.pagination {
+ text-align: center;
+ font-size: .95em;
+ position: relative;
+ background: $img-border top left repeat-x;
+ padding: {top: 1.5em; bottom: 1.5em;}
+ a {
+ text-decoration: none;
+ color: $text-color-light;
+ &.prev { position: absolute; left: 0; }
+ &.next { position: absolute; right: 0; }
+ &:hover { color: $link-color-hover; }
+ &[href*=archive] {
+ &:before, &:after { content: '\2014'; padding: 0 .3em; }
+ }
+ }
+}
diff --git a/sass/partials/_footer.scss b/sass/partials/_footer.scss
new file mode 100644
index 00000000..37411225
--- /dev/null
+++ b/sass/partials/_footer.scss
@@ -0,0 +1,19 @@
+body > footer {
+ @extend .sans;
+ font-size: .8em;
+ color: $footer-color;
+ text-shadow: lighten($footer-bg, 5) 0 1px;
+ background-color: $footer-bg;
+ @include background($footer-bg-front, $footer-bg-back);
+ border-top: 1px solid $footer-border-top;
+ position: relative;
+ padding-top: 1em;
+ padding-bottom: 1em;
+ margin-bottom: 3em;
+ @include border-bottom-radius(.4em);
+ z-index: 1;
+ a {
+ @include link-colors($footer-link-color, $footer-link-color-hover, $visited: $footer-link-color);
+ }
+ p:last-child { margin-bottom: 0; }
+}
diff --git a/sass/partials/_header.scss b/sass/partials/_header.scss
new file mode 100644
index 00000000..e3c6c020
--- /dev/null
+++ b/sass/partials/_header.scss
@@ -0,0 +1,18 @@
+body > header {
+ background: $header-bg;
+ h1 {
+ display: inline-block;
+ margin: 0;
+ a, a:visited, a:hover {
+ color: $title_color;
+ text-decoration: none;
+ }
+ }
+ h2 {
+ margin: .2em 0 0;
+ @extend .sans;
+ font-size: 1em;
+ color: $subtitle-color;
+ font-weight: normal;
+ }
+}
diff --git a/sass/partials/_navigation.scss b/sass/partials/_navigation.scss
new file mode 100644
index 00000000..30fa011d
--- /dev/null
+++ b/sass/partials/_navigation.scss
@@ -0,0 +1,137 @@
+body > nav {
+ position: relative;
+ background-color: $nav-bg;
+ @include background($nav-bg-front, $nav-bg-back);
+ border: {
+ top: 1px solid $nav-border-top;
+ bottom: 1px solid $nav-border-bottom; }
+ padding-top: .35em;
+ padding-bottom: .35em;
+ form {
+ @include background-clip(padding-box);
+ margin: 0; padding: 0;
+ .search {
+ padding: .3em .5em 0;
+ font-size: .85em;
+ font-family: $sans;
+ line-height: 1.1em;
+ width: 95%;
+ @include border-radius(.5em);
+ @include background-clip(padding-box);
+ @include box-shadow(lighten($nav-bg, 2) 0 1px);
+ background-color: lighten($nav-bg, 15);
+ border: 1px solid $nav-border;
+ color: #888;
+ &:focus {
+ color: #444;
+ border-color: #80b1df;
+ @include box-shadow(#80b1df 0 0 4px, #80b1df 0 0 3px inset);
+ background-color: #fff;
+ outline: none;
+ }
+ }
+ }
+ fieldset[role=search]{ float: right; width: 48%; }
+ fieldset.mobile-nav{ float: left; width: 48%;
+ select{ width: 100%; font-size: .8em; border: 1px solid #888;}
+ }
+ ul { display: none; }
+ @media only screen and (min-width: 550px) {
+ font-size: .9em;
+ ul {
+ @include horizontal-list(0);
+ float: left;
+ display: block;
+ padding-top: .15em;
+ }
+ ul.subscription {
+ margin-left: .8em;
+ float: right;
+ li:last-child a { padding-right: 0; }
+ }
+ ul li {
+ margin: 0;
+ }
+ a {
+ @include link-colors($nav-color, $nav-color-hover, $visited: $nav-color);
+ font-family: $sans;
+ text-shadow: lighten($nav-bg, 12) 0 1px;
+ float: left;
+ text-decoration: none;
+ font-size: 1.1em;
+ padding: .1em 0;
+ line-height: 1.5em;
+ }
+ li + li {
+ border-left: 1px solid $nav-border-left;
+ margin-left: .8em;
+ a {
+ padding-left: .8em;
+ border-left: 1px solid $nav-border-right;
+ }
+ }
+ form {
+ float: right;
+ text-align: left;
+ padding-left: .8em;
+ width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium + 20px;
+ .search {
+ width: 93%;
+ font-size: .95em;
+ line-height: 1.2em;
+ }
+ }
+ ul[data-subscription$=email] + form {
+ width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 58px;
+ .search { width: 91%; }
+ }
+ fieldset.mobile-nav { display: none; }
+ fieldset[role=search]{ width: 99%; }
+ }
+ @media only screen and (min-width: 992px) {
+ form {
+ width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 + 10px;
+ }
+ ul[data-subscription$=email] + form {
+ width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 58px;
+ }
+ }
+}
+.no-placeholder {
+ body > nav .search {
+ background: lighten($nav-bg, 15) image-url('search.png') .3em .25em no-repeat;
+ text-indent: 1.3em;
+ }
+}
+@mixin mask-subscription-nav($feed: 'rss.png'){
+ position: relative; top: 0px;
+ text-indent: -999999em;
+ background-color: $nav-border-right;
+ border: 0;
+ padding: 0;
+ &,&:after { @include mask-image($feed); }
+ &:after {
+ content: "";
+ position: absolute; top: -1px; left: 0;
+ background-color: lighten($nav-color, 25);
+ }
+ &:hover:after { background-color: lighten($nav-color, 20); }
+}
+.maskImage {
+ body > nav {
+ @media only screen and (min-width: 550px) {
+ ul[data-subscription$=email] + form {
+ width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 32px;
+ }
+ }
+ @media only screen and (min-width: 992px) {
+ ul[data-subscription$=email] + form {
+ width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 32px;
+ }
+ }
+ }
+ ul.subscription { position: relative; top: .2em; li, a { border: 0; padding: 0; }}
+ a[rel=subscribe-rss]{ @include mask-subscription-nav('rss.png'); }
+ a[rel=subscribe-email]{ @include mask-subscription-nav('email.png'); }
+}
+
diff --git a/sass/partials/_sharing.scss b/sass/partials/_sharing.scss
new file mode 100644
index 00000000..3eecb488
--- /dev/null
+++ b/sass/partials/_sharing.scss
@@ -0,0 +1,8 @@
+.sharing {
+ p.meta + & {
+ padding: { top: 1em; left: 0; }
+ background: $img-border top left repeat-x;
+ }
+}
+
+#fb-root { display: none; }
diff --git a/sass/partials/_sidebar.scss b/sass/partials/_sidebar.scss
new file mode 100644
index 00000000..cd8c1ca2
--- /dev/null
+++ b/sass/partials/_sidebar.scss
@@ -0,0 +1,4 @@
+@import "sidebar/base";
+@import "sidebar/googleplus";
+@import "sidebar/pinboard";
+@import "sidebar/delicious";
diff --git a/sass/partials/_syntax.scss b/sass/partials/_syntax.scss
new file mode 100644
index 00000000..5465286f
--- /dev/null
+++ b/sass/partials/_syntax.scss
@@ -0,0 +1,261 @@
+.highlight, html .gist .gist-file .gist-syntax .gist-highlight {
+ table td.code { width: 100%; }
+ border: 1px solid $pre-border !important;
+}
+.highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers {
+ text-align: right;
+ font-size: 13px;
+ line-height: 1.45em;
+ @if $solarized == light {
+ background: lighten($base03, 1) $noise-bg !important;
+ border-right: 1px solid darken($base02, 2) !important;
+ @include box-shadow(lighten($base03, 2) -1px 0 inset);
+ text-shadow: lighten($base02, 2) 0 -1px;
+ } @else {
+ background: $base02 $noise-bg !important;
+ border-right: 1px solid darken($base03, 2) !important;
+ @include box-shadow(lighten($base02, 2) -1px 0 inset);
+ text-shadow: darken($base02, 10) 0 -1px;
+ }
+ span { color: $base01 !important; }
+ padding: .8em !important;
+ @include border-radius(0);
+}
+
+figure.code, .gist-file, pre {
+ @include box-shadow(rgba(#000, .06) 0 0 10px);
+ .highlight pre { @include box-shadow(none); }
+}
+
+.gist .highlight, figure.code .highlight {
+ @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px);
+}
+html .gist .gist-file {
+ margin-bottom: 1.8em;
+ position: relative;
+ border: none;
+ padding-top: image-height("code_bg.png") !important;
+ .highlight {
+ margin-bottom: 0;
+ }
+ .gist-syntax {
+ border-bottom: 0 !important;
+ background: none !important;
+ .gist-highlight {
+ background: $base03 !important;
+ }
+ .highlight pre {
+ @extend .pre-code;
+ padding: 0;
+ }
+ }
+ .gist-meta {
+ padding: .6em 0.8em;
+ border: 1px solid lighten($base02, 2) !important;
+ color: $base01;
+ font-size: .7em !important;
+ @if $solarized == light {
+ background: lighten($base03, 2) $noise-bg;
+ border: 1px solid $pre-border !important;
+ border-top: 1px solid lighten($base03, 2) !important;
+ } @else {
+ background: $base02 $noise-bg;
+ }
+ @extend .sans;
+ line-height: 1.5em;
+ a {
+ color: mix($base1, $base01) !important;
+ @include hover-link;
+ &:hover { color: $base1 !important; }
+ }
+ a[href*='#file'] {
+ position: absolute; top: 0; left:0; right:-10px;
+ color: #474747 !important;
+ @extend .code-title;
+ &:hover { color: $link-color !important; }
+ }
+ a[href*=raw]{
+ @extend .download-source;
+ top: .4em;
+ }
+ }
+}
+pre {
+ background: $pre-bg $noise-bg;
+ @include border-radius(.4em);
+ @extend .mono;
+ border: 1px solid $pre-border;
+ line-height: 1.45em;
+ font-size: 13px;
+ margin-bottom: 2.1em;
+ padding: .8em 1em;
+ color: $pre-color;
+ overflow: auto;
+}
+h3.filename {
+ @extend .code-title;
+ + pre { @include border-top-radius(0px); }
+}
+
+p, li {
+ code {
+ @extend .mono;
+ display: inline-block;
+ white-space: no-wrap;
+ background: #fff;
+ font-size: .8em;
+ line-height: 1.5em;
+ color: #555;
+ border: 1px solid #ddd;
+ @include border-radius(.4em);
+ padding: 0 .3em;
+ margin: -1px 0;
+ }
+ pre code { font-size: 1em !important; background: none; border: none; }
+}
+
+.pre-code {
+ font-family: $mono !important;
+ overflow: scroll;
+ overflow-y: hidden;
+ display: block;
+ padding: .8em;
+ overflow-x: auto;
+ line-height: 1.45em;
+ background: $base03 $noise-bg !important;
+ color: $base1 !important;
+ span { color: $base1 !important; }
+ span { font-style: normal !important; font-weight: normal !important; }
+
+ .c { color: $base01 !important; font-style: italic !important; } /* Comment */
+ .cm { color: $base01 !important; font-style: italic !important; } /* Comment.Multiline */
+ .cp { color: $base01 !important; font-style: italic !important; } /* Comment.Preproc */
+ .c1 { color: $base01 !important; font-style: italic !important; } /* Comment.Single */
+ .cs { color: $base01 !important; font-weight: bold !important; font-style: italic !important; } /* Comment.Special */
+ .err { color: $solar-red !important; background: none !important; } /* Error */
+ .k { color: $solar-orange !important; } /* Keyword */
+ .o { color: $base1 !important; font-weight: bold !important; } /* Operator */
+ .p { color: $base1 !important; } /* Operator */
+ .ow { color: $solar-cyan !important; font-weight: bold !important; } /* Operator.Word */
+ .gd { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; } /* Generic.Deleted */
+ .gd .x { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; } /* Generic.Deleted.Specific */
+ .ge { color: $base1 !important; font-style: italic !important; } /* Generic.Emph */
+ //.gr { color: #aa0000 } /* Generic.Error */
+ .gh { color: $base01 !important; } /* Generic.Heading */
+ .gi { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; } /* Generic.Inserted */
+ .gi .x { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; } /* Generic.Inserted.Specific */
+ //.go { color: #888888 } /* Generic.Output */
+ //.gp { color: #555555 } /* Generic.Prompt */
+ .gs { color: $base1 !important; font-weight: bold !important; } /* Generic.Strong */
+ .gu { color: $solar-violet !important; } /* Generic.Subheading */
+ //.gt { color: #aa0000 } /* Generic.Traceback */
+ .kc { color: $solar-green !important; font-weight: bold !important; } /* Keyword.Constant */
+ .kd { color: $solar-blue !important; } /* Keyword.Declaration */
+ .kp { color: $solar-orange !important; font-weight: bold !important; } /* Keyword.Pseudo */
+ .kr { color: $solar-magenta !important; font-weight: bold !important; } /* Keyword.Reserved */
+ .kt { color: $solar-cyan !important; } /* Keyword.Type */
+ .n { color: $solar-blue !important; }
+ .na { color: $solar-blue !important; } /* Name.Attribute */
+ .nb { color: $solar-green !important; } /* Name.Builtin */
+ .nc { color: $solar-magenta !important;} /* Name.Class */
+ .no { color: $solar-yellow !important; } /* Name.Constant */
+ //.ni { color: #800080 } /* Name.Entity */
+ .nl { color: $solar-green !important; }
+ .ne { color: $solar-blue !important; font-weight: bold !important; } /* Name.Exception */
+ .nf { color: $solar-blue !important; font-weight: bold !important; } /* Name.Function */
+ .nn { color: $solar-yellow !important; } /* Name.Namespace */
+ .nt { color: $solar-blue !important; font-weight: bold !important; } /* Name.Tag */
+ .nx { color: $solar-yellow !Important; }
+ //.bp { color: #999999 } /* Name.Builtin.Pseudo */
+ //.vc { color: #008080 } /* Name.Variable.Class */
+ .vg { color: $solar-blue !important; } /* Name.Variable.Global */
+ .vi { color: $solar-blue !important; } /* Name.Variable.Instance */
+ .nv { color: $solar-blue !important; } /* Name.Variable */
+ //.w { color: #bbbbbb } /* Text.Whitespace */
+ .mf { color: $solar-cyan !important; } /* Literal.Number.Float */
+ .m { color: $solar-cyan !important; } /* Literal.Number */
+ .mh { color: $solar-cyan !important; } /* Literal.Number.Hex */
+ .mi { color: $solar-cyan !important; } /* Literal.Number.Integer */
+ //.mo { color: #009999 } /* Literal.Number.Oct */
+ .s { color: $solar-cyan !important; } /* Literal.String */
+ //.sb { color: #d14 } /* Literal.String.Backtick */
+ //.sc { color: #d14 } /* Literal.String.Char */
+ .sd { color: $solar-cyan !important; } /* Literal.String.Doc */
+ .s2 { color: $solar-cyan !important; } /* Literal.String.Double */
+ .se { color: $solar-red !important; } /* Literal.String.Escape */
+ //.sh { color: #d14 } /* Literal.String.Heredoc */
+ .si { color: $solar-blue !important; } /* Literal.String.Interpol */
+ //.sx { color: #d14 } /* Literal.String.Other */
+ .sr { color: $solar-cyan !important; } /* Literal.String.Regex */
+ .s1 { color: $solar-cyan !important; } /* Literal.String.Single */
+ //.ss { color: #990073 } /* Literal.String.Symbol */
+ //.il { color: #009999 } /* Literal.Number.Integer.Long */
+ div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }}
+}
+
+.highlight, .gist-highlight {
+ pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; }
+ margin-bottom: 1.8em;
+ background: $base03;
+ overflow-y: hidden;
+ overflow-x: auto;
+}
+
+$solar-scroll-bg: rgba(#fff, .15);
+$solar-scroll-thumb: rgba(#fff, .2);
+@if $solarized == light {
+ $solar-scroll-bg: rgba(#000, .15);
+ $solar-scroll-thumb: rgba(#000, .15);
+}
+
+pre, .highlight, .gist-highlight {
+ &::-webkit-scrollbar { height: .5em; background: $solar-scroll-bg; }
+ &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb; -webkit-border-radius: 4px; border-radius: 4px }
+}
+
+.highlight code {
+ @extend .pre-code; background: #000;
+}
+figure.code {
+ background: none;
+ padding: 0;
+ border: 0;
+ margin-bottom: 1.5em;
+ pre { margin-bottom: 0; }
+ figcaption {
+ position: relative;
+ @extend .code-title;
+ a { @extend .download-source; }
+ }
+ .highlight {
+ margin-bottom: 0;
+ }
+}
+
+.code-title {
+ text-align: center;
+ font-size: 13px;
+ line-height: 2em;
+ text-shadow: #cbcccc 0 1px 0;
+ color: #474747;
+ font-weight: normal;
+ margin-bottom: 0;
+ @include border-top-radius(5px);
+ font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif;
+ background: #aaaaaa image-url("code_bg.png") top repeat-x;
+ border: 1px solid #565656;
+ border-top-color: #cbcbcb;
+ border-left-color: #a5a5a5;
+ border-right-color: #a5a5a5;
+ border-bottom: 0;
+}
+
+.download-source {
+ position: absolute; right: .8em;
+ @include hover-link;
+ color: #666 !important;
+ z-index: 1;
+ font-size: 13px;
+ text-shadow: #cbcccc 0 1px 0;
+ padding-left: 3em;
+}
diff --git a/sass/partials/sidebar/_base.scss b/sass/partials/sidebar/_base.scss
new file mode 100644
index 00000000..5441304e
--- /dev/null
+++ b/sass/partials/sidebar/_base.scss
@@ -0,0 +1,106 @@
+.side-shadow-border {
+ @include box-shadow(lighten($sidebar-bg, 5) 0 1px);
+}
+aside.sidebar {
+ overflow: hidden;
+ color: $sidebar-color;
+ text-shadow: lighten($sidebar-bg, 8) 0 1px;
+ a { @extend .force-wrap; }
+ section {
+ @extend .sans;
+ font-size: .8em;
+ line-height: 1.4em;
+ margin-bottom: 1.5em;
+ h1 {
+ margin: 1.5em 0 0;
+ padding-bottom: .2em;
+ border-bottom: 1px solid $sidebar-border;
+ @extend .side-shadow-border;
+ + p {
+ padding-top: .4em;
+ }
+ }
+ }
+ img {
+ @extend .flex-content;
+ @extend .basic-alignment;
+ @include shadow-box($border: #fff .3em solid);
+ }
+ ul {
+ margin-bottom: 0.5em;
+ margin-left: 0;
+ }
+ li {
+ list-style: none;
+ padding: .5em 0;
+ margin: 0;
+ border-bottom: 1px solid $sidebar-border;
+ @extend .side-shadow-border;
+ p:last-child {
+ margin-bottom: 0;
+ }
+ }
+ a {
+ color: inherit;
+ @include transition(color .5s);
+ }
+ &:hover a {
+ color: $sidebar-link-color;
+ &:hover { color: $sidebar-link-color-hover; }
+ }
+}
+.aside-alt-link {
+ color: $sidebar-link-color-subdued;
+ &:hover {
+ color: $sidebar-link-color-subdued-hover;
+ }
+}
+
+@media only screen and (min-width: 768px) {
+ .toggle-sidebar {
+ outline: none;
+ position: absolute; right: -10px; top: 0; bottom: 0;
+ display: inline-block;
+ text-decoration: none;
+ color: mix($text-color-light, $sidebar-bg);
+ width: 9px;
+ cursor: pointer;
+ &:hover {
+ background: mix($sidebar-border, $sidebar-bg);
+ @include background(linear-gradient(left, rgba($sidebar-border, .5), rgba($sidebar-border, 0)));
+ }
+ &:after {
+ position: absolute; right: -11px; top: 0;
+ width: 20px;
+ font-size: 1.2em;
+ line-height: 1.1em;
+ padding-bottom: .15em;
+ @include border-bottom-right-radius(.3em);
+ text-align: center;
+ background: $main-bg $noise-bg;
+ border-bottom: 1px solid $sidebar-border;
+ border-right: 1px solid $sidebar-border;
+ content: "\00BB";
+ text-indent: -1px;
+ }
+ .collapse-sidebar & {
+ text-indent: 0px;
+ right: -20px;
+ width: 19px;
+ &:hover {
+ background: mix($sidebar-border, $sidebar-bg);
+ }
+ &:after {
+ border-left: 1px solid $sidebar-border;
+ text-shadow: #fff 0 1px;
+ content: "\00AB";
+ left: 0px; right: 0;
+ text-align: center;
+ text-indent: 0;
+ border: 0;
+ border-right-width: 0;
+ background: none;
+ }
+ }
+ }
+}
diff --git a/sass/partials/sidebar/_delicious.scss b/sass/partials/sidebar/_delicious.scss
new file mode 100644
index 00000000..e962702e
--- /dev/null
+++ b/sass/partials/sidebar/_delicious.scss
@@ -0,0 +1,4 @@
+.delicious-posts {
+ a.delicious-link { margin-bottom: .5em; display: block; }
+ p { font-size: 1em; }
+}
diff --git a/sass/partials/sidebar/_googleplus.scss b/sass/partials/sidebar/_googleplus.scss
new file mode 100644
index 00000000..c2a693ee
--- /dev/null
+++ b/sass/partials/sidebar/_googleplus.scss
@@ -0,0 +1,26 @@
+.googleplus {
+ h1 {
+ -moz-box-shadow: none !important;
+ -webkit-box-shadow: none !important;
+ -o-box-shadow: none !important;
+ box-shadow: none !important;
+ border-bottom: 0px none !important;
+ }
+ a {
+ text-decoration: none;
+ white-space: normal !important;
+ line-height: 32px;
+
+ img {
+ float: left;
+ margin-right: 0.5em;
+ border: 0 none;
+ }
+ }
+}
+
+.googleplus-hidden {
+ position: absolute;
+ top: -1000em;
+ left: -1000em;
+}
diff --git a/sass/partials/sidebar/_pinboard.scss b/sass/partials/sidebar/_pinboard.scss
new file mode 100644
index 00000000..9f9ab461
--- /dev/null
+++ b/sass/partials/sidebar/_pinboard.scss
@@ -0,0 +1,12 @@
+#pinboard_linkroll {
+ .pin-title, .pin-description {
+ display: block;
+ margin-bottom: .5em;
+ }
+ .pin-tag {
+ @include hover-link;
+ @extend .aside-alt-link;
+ &:after { content: ','; }
+ &:last-child:after { content: ''; }
+ }
+}
diff --git a/sass/plugins/_plugins.scss b/sass/plugins/_plugins.scss
new file mode 100644
index 00000000..3b4ba0b8
--- /dev/null
+++ b/sass/plugins/_plugins.scss
@@ -0,0 +1,6 @@
+/*
+ Add plugin stylesheets to this directory and they will be automatically
+ Imported. Load order is alphabetical and styles can be overriden in
+ custom/_style.scss which is loaded after all plugin stylesheets.
+*/
+
diff --git a/sass/screen.scss b/sass/screen.scss
new file mode 100644
index 00000000..75eac0a2
--- /dev/null
+++ b/sass/screen.scss
@@ -0,0 +1,10 @@
+@import "compass";
+@include global-reset;
+
+@import "custom/colors";
+@import "custom/fonts";
+@import "custom/layout";
+@import "base";
+@import "partials";
+@import "plugins/**/*";
+@import "custom/styles";
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 00000000..36652ba4
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1,101 @@
+
+
+
+ http://saltlab.github.com/blog/2013/01/02/Octopress/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/blog/2013/01/04/icst13/
+ 2013-05-29T20:49:06-07:00
+
+
+ http://saltlab.github.com/blog/2013/04/30/recent-updates/
+ 2013-05-29T20:33:32-07:00
+
+
+
+ http://saltlab.github.com/blog/2013/05/28/real-challenges-in-mobile-app-development-esem-2013/
+
+ 2013-05-29T20:31:06-07:00
+
+
+
+ http://saltlab.github.com/blog/2013/05/28/an-empirical-study-of-client-side-javascript-bugs-esem-2013/
+
+ 2013-05-29T20:32:11-07:00
+
+
+
+ http://saltlab.github.com/blog/2013/06/25/jsnose-detecting-javascript-code-smells-scam-2013/
+
+ 2013-06-25T15:51:15-07:00
+
+
+ http://saltlab.github.com/blog/2013/07/12/best-paper-award-at-icwe-13/
+ 2013-07-12T01:02:46-07:00
+
+
+ http://saltlab.github.com/blog/archives/
+ 2013-07-12T01:02:46-07:00
+
+
+ http://saltlab.github.com/content/cilla/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/content/feedex/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/content/javis/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/content/jsart/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/content/jsnose/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/
+ 2013-07-12T01:02:46-07:00
+
+
+ http://saltlab.github.com/members/
+ 2013-08-14T22:59:19-07:00
+
+
+ http://saltlab.github.com/mission/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/prospectivestudents/496.html
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/prospectivestudents/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/publications/
+ 2013-07-29T13:14:32-07:00
+
+
+ http://saltlab.github.com/robots.txt
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/software/
+ 2013-06-20T10:38:07-07:00
+
+
+ http://saltlab.github.com/software/pythia/
+ 2013-05-28T11:03:02-07:00
+
+
+ http://saltlab.github.com/sponsors/
+ 2013-05-28T11:03:02-07:00
+
+
\ No newline at end of file
diff --git a/software/index.html b/software/index.html
new file mode 100644
index 00000000..b8280472
--- /dev/null
+++ b/software/index.html
@@ -0,0 +1,235 @@
+
+
+
+
+
+
+
+ software - SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Most of the software tools resulting from our research projects are open-sourced and many are available on
GitHub .
+
+
+
+
+
+
+
+ Crawljax : A dynamic event-based crawler for Ajax-based web applications
+
+ CILLA : Automated CSS rule analyzer
+
+ AutoFLox : Automatic fault localizer for JavaScript
+
+ JSART : JavaScript Assertion-based Regression Tester
+
+ Mutandis : JavaScript Mutation Testing Tool
+
+ Vejovis : DOM-Related JavaScript Error Repair Tool
+
+
+ Javis : Client-side Hidden-Web Analyzer
+
+ JSNose : JavaScript Code Smell Detector
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/software/pythia/index.html b/software/pythia/index.html
new file mode 100644
index 00000000..82cfa8dd
--- /dev/null
+++ b/software/pythia/index.html
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+ Pythia - SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Pythia: Generating Test Cases with Oracles for JavaScript Applications
+
+
+
+
+
+
+
+<ul>
+ <li>Implementation of Pythia on <a href="https://github.com/saltlab/Pythia">GitHub</a>.</li>
+ <li>The experimental data is available for <a href="http://www.ece.ubc.ca/~shabnamm/data/pythiaData.zip">download</a> (zip).</li>
+</ul>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/CNAME b/source/CNAME
new file mode 100644
index 00000000..8055c0d2
--- /dev/null
+++ b/source/CNAME
@@ -0,0 +1 @@
+salt.ece.ubc.ca
diff --git a/source/_bibtex/biblio.bib b/source/_bibtex/biblio.bib
new file mode 100755
index 00000000..da189837
--- /dev/null
+++ b/source/_bibtex/biblio.bib
@@ -0,0 +1,842 @@
+@INPROCEEDINGS{bozdag:wse2007,
+ author = {Engin Bozdag and Ali Mesbah and van Deursen, Arie},
+ title = {A Comparison of Push and Pull Techniques for Ajax},
+ booktitle = {Proceedings of the International Symposium on Web Site Evolution (WSE)},
+ year = {2007},
+ pages = {15--22},
+ publisher = {IEEE Computer Society},
+}
+
+@ARTICLE{bozdag:jwe,
+ author = {Engin Bozdag and Ali Mesbah and van Deursen, Arie},
+ title = {Performance Testing of Data Delivery Techniques for Ajax Applications},
+ journal = {Journal of Web Engineering},
+ year = {2009},
+ volume = {8},
+ number = {4},
+ pages = {287--315},
+ url={http://swerl.tudelft.nl/twiki/pub/Main/TechnicalReports/TUD-SERG-2008-009.pdf}
+}
+
+@INPROCEEDINGS{gharavi:iwwost08,
+ author = {Vahid Gharavi and Ali Mesbah and van Deursen, Arie},
+ title = {Modelling and Generating Ajax Applications: A Model-Driven Approach},
+ booktitle = {Proceedings of the 7th ICWE International Workshop on Web-Oriented
+ Software Technologies (IWWOST'08)},
+ year = {2008},
+ pages = {38-43},
+}
+
+@INPROCEEDINGS{mesbah:icse07,
+ author = {Ali Mesbah},
+ title = {Ajaxifying Classic Web Applications},
+ booktitle = {Proceedings of the International Conference on Software Engineering, Doctoral Symposium (ICSE)},
+ year = {2007},
+ pages = {81--82},
+ publisher = {IEEE Computer Society},
+ url = {http://dx.doi.org/10.1109/ICSECOMPANION.2007.19},
+}
+
+@INPROCEEDINGS{mesbah:migrate07,
+ author = {Ali Mesbah and van Deursen, Arie},
+ title = {Migrating Multi-page Web Applications to Single-page Ajax Interfaces},
+ booktitle = {Proceedings of the Conference on Software Maintenance and Reengineering (CSMR)},
+ year = {2007},
+ pages = {181--190},
+ publisher = {IEEE Computer Society}
+}
+
+@INPROCEEDINGS{mesbah:wicsa07,
+ author = {Ali Mesbah and van Deursen, Arie},
+ title = {An Architectural Style for Ajax},
+ booktitle = {Proceedings of the 6th Working Conference on Software Architecture
+ (WICSA)},
+ year = {2007},
+ pages = {44--53},
+ publisher = {IEEE Computer Society}
+}
+
+@INPROCEEDINGS{mesbah:ccc,
+ author = {Ali Mesbah and van Deursen, Arie},
+ title = {Crosscutting Concerns in J2EE Applications},
+ booktitle = {Proceedings of the International Symposium on Web Site Evolution (WSE)},
+ year = {2005},
+ pages = {14--21},
+ publisher = {IEEE Computer Society},
+ url = {http://dx.doi.org/10.1109/WSE.2005.4},
+}
+
+@INPROCEEDINGS{mesbah:icwe08,
+ author = {Ali Mesbah and Engin Bozdag and van Deursen, Arie},
+ title = {Crawling Ajax by Inferring User Interface State Changes},
+ booktitle = {Proceedings of the International Conference on Web Engineering (ICWE)},
+ year = {2008},
+ pages = {122--134},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icwe08.pdf}
+}
+
+@INPROCEEDINGS{mesbah:icse09,
+ author = {Ali Mesbah and Arie van Deursen},
+ title = {Invariant-Based Automatic Testing of Ajax User Interfaces},
+ booktitle = {Proceedings of the 31st ACM/IEEE International Conference on Software Engineering (ICSE)},
+ year = {2009},
+ pages = {210--220},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icse09.pdf},
+ note = {[Acceptance rate 12\%]},
+ award= {[ACM SIGSOFT Distinguished Paper Award]}
+}
+
+@ARTICLE{mesbah:jss08,
+ author = {Ali Mesbah and van Deursen, Arie},
+ title = {A Component- and Push-based Architectural Style for Ajax Applications},
+ journal = {Journal of Systems and Software (JSS)},
+ year = {2008},
+ volume = {81},
+ pages = {2194--2209},
+ number = {12},
+ url = {http://salt.ece.ubc.ca/publications/docs/jss08.pdf}
+}
+
+@INPROCEEDINGS{bezemer:esec09,
+ author = {Cor-Paul Bezemer and Ali Mesbah and van Deursen, Arie},
+ title = {Automated Security Testing of Web Widget Interactions},
+ booktitle = {Proceedings of the joint meeting of the European Software Engineering Conference and the ACM SIGSOFT symposium on the Foundations of Software Engineering (ESEC-FSE)},
+ year = {2009},
+ pages = {81--91},
+ publisher = {ACM},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/fse09.pdf},
+ note = {[Acceptance rate 14.7%]}
+}
+
+@INPROCEEDINGS{deursen:sofsem,
+ author = {van Deursen, Arie and Ali Mesbah},
+ title = {Research Issues in the Automated Testing
+of Ajax Applications},
+ booktitle = {Proceedings of the 36th International Conference on Current Trends in Theory and Practice of Computer Science (SOFSEM)},
+ year = {2010},
+ pages = {16--28},
+ publisher = {Lecture Notes in Computer Science 5901, Springer-Verlag},
+}
+
+@InProceedings{Roest:2010.icst,
+ author = {Danny Roest and Ali Mesbah and van Deursen, Arie},
+ title = {Regression Testing Ajax Applications: Coping with Dynamism},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST)},
+ year = {2010},
+ publisher = {IEEE Computer Society},
+ pages = {128--136},
+ url = {http://salt.ece.ubc.ca/publications/docs/icst10.pdf},
+}
+
+@ARTICLE{mesbah:tse12,
+ author = {Ali Mesbah and van Deursen, Arie and Danny Roest},
+ title = {Invariant-based Automatic Testing of Modern Web Applications},
+ journal = {IEEE Transactions on Software Engineering (TSE)},
+ year = {2012},
+ volume={38},
+ number={1},
+ pages={35--53},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/tse11.pdf}
+}
+
+@inproceedings{VanDeursen:2010.nier,
+ author = {van Deursen, Arie and Ali Mesbah and Bas Cornelissen and Andy Zaidman and Martin Pinzger and Anja Guzzi},
+ title = {Adinda: A knowledgeable, Browser-Based IDE},
+ booktitle = {Proceedings of the International Conference on Software Engineering, New Ideas and Emerging Results Track (ICSE NIER)},
+ publisher = {ACM},
+ year = {2010},
+ pages = {203--206},
+}
+
+@inproceedings{mesbah:icse11,
+ author = {Mesbah, Ali and Mukul R. Prasad},
+ title = {Automated Cross-Browser Compatibility Testing},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ year = {2011},
+ pages = {561--570},
+ publisher = {ACM},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icse11.pdf},
+ slides = {https://speakerdeck.com/saltlab/automated-cross-browser-computability-testing},
+ abstract = {With the advent of Web 2.0 applications and new browsers, the cross-browser compatibility issue is becoming increasingly important. Although the problem is widely recognized among web developers, no systematic approach to tackle it exists today. None of the current tools, which provide screenshots or emulation environments, specifies any notion of cross-browser compatibility, much less check it automatically. In this paper, we pose the problem of cross-browser compatibility testing of modern web applications as a `functional consistency' check of web application behavior across different web browsers and present an automated solution for it. Our approach consists of (1) automatically analyzing the given web application under different browser environments and capturing the behavior as a finite-state machine; (2) formally comparing the generated models for equivalence on a pairwise-basis and exposing any observed discrepancies. We validate our approach on several open-source and industrial case studies to demonstrate its effectiveness and real-world relevance.}
+}
+
+@ARTICLE{mesbah:tweb12,
+ author = {Ali Mesbah and van Deursen, Arie and Stefan Lenselink},
+ title = {Crawling Ajax-based Web Applications through Dynamic Analysis of User Interface State Changes},
+ journal = {ACM Transactions on the Web (TWEB)},
+ year = {2012},
+ volume = {6},
+ number = {1},
+ pages = {3:1--3:30},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/tweb-final.pdf}
+}
+
+@inproceedings{ocariza:icst12,
+ title={AutoFLox: An Automatic Fault Localizer for Client-Side JavaScript},
+ author={Frolin Jr Ocariza and Pattabiraman, Karthik and Mesbah, Ali},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification and Validation (ICST)},
+ year = {2012},
+ pages = {31--40},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icst12.pdf}
+}
+
+@inproceedings{mesbah:icse2012,
+ author = {Ali Mesbah and Shabnam Mirshokraie},
+ title = {Automated Analysis of CSS Rules to Support Style Maintenance},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ year = {2012},
+ pages = {408--418},
+ publisher = {IEEE Computer Society},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icse12.pdf},
+ slides = {40727471},
+ abstract = {CSS is a widely used language for describing the presentation semantics of HTML elements on the web. The language has a number of characteristics, such as inheritance and cascading order, which makes maintaining CSS code a challenging task for web developers. As a result, it is common for unused rules to be accumulated over time. Despite these challenges, CSS analysis has not received much attention from the research community. We propose an automated technique to support styling code maintenance, which (1) analyzes the
+runtime relationship between the CSS rules and DOM elements of a given web application (2) detects unmatched and ineffective selectors, overridden declaration properties, and unde?ned
+class values. Our technique, implemented in an open source tool called CILLA, has a high precision and recall rate. The results of our case study, conducted on fifteen open source and
+industrial web-based systems, show an average of 60 precent unused CSS selectors in deployed applications, which points to the ubiquity of the problem.}
+}
+
+@inproceedings{shabnam:icwe12,
+ author = {Shabnam Mirshokraie and Ali Mesbah},
+ title = {JSART: JavaScript Assertion-based Regression Testing},
+ booktitle = {Proceedings of the International Conference on Web Engineering (ICWE)},
+ year = {2012},
+ pages = {238--252},
+ publisher = {Springer},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icwe12.pdf},
+ note = {[Acceptance rate 20%]}
+}
+
+@inproceedings{mona:wcre12,
+ author = {Erfani Joorabchi, Mona and Ali Mesbah},
+ title = {Reverse Engineering iOS Mobile Applications},
+ booktitle = {Proceedings of the Working Conference on Reverse Engineering (WCRE)},
+ year = {2012},
+ publisher = {IEEE Computer Society},
+ pages = {177--186},
+ url = {http://ece.ubc.ca/~amesbah/docs/wcre12.pdf}
+}
+
+
+
+@ARTICLE{garousi:ist13,
+ author = {Vahid Garousi and Ali Mesbah and Betin Can, A. and Shabnam Mirshokraie},
+ title = {A Systematic Mapping Study of Web Application Testing},
+ journal = {Information and Software Technology},
+ volume = {55},
+ number = {8},
+ year = {2013},
+ pages = {1374--1396},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/ist13.pdf},
+}
+
+
+@inproceedings{shabnam:mutandis,
+ author = {Shabnam Mirshokraie and Ali Mesbah and Karthik Pattabiraman},
+ title = {Efficient JavaScript Mutation Testing},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ year = {2013},
+ pages = {74--83},
+ url = {http://ece.ubc.ca/~amesbah/docs/icst13.pdf},
+ slides = {40727518},
+ award = {[Best Paper Runner-up Award]}
+}
+
+@inproceedings{jana:icwe13,
+ author = {Zahra Behfarshad and Ali Mesbah},
+ title = {Hidden-Web Induced by Client-Side Scripting: An Empirical Study},
+ booktitle = {Proceedings of the International Conference on Web Engineering (ICWE)},
+ year = {2013},
+ volume = {7977},
+ publisher = {Springer},
+ pages = {52--67},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/icwe13.pdf},
+ slides = {40727637},
+ award = {[Best Paper Award]},
+ abstract = {Client-side JavaScript is increasingly used for enhancing web application functionality, interactivity, and responsiveness. Through the execution of JavaScript code in browsers, the DOM tree representing a webpage at runtime, can be incrementally updated without requiring a URL change. This dynamically updated content is hidden from general search engines. In this paper, we present the first empirical study on measuring and characterizing the hidden-web induced as a result of client-side JavaScript execution. Our study reveals that this type of hidden-web content is prevalent in online web applications today: from the 500 websites we analyzed, 95\% contain client-side hidden-web content; On those websites that contain client-side hidden-web content, (1) on average, 62\% of the web states are hidden, (2) per hidden state, there is an average of 19 kilobytes of data that is hidden from which 0.6 kilobytes contain textual content, (3) the DIV element is the most common clickable element used (61\%) to initiate this type of hidden-web state transition, and (4) on average 25 minutes is required to dynamically crawl 50 DOM states. Further, our study indicates that there is a correlation between DOM tree size and hidden-web content, but no correlation exists between the amount of JavaScript code and client-side hidden-web.}
+}
+
+
+@inproceedings{james:imagen,
+ author = {James Lo and Eric Wohlstadter and Ali Mesbah},
+ title = {Imagen: Runtime Migration of Browser Sessions for JavaScript Web Applications},
+ booktitle = {Proceedings of the International World Wide Web Conference (WWW)},
+ publisher = {ACM},
+ pages = {815--825},
+ year = {2013},
+ url = {http://ece.ubc.ca/~amesbah/docs/www13.pdf},
+ note = {[Acceptance rate 15%]}
+}
+
+@inproceedings{mona:esem13,
+ author = {Erfani Joorabchi, Mona and Ali Mesbah and Philippe Kruchten},
+ title = {Real Challenges in Mobile App Development},
+ booktitle = {Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)},
+ year = {2013},
+ publisher = {IEEE Computer Society},
+ pages = {15--24},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/mona-esem13.pdf},
+ abstract = {Context: Mobile app development is a relatively new phenomenon that is increasing rapidly due to the ubiquity and popularity of smartphones among end-users. Objective: The goal of our study is to gain an understanding of the main challenges developers face in practice when they build apps for different mobile devices. Method: We conducted a qualitative study, following a Grounded Theory approach, in which we interviewed 12
+senior mobile developers from 9 different companies, followed by a semi-structured survey, with 188 respondents from the mobile development community. Results: The outcome is an overview of the current challenges faced by mobile developers in practice, such as developing apps across multiple platforms, lack of robust monitoring, analysis, and testing tools, and emulators that are slow or miss many features of mobile devices. Conclusion: Based
+on our findings of the current practices and challenges, we highlight areas that require more attention from the research and development community.}
+}
+
+@inproceedings{frolin:jsbugs,
+ author = {Frolin Ocariza and Kartik Bajaj and Karthik Pattabiraman and Ali Mesbah},
+ title = {An Empirical Study of Client-Side JavaScript Bugs},
+ booktitle = {Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)},
+ publisher = {IEEE Computer Society},
+ pages = {55--64},
+ year = {2013},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/frolin-esem13.pdf},
+ abstract = {Context: Client-side JavaScript is widely used in web applications to improve user-interactivity and minimize client-server communications. Unfortunately, web applications are prone to JavaScript faults. While prior studies have demonstrated the prevalence of these faults, no attempts have been made to determine their root causes and consequences. Objective: The goal of our study is to understand the root causes and impact of JavaScript faults and how the results can impact JavaScript programmers, testers and tool developers. Method: We perform an empirical study of 317 bug reports from 12 bug repositories. The bug reports are thoroughly examined to classify and extract information about the fault's cause (the error) and consequence (the failure and impact). Result: The majority (65\%) of JavaScript faults are DOM-related, meaning they are caused by faulty interactions of the JavaScript
+code with the Document Object Model (DOM). Further, 80\% of
+the highest impact JavaScript faults are DOM-related. Finally, most JavaScript faults originate from programmer mistakes committed in the JavaScript code itself, as opposed to other web application components such as the server-side or HTML code. Conclusion: Given the prevalence of DOM-related faults, JavaScript programmers need development tools that can help them reason about the DOM. Also, testers should prioritize detection of DOM-related faults as most high impact faults belong to this category. Finally, developers can use the error patterns we found to design more powerful static analysis tools for JavaScript.}
+}
+
+@inproceedings{amin:scam13,
+ author = {Milani Fard, Amin and Ali Mesbah},
+ title = {JSNose: Detecting JavaScript Code Smells},
+ booktitle = {Proceedings of the International Conference on Source Code Analysis and Manipulation (SCAM)},
+ publisher = {IEEE Computer Society},
+ pages={116--125},
+ year = {2013},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/scam13.pdf},
+ abstract = {JavaScript is a powerful and flexible prototype-based scripting language that is increasingly used by developers to create interactive web applications. The language is interpreted, dynamic, weakly-typed, and has first-class functions. In addition, it interacts with other web languages such as CSS and HTML at runtime. All these characteristics make JavaScript code particularly error-prone and challenging to write and maintain. Code smells are patterns in the source code that can adversely influence program comprehension and maintainability of the program in the long term. We propose a set of 13 JavaScript code smells, collected from various developer resources. We present a JavaScript code smell detection technique called JSNose. Our metric-based approach combines static and dynamic analysis to detect smells in client-side code. This automated technique can help developers to spot code that could benefit from refactoring. We evaluate the smell finding capabilities of our technique through an empirical study. By analyzing 11 web applications, we investigate which smells detected by JSNose are more prevalent.}
+}
+
+@inproceedings{shabnam:ase13,
+ author = {Shabnam Mirshokraie and Ali Mesbah and Karthik Pattabiraman},
+ title = {Pythia: Generating Test Cases with Oracles for JavaScript Applications},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Automated Software Engineering (ASE), New Ideas Track},
+ publisher = {IEEE Computer Society},
+ year = {2013},
+ pages = {610--615},
+ url = {http://salt.ece.ubc.ca/publications/docs/ase13.pdf}
+}
+
+@inproceedings{amin:issre13,
+ author = {Milani Fard, Amin and Ali Mesbah},
+ title = {Feedback-directed Exploration of Web Applications to Derive Test Models},
+ booktitle = {Proceedings of the International Symposium on Software Reliability Engineering (ISSRE)},
+ publisher = {IEEE Computer Society},
+ pages = {278--287},
+ year = {2013},
+ url = {http://www.ece.ubc.ca/~amesbah/docs/issre13.pdf},
+ abstract = {Dynamic exploration techniques play a significant role in automated web application testing and analysis. However,
+a general web application crawler that exhaustively explores
+the states can become mired in limited specific regions of
+the web application, yielding poor functionality coverage. In
+this paper, we propose a feedback-directed web application
+exploration technique to derive test models. While exploring,
+our approach dynamically measures and applies a combination
+of code coverage impact, navigational diversity, and structural
+diversity, to decide a-priori (1) which state should be expanded,
+and (2) which event should be exercised next to maximize the
+overall coverage, while minimizing the size of the test model.
+Our approach is implemented in a tool called FeedEx. We
+have empirically evaluated the efficacy of FeedEx using six web
+applications. The results show that our technique is successful in
+yielding higher coverage while reducing the size of the test model,
+compared to classical exhaustive techniques such as depth-first,
+breadth-first, and random exploration.}
+}
+
+
+@inproceedings{kartik:msr14,
+ author = {Kartik Bajaj and Karthik Pattabiraman and Ali Mesbah},
+ title = {Mining Questions Asked by Web Developers},
+ booktitle = {Proceedings of the Working Conference on Mining Software Repositories (MSR)},
+ publisher = {ACM},
+ pages = {112--121},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/kartik-msr14.pdf},
+ slides = {40727407},
+ abstract = {Modern web applications consist of a significant amount of client-side code, written in JavaScript, HTML, and CSS. In this paper, we present a study of common challenges and misconceptions among web developers, by mining related questions asked on Stack Overflow. We use unsupervised learning to categorize the mined questions and define a ranking algorithm to rank all the Stack Overflow questions based on their importance. We analyze the top 50 questions qualitatively. The results indicate that (1) the overall share of web development related discussions is increasing among developers, (2) browser related discussions are prevalent; however, this share is decreasing with time, (3) form validation and other DOM related discussions have been discussed consistently over time, (4) web related discussions are becoming more prevalent in mobile development, and (5) developers face implementation issues with new HTML5 features such as Canvas. We examine the implications of the results on the development, research, and standardization communities.}
+}
+
+@inproceedings{mona:msr14,
+ author = {Erfani Joorabchi, Mona and Mehdi Mirzaaghaei and Ali Mesbah},
+ title = {Works For Me! {C}haracterizing Non-Reproducible Bug Reports},
+ booktitle = {Proceedings of the Working Conference on Mining Software Repositories (MSR)},
+ publisher = {ACM},
+ pages = {62--71},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/mona-msr14.pdf},
+ slides = {40727387},
+ abstract = {Bug repository systems have become an integral component of software development activities. Ideally, each bug report should help developers to find and fix a software fault. However, there is a subset of reported bugs that is not (easily) reproducible, on which developers spend considerable amounts of time and effort. We present an empirical analysis of non- reproducible bug reports to characterize their rate, nature, and root causes. We mine one industrial and five open-source bug repositories, resulting in 32K non-reproducible bug reports. We (1) compare properties of non-reproducible reports with their counterparts such as active time and number of authors, (2) investigate their life-cycle patterns, and (3) examine 120 Fixed non-reproducible reports. In addition, we qualitatively classify a set of randomly selected non-reproducible bug reports (1,643) into six common categories. Our results show that, on average, non-reproducible bug reports pertain to 17\% of all bug reports, remain active three months longer than their counterparts, can be mainly (45\%) classified as "Interbug Dependencies", and 66\% of Fixed non-reproducible reports were indeed reproduced and fixed.}
+}
+
+@inproceedings{icse14seip,
+ author = {Alex Nederlof and Ali Mesbah and van Deursen, Arie},
+ title = {Software Engineering for the Web: The State of the Practice},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering, Software Engineering In Practice (ICSE SEIP)},
+ publisher = {ACM},
+ pages = {4--13},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/icse14-seip.pdf},
+ slides = {35488525},
+ abstract = {Today's web applications increasingly rely on client-side code execution. HTML is not just created on the server, but manipulated extensively within the browser through JavaScript code. In this paper, we seek to understand the software engineering implications of this. We look at deviations from many known best practices in such areas of performance, accessibility, and correct structuring of HTML documents. Furthermore, we assess to what extent such deviations manifest themselves through client-side code manipulation only. To answer these questions, we conducted a large scale experiment, involving automated client-enabled crawling of over 4000 web applications, resulting in over 100,000,000 pages analyzed, and close to 1,000,000 unique client-side user interface states. Our findings show that the majority of sites contain a substantial number of problems, making sites unnecessarily slow, inaccessible for the visually impaired, and with layout that is unpredictable due to errors in the dynamically modified DOM trees.}
+}
+
+@inproceedings{frolin:vejovis,
+ author = {Frolin Ocariza and Karthik Pattabiraman and Ali Mesbah},
+ title = {Vejovis: Suggesting Fixes for JavaScript Faults},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {837--847},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/vejovis-icse14.pdf},
+ slides = {40727306},
+ abstract = {JavaScript is used in web applications for achieving rich user interfaces and implementing core functionality. Unfortunately, JavaScript code is known to be prone to faults. In an earlier study, we found that over 65\% of such faults are caused by the interaction of JavaScript code with the DOM at runtime (DOM-related faults). In this paper, we first perform an analysis of 190 bug reports to understand fixes commonly applied by programmers to these DOM- related faults; we observe that parameter replacements and DOM element validations are common fix categories. Based on these findings, we propose an automated technique and tool, called Vejovis, for suggesting repairs for DOM-based JavaScript faults. To evaluate Vejovis, we conduct a case study in which we subject Vejovis to 22 real-world bugs across 11 applications. We find that Vejovis accurately suggests repairs for 20 out of the 22 bugs, and in 13 of the 20 cases, the correct fix was the top ranked one.}
+}
+
+@inproceedings{saba:clematis,
+ author = {Saba Alimadadi and Sheldon Sequeira and Ali Mesbah and Karthik Pattabiraman},
+ title = {Understanding JavaScript Event-based Interactions},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {367--377},
+ url = {http://salt.ece.ubc.ca/publications/docs/clematis-icse14.pdf},
+ report = {http://salt.ece.ubc.ca/publications/docs/UBC-SALT-2014-001.pdf},
+ year = {2014},
+ slides = {40727246},
+ tool = {https://github.com/saltlab/clematis},
+ award= {[ACM SIGSOFT Distinguished Paper Award]},
+ abstract = {Web applications have become one of the fastest growing types of software systems today. Despite their popularity, understanding the behaviour of modern web applications is still a challenging endeavour for developers during development and maintenance tasks. The challenges mainly stem from the dynamic, event-driven, and asynchronous nature of the JavaScript language. We propose a generic technique for capturing low-level event-based interactions in a web application and mapping those to a higher-level behavioural model. This model is then transformed into an interactive visualization, representing episodes of triggered causal and temporal events, related JavaScript code executions, and their impact on the dynamic DOM state. Our approach, implemented in a tool called Clematis, allows developers to easily understand the complex dynamic behaviour of their application at three different semantic levels of granularity. The results of our industrial controlled experiment show that Clematis is capable of improving the task accuracy by 61\%, while reducing the task completion time by 47\%.}
+}
+
+@inproceedings{domcovery:issta14,
+ author = {Mehdi Mirzaaghaei and Ali Mesbah},
+ title = {DOM-based Test Adequacy Criteria for Web Applications},
+ booktitle = {Proceedings of the International Symposium on Software Testing and Analysis (ISSTA)},
+ publisher = {ACM},
+ pages = {71--81},
+ url = {http://salt.ece.ubc.ca/publications/docs/issta14.pdf},
+ slides = {40727046},
+ year = {2014},
+ abstract = {To assess the quality of web application test cases, web developers currently measure code coverage. Although code coverage has traditionally been a popular test adequacy criterion, we believe it alone is not adequate for assessing the quality of web application test cases. We propose a set of novel DOM-based test adequacy criteria for web applications. These criteria aim at measuring coverage at two granularity levels, (1) the percentage of DOM states and transitions covered in the total state space of the web application under test, and (2) the percentage of elements covered in each particular DOM state. We present a technique and tool, called DomCovery, which automatically extracts and measures the proposed adequacy criteria and generates a visual DOM coverage report. Our evaluation shows that there is no correlation between code coverage and DOM coverage. A controlled experiment illustrates that participants using DOMCovery completed coverage related tasks 22 percent more accurately and 66 percent faster.}
+}
+
+@inproceedings{css:refactoring,
+ author = {Davood Mazinanian and Nikolaos Tsantalis and Ali Mesbah},
+ title = {Discovering Refactoring Opportunities in Cascading Style Sheets},
+ booktitle = {Proceedings of the ACM SIGSOFT International Symposium on the Foundations of Software Engineering (FSE)},
+ publisher = {ACM},
+ pages = {496--506},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/fse14.pdf},
+ abstract = {Cascading Style Sheets (CSS) is a language used for describing the look and formatting of HTML documents. CSS has been widely adopted in web and mobile development practice, since it enables a clean separation of content from presentation. The language exhibits complex features, such as inheritance, cascading and specificity, which make CSS code hard to maintain. Therefore, it is important to find ways to improve the maintainability of CSS code. In this paper, we propose an automated approach to remove duplication in CSS code. More specifically, we have developed a technique that detects three types of CSS declaration duplication and recommends refactoring opportunities to eliminate those duplications. Our approach uses preconditions that ensure the application of a refactoring will preserve the original document styling. We evaluate our technique on 38 real-world web systems and 91 CSS files, in total. Our findings show that duplication in CSS code is widely prevalent. Additionally, there is a significant number of presentation-preserving refactoring opportunities that can reduce the size of the CSS files and increase the maintainability of the code.}
+}
+
+@inproceedings{kartik:ase14,
+ author = {Kartik Bajaj and Karthik Pattabiraman and Ali Mesbah},
+ title = {Dompletion: DOM-Aware JavaScript Code Completion},
+ booktitle = {Proceedings of the IEEE/ACM International Conference on Automated Software Engineering (ASE)},
+ publisher = {ACM},
+ pages = {43--54},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/dompletion-ase14.pdf},
+ report = {http://salt.ece.ubc.ca/publications/docs/UBC-SALT-2014-002.pdf},
+ slides = {39264734},
+ abstract = {JavaScript is a scripting language that plays a prominent role in modern web applications. It is dynamic in nature and interacts heavily with the Document Object Model (DOM) at runtime. These characteristics make providing code completion support to JavaScript programmers particularly challenging. We propose an automated technique that reasons about existing DOM structures, dynamically analyzes the JavaScript code, and provides code completion suggestions for JavaScript code that interacts with the DOM through its APIs. Our automated code completion scheme is implemented in an open source tool called Dompletion. The results of our empirical evaluation indicate that (1) DOM structures exhibit patterns, which can be extracted and reasoned about in the context of code completion suggestions; (2) Dompletion can provide code completion suggestions with a recall of 89 precent, precision of 90 precent, and an average time of 2.8 seconds.}
+
+}
+
+@inproceedings{amin:ase14,
+ author = {Milani Fard, Amin and Mehdi Mirzaaghaei and Ali Mesbah},
+ title = {Leveraging Existing Tests in Automated Test Generation for Web Applications},
+ booktitle = {Proceedings of the IEEE/ACM International Conference on Automated Software Engineering (ASE)},
+ publisher = {ACM},
+ pages = {67--78},
+ year = {2014},
+ url = {http://salt.ece.ubc.ca/publications/docs/testilizer-ase14.pdf},
+ slides = {39262904},
+ abstract = {To test web applications, developers currently write test cases in frameworks such as Selenium. On the other hand, most web test generation techniques rely on a crawler to explore the dynamic states of the application. The first approach requires much manual effort, but benefits from the domain knowledge of the developer writing the test cases. The second one is automated and systematic, but lacks the domain knowledge required to be as effective. We believe combining the two can be advantageous. In this paper, we propose to (1) mine the human knowledge present in the form of input values, event sequences, and assertions, in the human-written test suites, (2) combine that inferred knowledge with the power of automated crawling, and (3) extend the test suite for uncovered/unchecked portions of the web application under test. Our approach is implemented in a tool called Testilizer. An evaluation of our approach indicates that Testilizer (1) outperforms a random test generator, and (2) on average, can generate test suites with improvements of up to 150 percent in fault detection rate and up to 30 precent in code coverage, compared to the original test suite.}
+}
+
+@article{vanDeursen2014,
+ title = {Crawl-based analysis of web applications: Prospects and challenges},
+ journal = {Science of Computer Programming},
+ volume = {97, Part 1},
+ pages = {173--180},
+ year = {2015},
+ doi = {http://dx.doi.org/10.1016/j.scico.2014.09.005},
+ url = {http://www.sciencedirect.com/science/article/pii/S0167642314003815},
+ author = {van Deursen, Arie and Ali Mesbah and Alex Nederlof},
+ abstract = {In this paper we review five years of research in the field of automated crawling and testing of web applications. We describe the open source Crawljax tool, and the various extensions that have been proposed in order to address such issues as cross-browser compatibility testing, web application regression testing, and style sheet usage analysis. Based on that we identify the main challenges and future directions of crawl-based testing of web applications. In particular, we explore ways to reduce the exponential growth of the state space, as well as ways to involve the human tester in the loop, thus reconciling manual exploratory testing and automated test input generation. Finally, we sketch the future of crawl-based testing in the light of upcoming developments, such as the pervasive use of touch devices and mobile computing, and the increasing importance of cyber-security.}
+}
+
+@ARTICLE{shabnam:tse13,
+ author = {Shabnam Mirshokraie and Ali Mesbah and Karthik Pattabiraman},
+ title = {Guided Mutation Testing for JavaScript Web Applications},
+ journal = {IEEE Transactions on Software Engineering (TSE)},
+ year = {2015},
+ volume={41},
+ number={5},
+ pages={429--444},
+ url = {http://salt.ece.ubc.ca/publications/docs/mutandis-tse.pdf},
+}
+
+@inproceedings{frolin:icse15,
+ author = {Frolin Ocariza and Karthik Pattabiraman and Ali Mesbah},
+ title = {Detecting Inconsistencies in {JavaScript} {MVC} Applications},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {325--335},
+ year = {2015},
+ url = {http://salt.ece.ubc.ca/publications/docs/icse15.pdf},
+}
+
+@inproceedings{shabnam:icst15,
+ author = {Shabnam Mirshokraie and Ali Mesbah and Karthik Pattabiraman},
+ title = {JSEFT: Automated {JavaScript} Unit Test Generation},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ pages = {10 pages},
+ year = {2015},
+ url = {http://salt.ece.ubc.ca/publications/docs/icst15.pdf},
+ abstract = {The event-driven and highly dynamic nature of JavaScript, as well as its runtime interaction with the Document Object Model (DOM) make it challenging to test JavaScript-based applications. Current web test automation techniques target the generation of event sequences, but they ignore testing the JavaScript code at the unit level. Further they either ignore the oracle problem completely or simplify it through generic soft oracles such as HTML validation and runtime exceptions. We present a framework to automatically generate test cases for JavaScript applications at two complementary levels, namely events and individual JavaScript functions. Our approach employs a combination of function coverage maximization and function state abstraction algorithms to efficiently generate test cases. In addition, these test cases are strengthened by automatically generated mutation-based oracles. We empirically evaluate the implementation of our approach, called JSeft, to assess its efficacy. The results, on 13 JavaScript-based applications, show that the generated test cases achieve a coverage of 68 percent and that JSeft can detect injected JavaScript and DOM faults with a high accuracy (100 percent precision, 70 percent recall). We also find that JSeft outperforms an existing JavaScript test automation framework both in terms of coverage and detected faults.}
+}
+
+@inbook{mesbah:advances15,
+ author = {Ali Mesbah},
+ title = {Advances in Testing {JavaScript}-based Web Applications},
+ chapter = {5},
+ publisher = {Elsevier},
+ year = {2015},
+ volume = {97},
+ pages = {201--235},
+ series = {Advances in Computers},
+ issn = {0065-2458},
+ url = {http://www.sciencedirect.com/science/article/pii/S0065245814000114},
+}
+
+@ARTICLE{stvr15-frolin,
+ author = {Frolin Ocariza and Guanpeng Li and Karthik Pattabiraman and Ali Mesbah},
+ title = {Automatic Fault Localization for Client-Side {JavaScript}},
+ journal = {Journal of Software Testing, Verification and Reliability (STVR)},
+ year = {2016},
+ volume = {26},
+ number = {1},
+ pages={69--88},
+ publisher = {Wiley},
+ url = {http://salt.ece.ubc.ca/publications/docs/stvr15-frolin.pdf},
+ abstract = {JavaScript is a scripting language that plays a prominent role in web applications today. It is dynamic, loosely typed and asynchronous and is extensively used to interact with the Document Object Model (DOM) at runtime. All these characteristics make JavaScript code error-prone; unfortunately, JavaScript fault localization remains a tedious and mainly manual task. Despite these challenges, the problem has received very limited research attention. This paper proposes an automated technique to localize JavaScript faults based on dynamic analysis, tracing and backward slicing of JavaScript code. This technique is capable of handling features of JavaScript code that have traditionally been difficult to analyze, including eval, anonymous functions and minified code. The approach is implemented in an open source tool called AutoFlox, and evaluation results indicate that it is capable of (1) automatically localizing DOM-related JavaScript faults with high accuracy (over 96\%) and no false-positives and (2) isolating JavaScript faults in production websites and actual bugs from real-world web applications.}
+}
+
+
+@inproceedings{ecoop15,
+ author = {Saba Alimadadi and Ali Mesbah and Karthik Pattabiraman},
+ title = {Hybrid {DOM}-Sensitive Change Impact Analysis for {JavaScript}},
+ booktitle = {Proceedings of the European Conference on Object-Oriented Programming (ECOOP)},
+ publisher = {LIPIcs},
+ pages = {321--345},
+ year = {2015},
+ url = {http://salt.ece.ubc.ca/publications/docs/ecoop15.pdf},
+ abstract = {JavaScript has grown to be among the most popular programming languages. However, performing change impact analysis on JavaScript applications is challenging due to features such as the seamless interplay with the DOM, event-driven and dynamic function calls, and asynchronous client/server communication. We first perform an empirical study of change propagation, the results of which show that the DOM-related and dynamic features of JavaScript need to be taken into consideration in the analysis since they affect change impact propagation. We propose a DOM-sensitive hybrid change impact analysis technique for JavaScript through a combination of static and dynamic analysis. The proposed approach incorporates a novel ranking algorithm for indicating the importance of each entity in the impact set. Our approach is implemented in a tool called Tochal. The results of our evaluation reveal that Tochal provides a more complete analysis compared to static or dynamic methods. Moreover, through an industrial controlled experiment, we find that Tochal helps developers by improving their task completion duration by 78\% and accuracy by 223\%.},
+ youtube = {7DsSxmTfgDY}
+}
+
+@inproceedings{fse15,
+ author = {Yucheng Zhang and Ali Mesbah},
+ title = {Assertions Are Strongly Correlated with Test Suite Effectiveness},
+ booktitle = {Proceedings of the joint meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering (ESEC/FSE)},
+ publisher = {ACM},
+ pages = {214--224},
+ year = {2015},
+ url = {http://salt.ece.ubc.ca/publications/docs/fse15.pdf},
+ abstract = {Code coverage is a popular test adequacy criterion in practice. Code coverage, however, remains controversial as there is a lack of coherent empirical evidence for its relation with test suite effectiveness. More recently, test suite size has been shown to be highly correlated with effectiveness. However, previous studies treat test methods as the smallest unit of interest, and ignore potential factors influencing this relationship. We propose to go beyond test suite size, by investigating test assertions inside test methods. We empirically evaluate the relationship between a test suite?s effectiveness and the (1) number of assertions, (2) assertion coverage, and (3) different types of assertions. We compose 6,700 test suites in total, using 24,000 assertions of five real-world Java projects. We find that the number of assertions in a test suite strongly correlates with its effectiveness, and this factor directly influences the relationship between test suite size and effectiveness. Our results also indicate that assertion coverage is strongly correlated with effectiveness and different types of assertions can influence the effectiveness of their containing test suites.}
+}
+
+@inproceedings{icsme15,
+ author = {Arash Vahabzadeh and Milani Fard, Amin and Ali Mesbah},
+ title = {An Empirical Study of Bugs in Test Code},
+ booktitle = {Proceedings of the International Conference on Software Maintenance and Evolution (ICSME)},
+ publisher = {IEEE Computer Society},
+ pages = {101--110},
+ year = {2015},
+ abstract = {Testing aims at detecting (regression) bugs in production code. However, testing code is just as likely to contain bugs as the code it tests. Buggy test cases can silently miss bugs in the production code or loudly ring false alarms when the production code is correct. We present the first empirical study of bugs in test code to characterize their prevalence and root cause categories. We mine the bug repositories and version control systems of 211 Apache Software Foundation (ASF) projects and find 5,556 test-related bug reports. We (1) compare properties of test bugs with production bugs, such as active time and fixing effort needed, and (2) qualitatively study 443 randomly sampled test bug reports in detail and categorize them based on their impact and root causes. Our results show that (1) around half of all the projects had bugs in their test code; (2) the majority of test bugs are false alarms, i.e., test fails while the production code is correct, while a minority of these bugs result in silent horrors, i.e., test passes while the production code is incorrect; (3) incorrect and missing assertions are the dominant root cause of silent horror bugs; (4) semantic (25\%), flaky (21\%), environment-related (18\%) bugs are the dominant root cause categories of false alarms; (5) the majority of false alarm bugs happen in the exercise portion of the tests, and (6) developers contribute more actively to fixing test bugs and test bugs are fixed sooner compared to production bugs. In addition, we evaluate whether existing bug detection tools can detect bugs in test code.},
+ url = {http://salt.ece.ubc.ca/publications/docs/icsme15.pdf},
+
+}
+
+@inproceedings{esem15,
+ author = {Keheliya Gallaba and Ali Mesbah and Ivan Beschastnikh},
+ title = {Don't Call Us, We'll Call You: Characterizing Callbacks in {JavaScript}},
+ booktitle = {Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)},
+ publisher = {IEEE Computer Society},
+ pages = {247--256},
+ year = {2015},
+ abstract = {JavaScript is a popular language for developing web applications and is increasingly used for both client-side and server-side application logic. The JavaScript runtime is inherently event-driven and callbacks are a key language feature. Unfortunately, callbacks induce a non-linear control flow and can be deferred to execute asynchronously, declared anonymously, and may be nested to arbitrary levels. All of these features make callbacks difficult to understand and maintain. We perform an empirical study to characterize JavaScript callback usage across a representative corpus of 138 JavaScript programs, with over 5 million lines of JavaScript code. We find that on average, every 10th function definition takes a callback argument, and that over 43\% of all callback-accepting function callsites are anonymous. Furthermore, the majority of callbacks are nested, more than half of all callbacks are asynchronous, and asynchronous callbacks, on average, appear more frequently in client-side code (72\%) than server-side (55\%). We also study three well-known solutions designed to help with the complexities associated with callbacks, including the error-first callback convention, Async.js library, and Promises. Our results inform the design of future JavaScript analysis and code comprehension tools.},
+ url = {http://salt.ece.ubc.ca/callback-study/esem15-js-callbacks-study.pdf},
+ award= {[Best Full Paper Award]}
+}
+
+@inproceedings{kartik:ase15,
+ author = {Kartik Bajaj and Karthik Pattabiraman and Ali Mesbah},
+ title = {Synthesizing Web Element Locators},
+ booktitle = {Proceedings of the IEEE/ACM International Conference on Automated Software Engineering (ASE)},
+ publisher = {IEEE Computer Society},
+ pages = {11 pages},
+ year = {2015},
+ url = {http://salt.ece.ubc.ca/publications/docs/ase15-led.pdf},
+ abstract = {To programmatically interact with the user interface of a web application, element locators are used to select and retrieve elements from the Document Object Model (DOM). Element locators are used in JavaScript code, Cascading stylesheets, and test cases to interact with the runtime DOM of the webpage. Constructing these element locators is, however, challenging due to the dynamic nature of the DOM. We find that locators written by web developers can be quite complex, and involve selecting multiple DOM elements. We present an automated technique for synthesizing DOM element locators using examples provided interactively by the developer. The main insight in our approach is that the problem of synthesizing complex multi-element locators can be expressed as a constraint solving problem over the domain of valid DOM states in a web application. We implemented our synthesis technique in a tool called LED, which provides an interactive drag and drop support inside the browser for selecting positive and negative examples. We find that LED supports at least 86\% of the locators used in the JavaScript code of deployed web applications, and that the locators synthesized by LED have a recall of 98\% and a precision of 63\%. LED is fast, taking only 0.23 seconds on average to synthesize a locator.}
+
+}
+
+@inproceedings{amin:ase15,
+ author = {Amin Milani Fard and Ali Mesbah and Eric Wohlstadter},
+ title = {Generating Fixtures for {JavaScript} Unit Testing},
+ booktitle = {Proceedings of the IEEE/ACM International Conference on Automated Software Engineering (ASE)},
+ publisher = {IEEE Computer Society},
+ pages = {11 pages},
+ year = {2015},
+ abstract = {In today's web applications, JavaScript code interacts with the Document Object Model (DOM) at runtime. This runtime interaction between JavaScript and the DOM is error-prone and challenging to test. In order to unit test a JavaScript function that has read/write DOM operations, a DOM instance has to be provided as a test fixture. This DOM fixture needs to be in the exact structure expected by the function under test. Otherwise, the test case can terminate prematurely due to a null exception. Generating these fixtures is challenging due to the dynamic nature of JavaScript and the hierarchical structure of the DOM. We present an automated technique, based on dynamic symbolic execution, which generates test fixtures for unit testing JavaScript functions. Our approach is implemented in a tool called Confix. Our empirical evaluation shows that Confix can effectively generate tests that cover DOM-dependent paths. We also find that Confix yields considerably higher coverage compared to an existing JavaScript input generation technique.},
+ url = {http://salt.ece.ubc.ca/publications/docs/ase15-confix.pdf},
+}
+
+@inproceedings{issre15,
+ author = {Erfani Joorabchi, Mona and Mohamed Ali and Ali Mesbah},
+ title = {Detecting Inconsistencies in Multi-Platform Mobile Apps},
+ booktitle = {Proceedings of the International Symposium on Software Reliability Engineering (ISSRE)},
+ publisher = {IEEE Computer Society},
+ pages = {11 pages},
+ year = {2015},
+ url = {http://salt.ece.ubc.ca/publications/docs/issre15.pdf},
+ abstract = {Due to the increasing popularity and diversity of mobile devices, developers write the same mobile app for different platforms. Since each platform requires its own unique environment in terms of programming languages and tools, the teams building these multi-platform mobile apps are usually separate. This in turn can result in inconsistencies in the apps developed. In this paper, we propose an automated technique for detecting inconsistencies in the same native app implemented for iOS and Android platforms. Our technique (1) automatically instruments and traces the app on each platform for given execution scenarios, (2) infers abstract models from each platform execution trace, (3) compares the models using a set of code-based and GUI-based criteria to expose any discrepancies, and finally (4) generates a visualization of the models, highlighting any detected inconsistencies. We have implemented our approach in a tool called CheckCAMP. CheckCAMP can help mobile developers in testing their apps across multiple platforms. An evaluation of our approach with a set of 14 industrial and open-source multi-platform native mobile app-pairs indicates that CheckCAMP can correctly extract and abstract the models of mobile apps from multiple platforms, infer likely mappings between the generated models based on different comparison criteria, and detect inconsistencies at multiple levels of granularity.}
+}
+
+@article{clematis:tosem,
+ author = {Saba Alimadadi and Sheldon Sequeira and Ali Mesbah and Karthik Pattabiraman},
+ title = {Understanding {JavaScript} Event-Based Interactions with {C}lematis},
+ journal = {ACM Transactions on Software Engineering and Methodology (TOSEM)},
+ year={2016},
+ volume={},
+ number={},
+ pages={17 pages},
+ url = {http://salt.ece.ubc.ca/publications/docs/tosem16.pdf},
+
+}
+
+@inproceedings{icst16,
+ author = {Shabnam Mirshokraie and Ali Mesbah and Karthik Pattabiraman},
+ title = {Atrina: Inferring Unit Oracles from {GUI} Test Cases},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ pages = {11 pages},
+ year = {2016},
+ url = {http://salt.ece.ubc.ca/publications/docs/icst16.pdf},
+ abstract = {Testing JavaScript web applications is challenging due to its complex runtime interaction with the Document Object Model (DOM). Writing unit-level assertions for JavaScript applications is even more tedious as the tester needs to precisely understand the interaction between the DOM and the JavaScript code, which is responsible for updating the DOM. In this work, we propose to leverage existing DOM-dependent assertions in a human-written UI-based test cases as well as useful execution information inferred from the UI-based test suite to automatically generate assertions used for unit-level testing of the JavaScript code of the application. Our approach is implemented in a tool called ATRINA. We evaluate our approach to assess its effectiveness. The results indicate that ATRINA maps DOM-based assertions to the corresponding JavaScript code with high accuracy (99\% precision, 92\% recall). In terms of fault finding capability, the assertions generated by ATRINA outperform human-written DOM-based assertions by 31\% on average. It also surpasses the state-of-the-art mutation-based assertion generation technique by 26\% on average in detecting faults.}
+
+}
+
+@inproceedings{icse16,
+ author = {Saba Alimadadi and Ali Mesbah and Karthik Pattabiraman},
+ title = {Understanding Asynchronous Interactions in Full-Stack {JavaScript}},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {11 pages},
+ year = {2016},
+ url = {http://salt.ece.ubc.ca/publications/docs/icse16.pdf},
+ abstract = {JavaScript has become one of the most popular languages in practice. Developers now use JavaScript not only for the client-side but also for server-side programming, leading to full-stack applications written entirely in JavaScript. Understanding such applications is challenging for developers, due to the temporal and implicit relations of asynchronous and event-driven entities spread over the client and server side. We propose a technique for capturing a behavioural model of full-stack JavaScript applications' execution. The model is temporal and context-sensitive to accommodate asynchronous events, as well as the scheduling and execution of lifelines of callbacks. We present a visualization of the model to facilitate program understanding for developers. We implement our approach in a tool, called Sahand, and evaluate it through a controlled experiment. The results show that Sahand improves developers' performance in completing program comprehension tasks by increasing their accuracy by a factor of three.}
+
+}
+
+@inproceedings{saner16,
+ author = {Ali Mesbah},
+ title = {Software Analysis for the Web: Achievements and Prospects},
+ booktitle = {Proceedings of the IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER) -- FoSE Track (invited)},
+ publisher = {IEEE},
+ pages = {13 pages},
+ year = {2016},
+ slides = {59550279},
+ url = {http://salt.ece.ubc.ca/publications/docs/fose16.pdf},
+ youtube = {H-cF32DpQ4I}
+
+}
+
+@inproceedings{quinn:fse16,
+ author = {Quinn Hanam and Brito, Fernan\do and Ali Mesbah},
+ title = {Discovering Bug Patterns in {JavaScript}},
+ booktitle = {Proceedings of the ACM SIGSOFT International Symposium on the Foundations of Software Engineering (FSE)},
+ publisher = {ACM},
+ pages = {13 pages},
+ year = {2016},
+ url = {http://salt.ece.ubc.ca/publications/docs/fse16.pdf},
+}
+
+@article{frolin:TSE17,
+ author = {Frolin Ocariza and Kartik Bajaj and Karthik Pattabiraman and Ali Mesbah},
+ title = {A Study of Causes and Consequences of Client-side {JavaScript} Bugs},
+ journal = {IEEE Transactions on Software Engineering (TSE)},
+ year={2017},
+ volume={43},
+ number={2},
+ pages={128--144},
+ url = {http://salt.ece.ubc.ca/publications/docs/frolin-tse16.pdf}
+}
+
+@inproceedings{amin:icst17,
+ author = {Amin Milani Fard and Ali Mesbah},
+ title = {Java{S}cript: The (Un)covered Parts},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ pages = {11 pages},
+ year = {2017},
+ url = {http://salt.ece.ubc.ca/publications/docs/icst17.pdf},
+ abstract = {Testing JavaScript code is important. JavaScript has grown to be among the most popular programming languages and it is extensively used to create web applications both on the client and server. We present the first empirical study of JavaScript tests to characterize their prevalence, quality metrics (e.g. code coverage), and shortcomings. We perform our study across a representative corpus of 373 JavaScript projects, with over 5.4 million lines of JavaScript code. Our results show that 22\% of the studied subjects do not have test code. About 40\% of projects with JavaScript at client-side do not have a test, while this is only about 3\% for the purely server-side JavaScript projects. Also tests for server-side code have high quality (in terms of code coverage, test code ratio, test commit ratio, and average number of assertions per test), while tests for client-side code have moderate to low quality. In general, tests written in Mocha, Tape, Tap, and Nodeunit frameworks have high quality and those written without using any framework have low quality. We scrutinize the (un)covered parts of the code under test to find out root causes for the uncovered code. Our results show that JavaScript tests lack proper coverage for event-dependent callbacks (36\%), asynchronous callbacks (53\%), and DOM-related code (63\%). We believe that it is worthwhile for the developer and research community to focus on testing techniques and tools to achieve better coverage for difficult to cover JavaScript code.}
+
+}
+
+@inproceedings{mobilesoft17,
+ author = {Mohamed Ali and Mona Joorabchi and Ali Mesbah},
+ title = {Same App, Different App Stores: A Comparative Study},
+ booktitle = {Proceedings of the IEEE/ACM International Conference on Mobile Software Engineering and Systems (MobileSoft)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2017},
+ url = {/publications/docs/mobilesoft17.pdf},
+ slides = {76902870}
+}
+
+@inproceedings{keheliya:icsme17,
+ author = {Keheliya Gallaba and Quinn Hanam and Ali Mesbah and Ivan Beschastnikh},
+ title = {Refactoring Asynchrony in {JavaScript}},
+ booktitle = {Proceedings of the International Conference on Software Maintenance and Evolution (ICSME)},
+ publisher = {IEEE Computer Society},
+ pages = {11 pages},
+ year = {2017},
+ url = {/publications/docs/icsme17.pdf},
+
+}
+
+@inproceedings{frolin:ase17,
+ author = {Frolin Ocariza and Karthik Pattabiraman and Ali Mesbah},
+ title = {Detecting Unknown Inconsistencies in Web Applications},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Automated Software Engineering (ASE)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2017},
+ url = {/publications/docs/ase17.pdf},
+}
+
+@inproceedings{icst2018,
+ author = {Mohammad Bajammal and Ali Mesbah},
+ title = {Web Canvas Testing through Visual Inference},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2018},
+ url = {/publications/docs/icst18.pdf},
+ award= {[Distinguished Paper Award]}
+
+}
+
+@inproceedings{saba:icse18,
+ author = {Saba Alimadadi and Ali Mesbah and Karthik Pattabiraman},
+ title = {Inferring Hierarchical Motifs from Execution Traces},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {12 pages},
+ year = {2018},
+ url = {/publications/docs/icse18-sabalan.pdf},
+
+}
+
+@inproceedings{arash:icse18,
+ author = {Arash Vahabzadeh and Andrea Stocco and Ali Mesbah},
+ title = {Fine-Grained Test Minimization},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {12 pages},
+ year = {2018},
+ url = {/publications/docs/icse18-testler.pdf},
+}
+
+@inproceedings{fse18,
+ author = {Andrea Stocco and Rahulkrishna Yan\drapally and Ali Mesbah},
+ title = {Visual Web Test Repair},
+ booktitle = {Proceedings of the joint meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering (ESEC/FSE)},
+ publisher = {ACM},
+ pages = {12 pages},
+ year = {2018},
+ url = {/publications/docs/fse18-vista.pdf}
+}
+
+@inproceedings{ase2018,
+ author = {Mohammad Bajammal and Davood Mazinanian and Ali Mesbah},
+ title = {Generating Reusable Web Components from Mockups},
+ booktitle = {Proceedings of the IEEE/ACM International Conference on Automated Software Engineering (ASE)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2018},
+ url = {/publications/docs/ase18.pdf}
+}
+
+@inproceedings{bugsjs:icst19,
+ author = {Peter Gyimesi and Bela Vancsics and Andrea Stocco and Davood Mazinanian and Arpad Beszedes and Rudolf Ferenc and Ali Mesbah},
+ title = {Bugs{JS}: a Benchmark of {JavaScript} Bugs},
+ booktitle = {Proceedings of the International Conference on Software Testing, Verification, and Validation (ICST)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2019},
+ url = {/publications/docs/icst19.pdf}
+}
+
+@inproceedings{t2r:icse19,
+ author = {Ameya Ketkar and Ali Mesbah and Davood Mazinanian and Danny Dig and Edward Aftan\dilian},
+ title = {Type Migration in Ultra-Large-Scale Codebases},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2019},
+ url = {/publications/docs/icse19.pdf}
+}
+
+@inproceedings{fse19,
+ author = {Matteo Biagiola and Andrea Stocco and Ali Mesbah and Filippo Ricca and Paolo Tonella},
+ title = {Web Test Dependency Detection},
+ booktitle = {Proceedings of the joint meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering (ESEC/FSE)},
+ publisher = {ACM},
+ pages = {12 pages},
+ year = {2019},
+ url = {/publications/docs/tedd-fse19.pdf}
+}
+
+@inproceedings{quinn:icsme19,
+ author = {Quinn Hanam and Ali Mesbah and Reid Holmes},
+ title = {Aiding Code Change Understanding with Semantic Change Impact Analysis},
+ booktitle = {Proceedings of the International Conference on Software Maintenance and Evolution (ICSME)},
+ publisher = {IEEE Computer Society},
+ pages = {12 pages},
+ year = {2019},
+ url = {/publications/docs/icsme19.pdf}
+}
+
+@inproceedings{fse19:deepdelta,
+ author = {Ali Mesbah and Andrew Rice and Emily Johnston and Nick Glorioso and Edward Aftan\dilian},
+ title = {Deep{D}elta: Learning to Repair Compilation Errors},
+ booktitle = {Proceedings of the joint meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering (ESEC/FSE), Industry Track},
+ publisher = {ACM},
+ pages = {12 pages},
+ year = {2019},
+ url = {/publications/docs/deepdelta-fse19.pdf}
+}
+
+@inproceedings{nd:icse20,
+ author = {Rahul Krishna Yan\drapally and Andrea Stocco and Ali Mesbah},
+ title = {Near-Duplicate Detection in Web App Model Inference},
+ booktitle = {Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE)},
+ publisher = {ACM},
+ pages = {12 pages},
+ year = {2020},
+ url = {/publications/docs/icse20.pdf}
+
+}
+
+
+
diff --git a/source/_bibtex/custom-hdp.csl b/source/_bibtex/custom-hdp.csl
new file mode 100644
index 00000000..74de2319
--- /dev/null
+++ b/source/_bibtex/custom-hdp.csl
@@ -0,0 +1,329 @@
+
+
diff --git a/source/_bibtex/custom-ieee.csl b/source/_bibtex/custom-ieee.csl
new file mode 100644
index 00000000..85178b9d
--- /dev/null
+++ b/source/_bibtex/custom-ieee.csl
@@ -0,0 +1,329 @@
+
+
\ No newline at end of file
diff --git a/source/_includes/after_footer.html b/source/_includes/after_footer.html
new file mode 100644
index 00000000..08b8e340
--- /dev/null
+++ b/source/_includes/after_footer.html
@@ -0,0 +1,5 @@
+{% include disqus.html %}
+{% include facebook_like.html %}
+{% include google_plus_one.html %}
+{% include twitter_sharing.html %}
+{% include custom/after_footer.html %}
diff --git a/source/_includes/archive_post.html b/source/_includes/archive_post.html
new file mode 100644
index 00000000..210dbbbe
--- /dev/null
+++ b/source/_includes/archive_post.html
@@ -0,0 +1,8 @@
+{% capture category %}{{ post.categories | size }}{% endcapture %}
+
+{{ post.date | date: "%b %d %Y "}}
+{% if category != '0' %}
+
+ posted in {{ post.categories | category_links }}
+
+{% endif %}
diff --git a/source/_includes/article.html b/source/_includes/article.html
new file mode 100644
index 00000000..84279977
--- /dev/null
+++ b/source/_includes/article.html
@@ -0,0 +1,29 @@
+{% unless page.no_header %}
+
+{% endunless %}
+{% if index %}
+ {{ content | excerpt }}
+ {% capture excerpted %}{{ content | has_excerpt }}{% endcapture %}
+ {% if excerpted == 'true' %}
+
+ {% endif %}
+{% else %}
+{{ content }}
+{% endif %}
diff --git a/source/_includes/asides/delicious.html b/source/_includes/asides/delicious.html
new file mode 100644
index 00000000..115cdcbc
--- /dev/null
+++ b/source/_includes/asides/delicious.html
@@ -0,0 +1,8 @@
+{% if site.delicious_user %}
+
+{% endif %}
\ No newline at end of file
diff --git a/source/_includes/asides/github.html b/source/_includes/asides/github.html
new file mode 100644
index 00000000..b0bf9596
--- /dev/null
+++ b/source/_includes/asides/github.html
@@ -0,0 +1,30 @@
+{% if site.github_user %}
+
+ GitHub Repos
+
+ {% if site.github_show_profile_link %}
+ @{{site.github_user}} on GitHub
+ {% endif %}
+
+
+
+{% endif %}
diff --git a/source/_includes/asides/googleplus.html b/source/_includes/asides/googleplus.html
new file mode 100644
index 00000000..00a0aa85
--- /dev/null
+++ b/source/_includes/asides/googleplus.html
@@ -0,0 +1,11 @@
+{% if site.googleplus_user %}
+
+{% endif %}
+
diff --git a/source/_includes/asides/pinboard.html b/source/_includes/asides/pinboard.html
new file mode 100644
index 00000000..c89c3e7b
--- /dev/null
+++ b/source/_includes/asides/pinboard.html
@@ -0,0 +1,19 @@
+{% if site.pinboard_user %}
+
+
+{% endif %}
diff --git a/source/_includes/asides/recent_posts.html b/source/_includes/asides/recent_posts.html
new file mode 100644
index 00000000..4b108474
--- /dev/null
+++ b/source/_includes/asides/recent_posts.html
@@ -0,0 +1,10 @@
+
diff --git a/source/_includes/asides/twitter.html b/source/_includes/asides/twitter.html
new file mode 100644
index 00000000..bab5de47
--- /dev/null
+++ b/source/_includes/asides/twitter.html
@@ -0,0 +1,19 @@
+{% if site.twitter_user %}
+
+ Latest Tweets
+
+
+
+ {% if site.twitter_follow_button %}
+
+ {% else %}
+ Follow @{{ site.twitter_user }}
+ {% endif %}
+
+{% endif %}
diff --git a/source/_includes/custom/after_footer.html b/source/_includes/custom/after_footer.html
new file mode 100644
index 00000000..bce25dd9
--- /dev/null
+++ b/source/_includes/custom/after_footer.html
@@ -0,0 +1,3 @@
+{% comment %}
+ Add content to be output at the bottom of each page. (You might use this for analytics scripts, for example)
+{% endcomment %}
diff --git a/source/_includes/custom/asides/about.html b/source/_includes/custom/asides/about.html
new file mode 100644
index 00000000..59d309e4
--- /dev/null
+++ b/source/_includes/custom/asides/about.html
@@ -0,0 +1,4 @@
+
+ About Me
+ A little something about me.
+
diff --git a/source/_includes/custom/category_feed.xml b/source/_includes/custom/category_feed.xml
new file mode 100644
index 00000000..f47c5536
--- /dev/null
+++ b/source/_includes/custom/category_feed.xml
@@ -0,0 +1,27 @@
+---
+layout: nil
+---
+
+
+
+
+
+
+ {{ site.time | date_to_xmlschema }}
+ {{ site.url }}/
+
+
+ {% if site.email %} {% endif %}
+
+ Octopress
+
+ {% for post in site.categories[page.category] limit: 5 %}
+
+
+
+ {{ post.date | date_to_xmlschema }}
+ {{ site.url }}{{ post.id }}
+
+
+ {% endfor %}
+
diff --git a/source/_includes/custom/footer.html b/source/_includes/custom/footer.html
new file mode 100644
index 00000000..26fd2b6b
--- /dev/null
+++ b/source/_includes/custom/footer.html
@@ -0,0 +1,4 @@
+
+ Copyright © {{ site.time | date: "%Y" }} - {{ site.author }} -
+ University of British Columbia (UBC)
+
diff --git a/source/_includes/custom/head.html b/source/_includes/custom/head.html
new file mode 100644
index 00000000..61210e56
--- /dev/null
+++ b/source/_includes/custom/head.html
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/source/_includes/custom/header.html b/source/_includes/custom/header.html
new file mode 100644
index 00000000..246de298
--- /dev/null
+++ b/source/_includes/custom/header.html
@@ -0,0 +1,11 @@
+
+
+  
+
+
+ {% if site.subtitle %}
+ {% comment %}
+ {{ site.subtitle }}
+ {% endcomment %}
+ {% endif %}
+
diff --git a/source/_includes/custom/navigation.html b/source/_includes/custom/navigation.html
new file mode 100644
index 00000000..e87399d3
--- /dev/null
+++ b/source/_includes/custom/navigation.html
@@ -0,0 +1,9 @@
+
diff --git a/source/_includes/disqus.html b/source/_includes/disqus.html
new file mode 100644
index 00000000..49c6a29c
--- /dev/null
+++ b/source/_includes/disqus.html
@@ -0,0 +1,21 @@
+{% comment %} Load script if disquss comments are enabled and `page.comments` is either empty (index) or set to true {% endcomment %}
+{% if site.disqus_short_name and page.comments != false %}
+
+{% endif %}
diff --git a/source/_includes/facebook_like.html b/source/_includes/facebook_like.html
new file mode 100644
index 00000000..d263e6d2
--- /dev/null
+++ b/source/_includes/facebook_like.html
@@ -0,0 +1,10 @@
+{% if site.facebook_like %}
+
+
+{% endif %}
diff --git a/source/_includes/footer.html b/source/_includes/footer.html
new file mode 100644
index 00000000..3a8c7687
--- /dev/null
+++ b/source/_includes/footer.html
@@ -0,0 +1 @@
+{% include custom/footer.html %}
diff --git a/source/_includes/google_analytics.html b/source/_includes/google_analytics.html
new file mode 100644
index 00000000..4d4d5969
--- /dev/null
+++ b/source/_includes/google_analytics.html
@@ -0,0 +1,13 @@
+{% if site.google_analytics_tracking_id %}
+
+{% endif %}
diff --git a/source/_includes/google_plus_one.html b/source/_includes/google_plus_one.html
new file mode 100644
index 00000000..b69ddaeb
--- /dev/null
+++ b/source/_includes/google_plus_one.html
@@ -0,0 +1,9 @@
+{% if site.google_plus_one %}
+
+{% endif %}
diff --git a/source/_includes/head.html b/source/_includes/head.html
new file mode 100644
index 00000000..6b5412ca
--- /dev/null
+++ b/source/_includes/head.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ {% if page.title %}{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %} - {% endif %}{{ site.title }}
+
+
+ {% capture description %}{% if page.description %}{{ page.description }}{% else %}{{ content | raw_content }}{% endif %}{% endcapture %}
+
+ {% if page.keywords %} {% endif %}
+
+
+
+
+
+
+ {% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
+
+
+
+
+
+
+
+
+ {% include custom/head.html %}
+ {% include google_analytics.html %}
+
diff --git a/source/_includes/header.html b/source/_includes/header.html
new file mode 100644
index 00000000..524de651
--- /dev/null
+++ b/source/_includes/header.html
@@ -0,0 +1 @@
+{% include custom/header.html %}
diff --git a/source/_includes/navigation.html b/source/_includes/navigation.html
new file mode 100644
index 00000000..2f0e6280
--- /dev/null
+++ b/source/_includes/navigation.html
@@ -0,0 +1,15 @@
+
+ RSS
+ {% if site.subscribe_email %}
+ Email
+ {% endif %}
+
+ {% if site.simple_search %}
+
+ {% endif %}
+{% include custom/navigation.html %}
diff --git a/source/_includes/post/author.html b/source/_includes/post/author.html
new file mode 100644
index 00000000..83dd6a89
--- /dev/null
+++ b/source/_includes/post/author.html
@@ -0,0 +1,8 @@
+{% if post.author %}
+ {% assign author = post.author %}
+{% elsif page.author %}
+ {% assign author = page.author %}
+{% else %}
+ {% assign author = site.author %}
+{% endif %}
+{% if author %}Posted by {{ author }} {% endif %}
diff --git a/source/_includes/post/categories.html b/source/_includes/post/categories.html
new file mode 100644
index 00000000..4a98b29d
--- /dev/null
+++ b/source/_includes/post/categories.html
@@ -0,0 +1,10 @@
+{% capture category %}{% if post %}{{ post.categories | category_links | size }}{% else %}{{ page.categories | category_links | size }}{% endif %}{% endcapture %}
+{% unless category == '0' %}
+
+ {% if post %}
+ {{ post.categories | category_links }}
+ {% else %}
+ {{ page.categories | category_links }}
+ {% endif %}
+
+{% endunless %}
diff --git a/source/_includes/post/date.html b/source/_includes/post/date.html
new file mode 100644
index 00000000..a86953c2
--- /dev/null
+++ b/source/_includes/post/date.html
@@ -0,0 +1,5 @@
+{% if page.date %}{% capture time %}{{ page.date_time_html }}{% endcapture %}{% endif %}
+{% if post.date %}{% capture time %}{{ post.date_time_html }}{% endcapture %}{% endif %}
+
+{% if page.updated %}{% capture updated %}{{ page.date_time_updated_html }}{% endcapture %}{% endif %}
+{% if post.updated %}{% capture updated %}{{ post.date_time_updated_html }}{% endcapture %}{% endif %}
diff --git a/source/_includes/post/disqus_thread.html b/source/_includes/post/disqus_thread.html
new file mode 100644
index 00000000..b1acd8cc
--- /dev/null
+++ b/source/_includes/post/disqus_thread.html
@@ -0,0 +1 @@
+Please enable JavaScript to view the comments powered by Disqus.
diff --git a/source/_includes/post/sharing.html b/source/_includes/post/sharing.html
new file mode 100644
index 00000000..d639faa1
--- /dev/null
+++ b/source/_includes/post/sharing.html
@@ -0,0 +1,11 @@
+
+ {% if site.twitter_tweet_button %}
+
+ {% endif %}
+ {% if site.google_plus_one %}
+
+ {% endif %}
+ {% if site.facebook_like %}
+
+ {% endif %}
+
diff --git a/source/_includes/twitter_sharing.html b/source/_includes/twitter_sharing.html
new file mode 100644
index 00000000..7cd5fbc2
--- /dev/null
+++ b/source/_includes/twitter_sharing.html
@@ -0,0 +1,11 @@
+{% if site.twitter_follow_button or site.twitter_tweet_button %}
+
+{% endif %}
diff --git a/source/_layouts/bibliography.html b/source/_layouts/bibliography.html
new file mode 100644
index 00000000..b3d5effc
--- /dev/null
+++ b/source/_layouts/bibliography.html
@@ -0,0 +1,49 @@
+---
+---
+
+
+
+
{{entry.title}}
+
+ {% assign names = entry.author | split:"and" %}
+ {% assign seperator = "," %}
+ {% for name in names %}
+ {% assign firstlast = name | split:"," %}
+ {% if forloop.last %}
+ {% assign seperator = "" %}
+ {% if forloop.length > 1 %}
+ and
+ {% endif %}
+ {% endif %}
+ {{firstlast[1]}} {{firstlast[0]}}{{seperator}}
+ {% endfor %}
+
+
+ {% if entry.booktitle == empty or entry.booktitle == nil %}
+ {% else %}
+ In
{{ entry.booktitle }} .
+ {% endif %}
+ {% if entry.journal == empty or entry.journal == nil %}
+ {% else %}
+
{{ entry.journal }} .
+ {% endif %}
+ {% if entry.series == empty or entry.series == nil %}
+ {% else %}
+
{{ entry.series }} .
+ {% endif %}
+ {% if entry.pages == empty or entry.pages == nil %}
+ {% else %}
+ {{ entry.pages }},
+ {% endif %}
+ {{ entry.year }}.
+ {% if entry.url == empty or entry.url == nil %}
+ {% else %}
+
PDF
+ {% endif %}
+
+
+ {% if entry.award == empty or entry.award == nil %}
+ {% else %}
+
{{ entry.award }}
+ {% endif %}
+
\ No newline at end of file
diff --git a/source/_layouts/biboverview.html b/source/_layouts/biboverview.html
new file mode 100644
index 00000000..4dc89f31
--- /dev/null
+++ b/source/_layouts/biboverview.html
@@ -0,0 +1,15 @@
+---
+layout: default
+comments: false
+sharing: false
+footer: false
+no_sidebar: true
+---
+
+{{ reference }}
+
+{% if entry.abstract %}
+{{ entry.abstract %}
+{% endif %}
+
+{{ entry.bibtex %}
diff --git a/source/_layouts/bibtex.html b/source/_layouts/bibtex.html
new file mode 100644
index 00000000..ab72fd23
--- /dev/null
+++ b/source/_layouts/bibtex.html
@@ -0,0 +1,130 @@
+---
+layout: page
+comments: false
+sharing: false
+footer: false
+sidebar: false
+---
+
+
+
+
+
+ {% if site.titlecase and page.titlecase != false %}
+ "{{ page.entry.title | titlecase }}",
+ {% else %}
+ "{{ page.entry.title }}",
+ {% endif %}
+
+
+ {% assign names = page.entry.author | split:"and" %}
+ {% assign seperator = "," %}
+ {% for name in names %}
+ {% assign firstlast = name | split:"," %}
+ {% if forloop.last %}
+ {% assign seperator = "." %}
+ {% if forloop.length > 1 %}
+ and
+ {% endif %}
+ {% endif %}
+ {{firstlast[1]}} {{firstlast[0]}}{{seperator}}
+ {% endfor %}
+
+
+ {% if page.entry.booktitle == empty or page.entry.booktitle == nil %}
+ {% else %}
+ In {{ page.entry.booktitle }} ,
+ {% endif %}
+ {% if page.entry.journal == empty or page.entry.journal == nil %}
+ {% else %}
+ {{ page.entry.journal }} ,
+ {% endif %}
+ {% if page.entry.series == empty or page.entry.series == nil %}
+ {% else %}
+ {{ page.entry.series }} .
+ {% endif %}
+ {% if page.entry.pages == empty or page.entry.pages == nil %}
+ {% else %}
+ {{ page.entry.pages }},
+ {% endif %}
+ {{ page.entry.year }}
+
+ {% if page.entry.url == empty or page.entry.url == nil %}
+ {% else %}
+
{{ page.entry.award }}
+ {% endif %}
+
+
+ {% if page.entry.url == empty or page.entry.url == nil %}
+ {% else %}
+ [PDF ]
+ {% endif %}
+
+ {% if page.entry.report == empty or page.entry.report == nil %}
+ {% else %}
+ [Technical Report ]
+ {% endif %}
+
+ {% if page.entry.tool == empty or page.entry.tool == nil %}
+ {% else %}
+ [Tool ]
+ {% endif %}
+
+ {% if page.entry.slides == empty or page.entry.slides == nil %}
+ {% else %}
+ [Slides ]
+ {% endif %}
+
+
+
+ {% if page.entry.youtube == empty or page.entry.youtube == nil %}
+ {% else %}
+
VIDEO
+ {% endif %}
+
+ {% if page.entry.slides == empty or page.entry.slides == nil %}
+ {% else %}
+
+ {% endif %}
+
+
+ {% if page.entry.citeproc %}
+
Citation
+
+
{{ page.entry.citeproc }}
+
+ {% endif %}
+
+
+ {% if page.entry.note %}
+
{{ page.entry.note }}
+ {% endif %}
+
+
+ {% if page.entry.abstract %}
+
Abstract
+
+
{{ page.entry.abstract }}
+ {% endif %}
+
+
BibTeX
+ {% highlight bash tabsize=2 %}
+ {{ page.entry.bibtex }}
+ {% endhighlight %}
+
+
+ {% unless page.footer == false %}
+
+ {% endunless %}
+
+{% if page.comments == true %}{% include comments.html %}{% endif %}
+
+{% unless page.sidebar == false or site.default_sidebar == false %}
+
+{% endunless %}
diff --git a/source/_layouts/category_index.html b/source/_layouts/category_index.html
new file mode 100644
index 00000000..85a63072
--- /dev/null
+++ b/source/_layouts/category_index.html
@@ -0,0 +1,17 @@
+---
+layout: page
+footer: false
+---
+
+
+{% for post in site.categories[page.category] %}
+{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
+{% unless year == this_year %}
+ {% assign year = this_year %}
+
{{ year }}
+{% endunless %}
+
+ {% include archive_post.html %}
+
+{% endfor %}
+
diff --git a/source/_layouts/default.html b/source/_layouts/default.html
new file mode 100644
index 00000000..f23b07b8
--- /dev/null
+++ b/source/_layouts/default.html
@@ -0,0 +1,14 @@
+{% capture root_url %}{{ site.root | strip_slash }}{% endcapture %}
+{% include head.html %}
+
+ {% include header.html %}
+ {% include navigation.html %}
+
+
+ {{ content | expand_urls: root_url }}
+
+
+ {% include footer.html %}
+ {% include after_footer.html %}
+
+
diff --git a/source/_layouts/page.html b/source/_layouts/page.html
new file mode 100644
index 00000000..8ba6ec94
--- /dev/null
+++ b/source/_layouts/page.html
@@ -0,0 +1,42 @@
+---
+layout: default
+---
+
+
+
+ {% if page.title %}
+
+ {% endif %}
+ {{ content }}
+ {% unless page.footer == false %}
+
+ {% endunless %}
+
+{% if site.disqus_short_name and page.comments == true %}
+
+{% endif %}
+
+{% unless page.sidebar == false %}
+
+{% endunless %}
diff --git a/source/_layouts/post.html b/source/_layouts/post.html
new file mode 100644
index 00000000..b450681b
--- /dev/null
+++ b/source/_layouts/post.html
@@ -0,0 +1,43 @@
+---
+layout: default
+single: true
+---
+
+
+
+ {% include article.html %}
+
+
+ {% include post/author.html %}
+ {% include post/date.html %}{{ time }}{% if updated %} {{ updated }}{% endif %}
+ {% include post/categories.html %}
+
+ {% unless page.sharing == false %}
+ {% include post/sharing.html %}
+ {% endunless %}
+
+ {% if page.previous.url %}
+ « {{page.previous.title}}
+ {% endif %}
+ {% if page.next.url %}
+ {{page.next.title}} »
+ {% endif %}
+
+
+
+{% if site.disqus_short_name and page.comments == true %}
+
+{% endif %}
+
+{% unless page.sidebar == false %}
+
+{% endunless %}
diff --git a/source/_posts/2013-01-02-Octopress.markdown b/source/_posts/2013-01-02-Octopress.markdown
new file mode 100644
index 00000000..654e4f63
--- /dev/null
+++ b/source/_posts/2013-01-02-Octopress.markdown
@@ -0,0 +1,9 @@
+---
+layout: post
+title: "Octopress"
+date: 2013-01-02 06:29
+comments: false
+categories:
+---
+
+SALT lab's website is migrated to GitHub and is now based on Octopress!
\ No newline at end of file
diff --git a/source/_posts/2013-01-04-icst13.markdown b/source/_posts/2013-01-04-icst13.markdown
new file mode 100644
index 00000000..9e53d2ee
--- /dev/null
+++ b/source/_posts/2013-01-04-icst13.markdown
@@ -0,0 +1,18 @@
+---
+layout: post
+title: "Efficient JavaScript Mutation Testing (ICST 2013)"
+date: 2013-01-04 17:42
+comments: false
+categories: papers
+---
+
+
+Shabnam Mirshokraie, Ali Mesbah, and Karthik Pattabiraman (2013). **Efficient JavaScript Mutation Testing**. In *Proceedings of the 6th IEEE International Conference on Software Testing, Verification and Validation, (ICST’13)*.
+
+{% blockquote %}
+ Abstract: Mutation testing is an effective test adequacy assessment technique. However, it suffers from two main issues. First, there is a high computational cost in executing the test suite against a potentially large pool of generated mutants. Second, there is much effort involved in filtering out equivalent mutants, which are syntactically different but semantically identical to the original program. Prior work has mainly focused on detecting equivalent mutants after the mutation generation phase, which is computationally expensive and has limited efficiency. In this paper, we propose a technique that leverages static and dynamic program analysis to guide the mutation generation process a-priori towards parts of the code that are error-prone or likely to influence the program’s output. Further, we focus on the JavaScript language, and propose a set of mutation operators that are specific to web applications. We implement our approach in a tool called Mutandis. We empirically evaluate Mutandis on a number of web applications to assess the efficacy of the approach.
+{% endblockquote %}
+
+
+
+
diff --git a/source/_posts/2013-04-30-recent-updates.markdown b/source/_posts/2013-04-30-recent-updates.markdown
new file mode 100644
index 00000000..a285c474
--- /dev/null
+++ b/source/_posts/2013-04-30-recent-updates.markdown
@@ -0,0 +1,28 @@
+---
+layout: post
+title: "Hidden-web induced by client-side scripting: An empirical study (ICWE 2013)"
+date: 2013-04-30 13:43
+comments: true
+categories: papers
+---
+
+Zahra Behfarshad and Ali Mesbah. **Hidden-web induced by client-side scripting: An empirical study**. In *Proceedings of the International Conference on Web Engineering (ICWE)*, 15 pages. Springer, 2013.
+
+{% blockquote %}
+Abstract: Client-side JavaScript is increasingly used for enhancing web
+application functionality, interactivity, and responsiveness. Through the
+execution of JavaScript code in browsers, the DOM tree representing a
+webpage at runtime, can be incrementally updated without requiring a
+URL change. This dynamically updated content is hidden from general
+search engines. In this paper, we present the rst empirical study on measuring and characterizing the hidden-web induced as a result of client-side JavaScript execution. Our study reveals that this type of hidden-web
+content is prevalent in online web applications today: from the 500 websites we analyzed, 95% contain client-side hidden-web content; On those websites that contain client-side hidden-web content, (1) on average, 62%
+of the web states are hidden, (2) per hidden state, there is an average of
+19 kilobytes of data that is hidden from which 0.6 kilobytes contain textual content, (3) the DIV element is the most common clickable element
+used (61%) to initiate this type of hidden-web state transition, and (4)
+on average 25 minutes is required to dynamically crawl 50 DOM states.
+Further, our study indicates that there is a correlation between DOM
+tree size and hidden-web content, but no correlation exists between the
+amount of JavaScript code and client-side hidden-web.
+{% endblockquote %}
+
+
diff --git a/source/_posts/2013-05-28-an-empirical-study-of-client-side-javascript-bugs-esem-2013.markdown b/source/_posts/2013-05-28-an-empirical-study-of-client-side-javascript-bugs-esem-2013.markdown
new file mode 100644
index 00000000..c26f3a48
--- /dev/null
+++ b/source/_posts/2013-05-28-an-empirical-study-of-client-side-javascript-bugs-esem-2013.markdown
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "An Empirical Study of Client-Side JavaScript Bugs (ESEM 2013)"
+date: 2013-05-28 11:25
+comments: true
+categories: papers
+---
+
+Frolin Ocariza, Kartik Bajaj, Karthik Pattabiraman, and Ali Mesbah. **An empirical study of client-side JavaScript bugs**. In *Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)*, 10 pages. IEEE Computer Society, 2013.
+
+{% blockquote %}
+Abstract—Context: Client-side JavaScript is widely used in web applications to improve user-interactivity and minimize clientserver communications. Unfortunately, web applications are prone to JavaScript faults. While prior studies have demonstrated the prevalence of these faults, no attempts have been made to determine their root causes and consequences. Objective: The goal of our study is to understand the root causes and impacts of JavaScript faults and how the results can impact JavaScript programmers, testers and tool developers. Method: We perform an empirical study of 317 bug reports from 12 bug repositories. The bug reports are thoroughly examined to classify and extract information about the fault’s cause (the error) and consequence (the failure and impact). Result: The majority (65%) of JavaScript faults are DOM-related, meaning they are caused by faulty interactions of the JavaScript code with the Document Object Model (DOM). Further, 80% of the highest impact JavaScript faults are DOM-related. Finally, most JavaScript faults originate from programmer mistakes committed in the JavaScript code itself, as opposed to other web application components such as the server-side or HTML code. Conclusion: Given the prevalence of DOM-related faults, JavaScript programmers need development tools that can help them reason about the DOM. Also, testers should prioritize detection of DOM-related faults as most high impact faults belong to this category. Finally, developers can use the error patterns we found to design more powerful static analysis tools for JavaScript.
+{% endblockquote %}
+
diff --git a/source/_posts/2013-05-28-real-challenges-in-mobile-app-development-esem-2013.markdown b/source/_posts/2013-05-28-real-challenges-in-mobile-app-development-esem-2013.markdown
new file mode 100644
index 00000000..4043d80a
--- /dev/null
+++ b/source/_posts/2013-05-28-real-challenges-in-mobile-app-development-esem-2013.markdown
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "Real Challenges in Mobile App Development (ESEM 2013)"
+date: 2013-05-28 11:11
+comments: true
+categories: papers
+---
+
+
+ Mona Erfani Joorabchi, Ali Mesbah, and Philippe Kruchten. **Real challenges in mobile app development**. In *Proceedings of the ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM)*, 10 pages. IEEE Computer Society, 2013.
+
+
+{% blockquote %}
+Abstract—Context: Mobile app development is a relatively new phenomenon that is increasing rapidly due to the ubiquity and popularity of smartphones among end-users. Objective: The goal of our study is to gain an understanding of the main challenges developers face in practice when they build apps for different mobile devices. Method: We conducted a qualitative study, following a Grounded Theory approach, in which we interviewed 12 senior mobile developers from 9 different companies, followed by a semi-structured survey, with 188 respondents from the mobile development community. Results: The outcome is an overview of the current challenges faced by mobile developers in practice, such as developing apps across multiple platforms, lack of robust monitoring, analysis, and testing tools, and emulators that are slow or miss many features of mobile devices. Conclusion: Based on our findings of the current practices and challenges, we highlight areas that require more attention from the research and development community.
+{% endblockquote %}
+
diff --git a/source/_posts/2013-06-25-jsnose-detecting-javascript-code-smells-scam-2013.markdown b/source/_posts/2013-06-25-jsnose-detecting-javascript-code-smells-scam-2013.markdown
new file mode 100644
index 00000000..7afeb69e
--- /dev/null
+++ b/source/_posts/2013-06-25-jsnose-detecting-javascript-code-smells-scam-2013.markdown
@@ -0,0 +1,11 @@
+---
+layout: post
+title: "JSNose: Detecting JavaScript Code Smells (SCAM 2013)"
+date: 2013-06-25 15:38
+comments: true
+categories: papers
+---
+
+[**JSNose: Detecting JavaScript Code Smells**](/publications/amin_scam13.html) accepted at SCAM 2013.
+
+
diff --git a/source/_posts/2013-07-12-best-paper-award-at-icwe-13.markdown b/source/_posts/2013-07-12-best-paper-award-at-icwe-13.markdown
new file mode 100644
index 00000000..89503db2
--- /dev/null
+++ b/source/_posts/2013-07-12-best-paper-award-at-icwe-13.markdown
@@ -0,0 +1,9 @@
+---
+layout: post
+title: "Best Paper Award at ICWE'13"
+date: 2013-07-12 09:56
+comments: false
+categories: awards
+---
+
+Our [paper](http://salt.ece.ubc.ca/publications/jana_icwe13.html) received the [Best Paper Award](http://icwe2013.webengineering.org/Contents/Item/Display/257) at ICWE 2013.
\ No newline at end of file
diff --git a/source/_posts/2013-09-22-feedback-directed-exploration-of-web-applications-to-derive-test-models-issre-13.markdown b/source/_posts/2013-09-22-feedback-directed-exploration-of-web-applications-to-derive-test-models-issre-13.markdown
new file mode 100644
index 00000000..01af9f84
--- /dev/null
+++ b/source/_posts/2013-09-22-feedback-directed-exploration-of-web-applications-to-derive-test-models-issre-13.markdown
@@ -0,0 +1,9 @@
+---
+layout: post
+title: "Feedback-directed Exploration of Web Applications to Derive Test Models (ISSRE'13)"
+date: 2013-09-22 12:35
+comments: false
+categories: papers
+---
+
+[**Feedback-directed Exploration of Web Applications to Derive Test Models**](/publications/amin_issre13.html) accepted at ISSRE 2013.
diff --git a/source/_posts/2014-01-15-two-papers-at-icse-2014.markdown b/source/_posts/2014-01-15-two-papers-at-icse-2014.markdown
new file mode 100644
index 00000000..41554f87
--- /dev/null
+++ b/source/_posts/2014-01-15-two-papers-at-icse-2014.markdown
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "Two Papers at ICSE 2014"
+date: 2014-01-15 22:32
+comments: false
+categories: papers
+---
+
+We have two papers accepted in the research track of [ICSE'14](http://2014.icse-conferences.org):
+
+* [**Understanding JavaScript Event-based Interactions**](/publications/saba_clematis.html)
+* [**Vejovis: Suggesting Fixes for JavaScript Faults**](/publications/frolin_vejovis.html)
\ No newline at end of file
diff --git a/source/_posts/2014-03-11-two-papers-at-msr-2014.markdown b/source/_posts/2014-03-11-two-papers-at-msr-2014.markdown
new file mode 100644
index 00000000..cd8411ef
--- /dev/null
+++ b/source/_posts/2014-03-11-two-papers-at-msr-2014.markdown
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "Two papers at MSR 2014"
+date: 2014-03-11 07:43:19 -0700
+comments: false
+categories: papers
+---
+
+Two papers accepted in the research track of [MSR'14](http://2014.msrconf.org):
+
+* [**Works For Me! Characterizing Non-Reproducible Bug Reports**](/publications/mona_msr14.html)
+* [**Mining Questions Asked by Web Developers**](/publications/kartik_msr14.html)
\ No newline at end of file
diff --git a/source/_posts/2014-03-30-paper-at-icse-seip-2014.markdown b/source/_posts/2014-03-30-paper-at-icse-seip-2014.markdown
new file mode 100644
index 00000000..9f2eaeb1
--- /dev/null
+++ b/source/_posts/2014-03-30-paper-at-icse-seip-2014.markdown
@@ -0,0 +1,10 @@
+---
+layout: post
+title: "Paper at ICSE SEIP 2014"
+date: 2014-02-18 17:42:59 -0700
+comments: false
+categories: papers
+---
+
+The paper [**Software Engineering for the Web: The State of the Practice**](/publications/icse14seip.html) accepted in the Software Engineering in Practice (SEIP) track of [ICSE'14](http://2014.icse-conferences.org).
+
diff --git a/source/_posts/2014-03-30-paper-at-issta-2014.markdown b/source/_posts/2014-03-30-paper-at-issta-2014.markdown
new file mode 100644
index 00000000..4c61ce42
--- /dev/null
+++ b/source/_posts/2014-03-30-paper-at-issta-2014.markdown
@@ -0,0 +1,9 @@
+---
+layout: post
+title: "Paper at ISSTA 2014"
+date: 2014-03-30 17:50:06 -0700
+comments: false
+categories: papers
+---
+
+Our paper [**DOM-Based Test Adequacy Criteria for Web Applications**](/publications/domcovery_issta14.html) accepted in the research track of [ISSTA'14](http://issta2014.org).
\ No newline at end of file
diff --git a/source/_posts/2014-06-10-distinguished-paper-award-at-icse-2014.markdown b/source/_posts/2014-06-10-distinguished-paper-award-at-icse-2014.markdown
new file mode 100644
index 00000000..b651fb81
--- /dev/null
+++ b/source/_posts/2014-06-10-distinguished-paper-award-at-icse-2014.markdown
@@ -0,0 +1,19 @@
+---
+layout: post
+title: "Distinguished Paper Award at ICSE 2014"
+date: 2014-06-10 13:02:39 -0700
+comments: false
+categories: awards
+---
+
+
+ACM SIGSOFT Distinguished Paper Award for our ICSE'14 [paper](http://salt.ece.ubc.ca/publications/saba_clematis.html) on understanding JavaScript event-based interactions.
+
+
+
+{% blockquote %}
+Web applications have become one of the fastest growing types of software system today. Despite their popularity, understanding the behaviour of modern web applications is still challenging for developers during development and maintenance tasks. The challenges mainly stem from the dynamic, event-driven, and asynchronous nature of the JavaScript language.
+In our paper, we proposed a generic technique for capturing low-level event-based interactions in a web application and mapping those to a higher-level behavioural model. This model is then transformed into an interactive visualization, representing episodes of triggered causal and temporal events, related JavaScript code executions, and their impact on the dynamic DOM state. The approach, implemented in a tool called Clematis, allows developers to easily understand the complex dynamic behaviour of their application at three different semantic levels. The results from experiments conducted in an industrial setting show that Clematis is capable of improving accuracy by 61%, while reducing completion time by 47%.
+{% endblockquote %}
+
+
diff --git a/source/_posts/2014-07-01-1-x-fse-2014-2-x-ase-2014.markdown b/source/_posts/2014-07-01-1-x-fse-2014-2-x-ase-2014.markdown
new file mode 100644
index 00000000..66fbb064
--- /dev/null
+++ b/source/_posts/2014-07-01-1-x-fse-2014-2-x-ase-2014.markdown
@@ -0,0 +1,18 @@
+---
+layout: post
+title: "2 X ASE 2014, 1 X FSE 2014"
+date: 2014-07-01 10:09:08 -0700
+comments: false
+categories: papers
+---
+
+
+We have two full papers accepted at [ASE 2014](http://ase2014.org):
+
+* [**Leveraging Existing Tests in Automated Test Generation for Web Applications**](/publications/amin_ase14.html)
+* [**Dompletion: DOM-Aware JavaScript Code Completion**](/publications/kartik_ase14.html)
+
+
+And one full paper accepted at [FSE 2014](http://fse22.gatech.edu):
+
+* [**Discovering Refactoring Opportunities in Cascading Style Sheets**](/publications/css_refactoring.html)
diff --git a/source/_posts/2014-12-18-paper-at-ICSE-2015.markdown b/source/_posts/2014-12-18-paper-at-ICSE-2015.markdown
new file mode 100644
index 00000000..a2a1c647
--- /dev/null
+++ b/source/_posts/2014-12-18-paper-at-ICSE-2015.markdown
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "Papers at ICSE 2015 and ICST 2015"
+date: 2014-12-21 11:29:06 -0700
+comments: false
+categories: papers
+---
+
+Our paper [**Detecting Inconsistencies in JavaScript MVC Applications**](/publications/frolin_icse15.html) is accepted to [ICSE'15](http://2015.icse-conferences.org/).
+
+Also, the paper [**JSEFT: Automated JavaScript Unit Test Generation**](/publications/shabnam_icst15.html) is accepted to [ICST'15](http://icst2015.ist.tu-graz.ac.at).
+
diff --git a/source/_posts/2015-04-29-ecoop-2015.markdown b/source/_posts/2015-04-29-ecoop-2015.markdown
new file mode 100644
index 00000000..9082a358
--- /dev/null
+++ b/source/_posts/2015-04-29-ecoop-2015.markdown
@@ -0,0 +1,10 @@
+---
+layout: post
+title: "ECOOP 2015"
+date: 2015-04-29 15:16:18 -0700
+comments: false
+categories: papers
+---
+
+Our paper [**Hybrid DOM-Sensitive Change Impact Analysis for JavaScript**](/publications/ecoop15.html) is accepted to [ECOOP'15](http://2015.ecoop.org).
+
diff --git a/source/_posts/2015-08-07-paper-updates.markdown b/source/_posts/2015-08-07-paper-updates.markdown
new file mode 100644
index 00000000..30654189
--- /dev/null
+++ b/source/_posts/2015-08-07-paper-updates.markdown
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "paper updates"
+date: 2015-08-07 00:31:01 +0430
+comments: false
+categories: papers
+---
+
+Our group has 6 full technical papers appearing at ESEC/FSE'15, ESEM'15, ICSME'15, ASE'15 (two papers), and ISSRE'15. See our [publications page](/publications/) for more details.
+
+
+
+
+
diff --git a/source/_posts/2015-10-23-best-full-paper-award-at-esem-15.markdown b/source/_posts/2015-10-23-best-full-paper-award-at-esem-15.markdown
new file mode 100644
index 00000000..aec61fe1
--- /dev/null
+++ b/source/_posts/2015-10-23-best-full-paper-award-at-esem-15.markdown
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "Best Full Paper Award at ESEM'15"
+date: 2015-10-23 09:58:05 -0700
+comments: false
+categories: awards
+---
+
+Best Full Paper Award for the paper ["Don't Call Us, We'll Call Y ou: Characterizing Callbacks in JavaScript"](/publications/esem15.html), by Keheliya Gallaba, Ali Mesbah, and Ivan Beschastnikh, at the 9th ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM 2015).
+
+
+
+{% blockquote %}
+Abstract: JavaScript is a popular language for developing web applications and is increasingly used for both client-side and server-side application logic. The JavaScript runtime is inherently event-driven and callbacks are a key language feature. Unfortunately, callbacks induce a non-linear control flow and can be deferred to execute asynchronously, declared anonymously, and may be nested to arbitrary levels. All of these features make callbacks difficult to understand and maintain. We perform an empirical study to characterize JavaScript callback usage across a representative corpus of 138 JavaScript programs, with over 5 million lines of JavaScript code. We find that on average, every 10th function definition takes a callback argument, and that over 43% of all callback-accepting function callsites are anonymous. Furthermore, the majority of callbacks are nested, more than half of all callbacks are asynchronous, and asynchronous callbacks, on average, appear more frequently in client-side code (72%) than server-side (55%). We also study three well-known solutions designed to help with the complexities associated with callbacks, including the error-first callback convention, Async.js library, and Promises. Our results inform the design of future JavaScript analysis and code comprehension tools.
+{% endblockquote %}
+
\ No newline at end of file
diff --git a/source/_posts/2016-03-29-software-analysis-for-the-web-achievements-and-prospects.markdown b/source/_posts/2016-03-29-software-analysis-for-the-web-achievements-and-prospects.markdown
new file mode 100644
index 00000000..3eebdf81
--- /dev/null
+++ b/source/_posts/2016-03-29-software-analysis-for-the-web-achievements-and-prospects.markdown
@@ -0,0 +1,11 @@
+---
+layout: post
+title: "Software Analysis for the Web: Achievements and Prospects"
+date: 2016-03-29 10:51:29 -0700
+comments: true
+categories: talks
+---
+
+Invited vision paper and talk at the Leaders of Tomorrow: Future of Software Engineering (FOSE), SANER'16
+
+VIDEO
\ No newline at end of file
diff --git a/source/_posts/2016-04-11-nserc-das.markdown b/source/_posts/2016-04-11-nserc-das.markdown
new file mode 100644
index 00000000..74c8d57d
--- /dev/null
+++ b/source/_posts/2016-04-11-nserc-das.markdown
@@ -0,0 +1,10 @@
+---
+layout: post
+title: "NSERC DAS"
+date: 2016-04-11 11:07:58 -0700
+comments: false
+categories: awards
+---
+
+
+Dr. Mesbah receives an NSERC Discovery Accelerator (DAS) Award for 2016-2019. "The DAS Program provides substantial and timely resources to researchers who have a superior research program that is highly rated in terms of originality and innovation, and who show strong potential to become international leaders within their field.”
\ No newline at end of file
diff --git a/source/_posts/2016-04-11-post-doct-and-phd-positions.markdown b/source/_posts/2016-04-11-post-doct-and-phd-positions.markdown
new file mode 100644
index 00000000..7d6f0ae7
--- /dev/null
+++ b/source/_posts/2016-04-11-post-doct-and-phd-positions.markdown
@@ -0,0 +1,9 @@
+---
+layout: post
+title: "Post-doc and PhD positions"
+date: 2016-04-11 12:00:22 -0700
+comments: false
+categories: openings
+---
+
+We have one Post-doc and two PhD positions in the SALT lab @ UBC. For more details, please visit the Open Positions page.
diff --git a/source/assets/jwplayer/glow/controlbar/background.png b/source/assets/jwplayer/glow/controlbar/background.png
new file mode 100644
index 00000000..c2824cc4
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/background.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/blankButton.png b/source/assets/jwplayer/glow/controlbar/blankButton.png
new file mode 100644
index 00000000..010159f3
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/blankButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/divider.png b/source/assets/jwplayer/glow/controlbar/divider.png
new file mode 100644
index 00000000..77cd829a
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/divider.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/fullscreenButton.png b/source/assets/jwplayer/glow/controlbar/fullscreenButton.png
new file mode 100644
index 00000000..e06aa50c
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/fullscreenButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png b/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
new file mode 100644
index 00000000..d2bc4fc7
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/muteButton.png b/source/assets/jwplayer/glow/controlbar/muteButton.png
new file mode 100644
index 00000000..40c40ab2
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/muteButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/muteButtonOver.png b/source/assets/jwplayer/glow/controlbar/muteButtonOver.png
new file mode 100644
index 00000000..96fe7bb0
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/muteButtonOver.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/normalscreenButton.png b/source/assets/jwplayer/glow/controlbar/normalscreenButton.png
new file mode 100644
index 00000000..22295074
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/normalscreenButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png b/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png
new file mode 100644
index 00000000..15db44d4
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/pauseButton.png b/source/assets/jwplayer/glow/controlbar/pauseButton.png
new file mode 100644
index 00000000..e399bf34
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/pauseButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png b/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png
new file mode 100644
index 00000000..409d89d2
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/playButton.png b/source/assets/jwplayer/glow/controlbar/playButton.png
new file mode 100644
index 00000000..f8d9a007
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/playButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/playButtonOver.png b/source/assets/jwplayer/glow/controlbar/playButtonOver.png
new file mode 100644
index 00000000..3fe28484
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/playButtonOver.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png b/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
new file mode 100644
index 00000000..73b371ab
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png b/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
new file mode 100644
index 00000000..72322171
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png b/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
new file mode 100644
index 00000000..626444a6
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png b/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png
new file mode 100644
index 00000000..132a8e7d
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderRail.png b/source/assets/jwplayer/glow/controlbar/timeSliderRail.png
new file mode 100644
index 00000000..27851dfd
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/timeSliderRail.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/unmuteButton.png b/source/assets/jwplayer/glow/controlbar/unmuteButton.png
new file mode 100644
index 00000000..3658453c
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/unmuteButton.png differ
diff --git a/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png b/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
new file mode 100644
index 00000000..138ebb35
Binary files /dev/null and b/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png differ
diff --git a/source/assets/jwplayer/glow/display/background.png b/source/assets/jwplayer/glow/display/background.png
new file mode 100644
index 00000000..391152f5
Binary files /dev/null and b/source/assets/jwplayer/glow/display/background.png differ
diff --git a/source/assets/jwplayer/glow/display/bufferIcon.png b/source/assets/jwplayer/glow/display/bufferIcon.png
new file mode 100644
index 00000000..a3819c1e
Binary files /dev/null and b/source/assets/jwplayer/glow/display/bufferIcon.png differ
diff --git a/source/assets/jwplayer/glow/display/muteIcon.png b/source/assets/jwplayer/glow/display/muteIcon.png
new file mode 100644
index 00000000..e0408bbd
Binary files /dev/null and b/source/assets/jwplayer/glow/display/muteIcon.png differ
diff --git a/source/assets/jwplayer/glow/display/playIcon.png b/source/assets/jwplayer/glow/display/playIcon.png
new file mode 100644
index 00000000..cb384278
Binary files /dev/null and b/source/assets/jwplayer/glow/display/playIcon.png differ
diff --git a/source/assets/jwplayer/glow/dock/button.png b/source/assets/jwplayer/glow/dock/button.png
new file mode 100644
index 00000000..391152f5
Binary files /dev/null and b/source/assets/jwplayer/glow/dock/button.png differ
diff --git a/source/assets/jwplayer/glow/glow.xml b/source/assets/jwplayer/glow/glow.xml
new file mode 100644
index 00000000..71bdced0
--- /dev/null
+++ b/source/assets/jwplayer/glow/glow.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/source/assets/jwplayer/glow/playlist/item.png b/source/assets/jwplayer/glow/playlist/item.png
new file mode 100644
index 00000000..812592c3
Binary files /dev/null and b/source/assets/jwplayer/glow/playlist/item.png differ
diff --git a/source/assets/jwplayer/glow/playlist/itemOver.png b/source/assets/jwplayer/glow/playlist/itemOver.png
new file mode 100644
index 00000000..549f3721
Binary files /dev/null and b/source/assets/jwplayer/glow/playlist/itemOver.png differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderCapBottom.png b/source/assets/jwplayer/glow/playlist/sliderCapBottom.png
new file mode 100644
index 00000000..048cc623
Binary files /dev/null and b/source/assets/jwplayer/glow/playlist/sliderCapBottom.png differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderCapTop.png b/source/assets/jwplayer/glow/playlist/sliderCapTop.png
new file mode 100644
index 00000000..65c463a0
Binary files /dev/null and b/source/assets/jwplayer/glow/playlist/sliderCapTop.png differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderRail.png b/source/assets/jwplayer/glow/playlist/sliderRail.png
new file mode 100644
index 00000000..121778af
Binary files /dev/null and b/source/assets/jwplayer/glow/playlist/sliderRail.png differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderThumb.png b/source/assets/jwplayer/glow/playlist/sliderThumb.png
new file mode 100644
index 00000000..118c3e03
Binary files /dev/null and b/source/assets/jwplayer/glow/playlist/sliderThumb.png differ
diff --git a/source/assets/jwplayer/glow/sharing/embedIcon.png b/source/assets/jwplayer/glow/sharing/embedIcon.png
new file mode 100644
index 00000000..3394ac9c
Binary files /dev/null and b/source/assets/jwplayer/glow/sharing/embedIcon.png differ
diff --git a/source/assets/jwplayer/glow/sharing/embedScreen.png b/source/assets/jwplayer/glow/sharing/embedScreen.png
new file mode 100644
index 00000000..b4059754
Binary files /dev/null and b/source/assets/jwplayer/glow/sharing/embedScreen.png differ
diff --git a/source/assets/jwplayer/glow/sharing/shareIcon.png b/source/assets/jwplayer/glow/sharing/shareIcon.png
new file mode 100644
index 00000000..eae1d4e7
Binary files /dev/null and b/source/assets/jwplayer/glow/sharing/shareIcon.png differ
diff --git a/source/assets/jwplayer/glow/sharing/shareScreen.png b/source/assets/jwplayer/glow/sharing/shareScreen.png
new file mode 100644
index 00000000..695ec949
Binary files /dev/null and b/source/assets/jwplayer/glow/sharing/shareScreen.png differ
diff --git a/source/assets/jwplayer/player.swf b/source/assets/jwplayer/player.swf
new file mode 100644
index 00000000..0eee3797
Binary files /dev/null and b/source/assets/jwplayer/player.swf differ
diff --git a/source/atom.xml b/source/atom.xml
new file mode 100644
index 00000000..403328f3
--- /dev/null
+++ b/source/atom.xml
@@ -0,0 +1,27 @@
+---
+layout: null
+---
+
+
+
+
+
+
+ {{ site.time | date_to_xmlschema }}
+ {{ site.url }}/
+
+
+ {% if site.email %} {% endif %}
+
+ Octopress
+
+ {% for post in site.posts limit: 20 %}
+
+
+
+ {{ post.date | date_to_xmlschema }}
+ {{ site.url }}{{ post.id }}
+
+
+ {% endfor %}
+
diff --git a/source/blog/archives/index.html b/source/blog/archives/index.html
new file mode 100644
index 00000000..f1d9cee3
--- /dev/null
+++ b/source/blog/archives/index.html
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Blog Archive
+footer: false
+---
+
+
+{% for post in site.posts reverse %}
+{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
+{% unless year == this_year %}
+ {% assign year = this_year %}
+
{{ year }}
+{% endunless %}
+
+ {% include archive_post.html %}
+
+{% endfor %}
+
diff --git a/callback-study/bootstrap.css b/source/callback-study/bootstrap.css
similarity index 100%
rename from callback-study/bootstrap.css
rename to source/callback-study/bootstrap.css
diff --git a/callback-study/css/bootswatch.min.css b/source/callback-study/css/bootswatch.min.css
similarity index 100%
rename from callback-study/css/bootswatch.min.css
rename to source/callback-study/css/bootswatch.min.css
diff --git a/callback-study/data_guide.html b/source/callback-study/data_guide.html
similarity index 100%
rename from callback-study/data_guide.html
rename to source/callback-study/data_guide.html
diff --git a/callback-study/esem15-js-callbacks-study.pdf b/source/callback-study/esem15-js-callbacks-study.pdf
similarity index 100%
rename from callback-study/esem15-js-callbacks-study.pdf
rename to source/callback-study/esem15-js-callbacks-study.pdf
diff --git a/callback-study/index.html b/source/callback-study/index.html
similarity index 100%
rename from callback-study/index.html
rename to source/callback-study/index.html
diff --git a/callback-study/js/bootstrap.min.js b/source/callback-study/js/bootstrap.min.js
similarity index 100%
rename from callback-study/js/bootstrap.min.js
rename to source/callback-study/js/bootstrap.min.js
diff --git a/callback-study/js/bootswatch.js b/source/callback-study/js/bootswatch.js
similarity index 100%
rename from callback-study/js/bootswatch.js
rename to source/callback-study/js/bootswatch.js
diff --git a/callback-study/nesting_guide.html b/source/callback-study/nesting_guide.html
similarity index 100%
rename from callback-study/nesting_guide.html
rename to source/callback-study/nesting_guide.html
diff --git a/callback-study/promises_n_noout.html b/source/callback-study/promises_n_noout.html
similarity index 100%
rename from callback-study/promises_n_noout.html
rename to source/callback-study/promises_n_noout.html
diff --git a/callback-study/readme.md b/source/callback-study/readme.md
similarity index 100%
rename from callback-study/readme.md
rename to source/callback-study/readme.md
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples.zip b/source/callback-study/results/callbacks_eight_level_nesting_examples.zip
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples.zip
rename to source/callback-study/results/callbacks_eight_level_nesting_examples.zip
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/README.txt b/source/callback-study/results/callbacks_eight_level_nesting_examples/README.txt
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/README.txt
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/README.txt
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/animateSpec.js b/source/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/animateSpec.js
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/angular.js/animateSpec.js
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/animateSpec.js
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/parseSpec.js b/source/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/parseSpec.js
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/angular.js/parseSpec.js
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/parseSpec.js
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/qSpec.js b/source/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/qSpec.js
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/angular.js/qSpec.js
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/angular.js/qSpec.js
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/bluebird/reduce.js b/source/callback-study/results/callbacks_eight_level_nesting_examples/bluebird/reduce.js
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/bluebird/reduce.js
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/bluebird/reduce.js
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/dc.js/bar-chart-spec.js b/source/callback-study/results/callbacks_eight_level_nesting_examples/dc.js/bar-chart-spec.js
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/dc.js/bar-chart-spec.js
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/dc.js/bar-chart-spec.js
diff --git a/callback-study/results/callbacks_eight_level_nesting_examples/dc.js/line-chart-spec.js b/source/callback-study/results/callbacks_eight_level_nesting_examples/dc.js/line-chart-spec.js
similarity index 100%
rename from callback-study/results/callbacks_eight_level_nesting_examples/dc.js/line-chart-spec.js
rename to source/callback-study/results/callbacks_eight_level_nesting_examples/dc.js/line-chart-spec.js
diff --git a/callback-study/results/callbacks_full_dataset.zip b/source/callback-study/results/callbacks_full_dataset.zip
similarity index 100%
rename from callback-study/results/callbacks_full_dataset.zip
rename to source/callback-study/results/callbacks_full_dataset.zip
diff --git a/callback-study/results/callbacks_full_dataset/README.txt b/source/callback-study/results/callbacks_full_dataset/README.txt
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/README.txt
rename to source/callback-study/results/callbacks_full_dataset/README.txt
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_client.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_client.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_client.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_client.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_games.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_total.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_total.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_total.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_total.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_defs_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_defs_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_defs_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_defs_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_client.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_client.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_client.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_client.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_games.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_total.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_total.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_total.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_total.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/callback_usage_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/callback_usage_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/callback_usage_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/callback_usage_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_client.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_client.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_client.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_client.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_games.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_total.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_total.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_total.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_total.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cb_anon_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/cb_anon_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cb_anon_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cb_anon_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_client.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_client.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_client.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_client.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_games.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_total.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_total.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_total.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_total.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/cbasync_callsites_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/cbasync_callsites_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/chain_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/chain_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/chain_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/chain_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/chain_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/chain_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/chain_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/chain_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/chain_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/chain_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/chain_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/chain_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/chain_games.csv b/source/callback-study/results/callbacks_full_dataset/results/chain_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/chain_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/chain_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/chain_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/chain_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/chain_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/chain_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/chain_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/chain_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/chain_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/chain_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/file_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/file_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/file_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/file_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/file_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/file_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/file_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/file_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/file_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/file_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/file_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/file_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/file_games.csv b/source/callback-study/results/callbacks_full_dataset/results/file_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/file_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/file_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/file_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/file_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/file_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/file_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/file_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/file_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/file_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/file_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/hybrid_dep.csv b/source/callback-study/results/callbacks_full_dataset/results/hybrid_dep.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/hybrid_dep.csv
rename to source/callback-study/results/callbacks_full_dataset/results/hybrid_dep.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/npm_dep.csv b/source/callback-study/results/callbacks_full_dataset/results/npm_dep.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/npm_dep.csv
rename to source/callback-study/results/callbacks_full_dataset/results/npm_dep.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/pkg_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/pkg_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/pkg_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/pkg_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/pkg_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/pkg_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/pkg_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/pkg_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/pkg_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/pkg_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/pkg_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/pkg_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/pkg_games.csv b/source/callback-study/results/callbacks_full_dataset/results/pkg_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/pkg_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/pkg_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/pkg_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/pkg_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/pkg_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/pkg_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/pkg_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/pkg_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/pkg_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/pkg_webapps.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises-all.csv b/source/callback-study/results/callbacks_full_dataset/results/promises-all.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises-all.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises-all.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_client.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_client.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_client.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_client.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_dataviz.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_dataviz.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_dataviz.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_dataviz.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_engines.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_engines.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_engines.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_engines.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_frameworks.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_frameworks.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_frameworks.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_frameworks.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_games.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_games.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_games.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_games.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_npm.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_npm.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_npm.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_npm.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_npm_noout.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_npm_noout.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_npm_noout.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_npm_noout.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_total.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_total.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_total.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_total.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_total_noout.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_total_noout.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_total_noout.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_total_noout.csv
diff --git a/callback-study/results/callbacks_full_dataset/results/promises_webapps.csv b/source/callback-study/results/callbacks_full_dataset/results/promises_webapps.csv
similarity index 100%
rename from callback-study/results/callbacks_full_dataset/results/promises_webapps.csv
rename to source/callback-study/results/callbacks_full_dataset/results/promises_webapps.csv
diff --git a/callback-study/results/extreme-examples/animateSpec.js b/source/callback-study/results/extreme-examples/animateSpec.js
similarity index 100%
rename from callback-study/results/extreme-examples/animateSpec.js
rename to source/callback-study/results/extreme-examples/animateSpec.js
diff --git a/callback-study/results/extreme-examples/bar-chart-spec.js b/source/callback-study/results/extreme-examples/bar-chart-spec.js
similarity index 100%
rename from callback-study/results/extreme-examples/bar-chart-spec.js
rename to source/callback-study/results/extreme-examples/bar-chart-spec.js
diff --git a/callback-study/results/extreme-examples/line-chart-spec.js b/source/callback-study/results/extreme-examples/line-chart-spec.js
similarity index 100%
rename from callback-study/results/extreme-examples/line-chart-spec.js
rename to source/callback-study/results/extreme-examples/line-chart-spec.js
diff --git a/callback-study/results/extreme-examples/parseSpec.js b/source/callback-study/results/extreme-examples/parseSpec.js
similarity index 100%
rename from callback-study/results/extreme-examples/parseSpec.js
rename to source/callback-study/results/extreme-examples/parseSpec.js
diff --git a/callback-study/results/extreme-examples/qSpec.js b/source/callback-study/results/extreme-examples/qSpec.js
similarity index 100%
rename from callback-study/results/extreme-examples/qSpec.js
rename to source/callback-study/results/extreme-examples/qSpec.js
diff --git a/callback-study/results/extreme-examples/reduce.js b/source/callback-study/results/extreme-examples/reduce.js
similarity index 100%
rename from callback-study/results/extreme-examples/reduce.js
rename to source/callback-study/results/extreme-examples/reduce.js
diff --git a/callback-study/results/extreme_examples.zip b/source/callback-study/results/extreme_examples.zip
similarity index 100%
rename from callback-study/results/extreme_examples.zip
rename to source/callback-study/results/extreme_examples.zip
diff --git a/callback-study/results/extreme_examples/examples/animateSpec.js b/source/callback-study/results/extreme_examples/examples/animateSpec.js
similarity index 100%
rename from callback-study/results/extreme_examples/examples/animateSpec.js
rename to source/callback-study/results/extreme_examples/examples/animateSpec.js
diff --git a/callback-study/results/extreme_examples/examples/bar-chart-spec.js b/source/callback-study/results/extreme_examples/examples/bar-chart-spec.js
similarity index 100%
rename from callback-study/results/extreme_examples/examples/bar-chart-spec.js
rename to source/callback-study/results/extreme_examples/examples/bar-chart-spec.js
diff --git a/callback-study/results/extreme_examples/examples/line-chart-spec.js b/source/callback-study/results/extreme_examples/examples/line-chart-spec.js
similarity index 100%
rename from callback-study/results/extreme_examples/examples/line-chart-spec.js
rename to source/callback-study/results/extreme_examples/examples/line-chart-spec.js
diff --git a/callback-study/results/extreme_examples/examples/parseSpec.js b/source/callback-study/results/extreme_examples/examples/parseSpec.js
similarity index 100%
rename from callback-study/results/extreme_examples/examples/parseSpec.js
rename to source/callback-study/results/extreme_examples/examples/parseSpec.js
diff --git a/callback-study/results/extreme_examples/examples/qSpec.js b/source/callback-study/results/extreme_examples/examples/qSpec.js
similarity index 100%
rename from callback-study/results/extreme_examples/examples/qSpec.js
rename to source/callback-study/results/extreme_examples/examples/qSpec.js
diff --git a/callback-study/results/extreme_examples/examples/reduce.js b/source/callback-study/results/extreme_examples/examples/reduce.js
similarity index 100%
rename from callback-study/results/extreme_examples/examples/reduce.js
rename to source/callback-study/results/extreme_examples/examples/reduce.js
diff --git a/callback-study/results/extreme_examples/readme.html b/source/callback-study/results/extreme_examples/readme.html
similarity index 100%
rename from callback-study/results/extreme_examples/readme.html
rename to source/callback-study/results/extreme_examples/readme.html
diff --git a/callback-study/results/raw_data.zip b/source/callback-study/results/raw_data.zip
similarity index 100%
rename from callback-study/results/raw_data.zip
rename to source/callback-study/results/raw_data.zip
diff --git a/callback-study/results/raw_data/data_guide.html b/source/callback-study/results/raw_data/data_guide.html
similarity index 100%
rename from callback-study/results/raw_data/data_guide.html
rename to source/callback-study/results/raw_data/data_guide.html
diff --git a/callback-study/results/raw_data/results/callback_defs_client.csv b/source/callback-study/results/raw_data/results/callback_defs_client.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_client.csv
rename to source/callback-study/results/raw_data/results/callback_defs_client.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_dataviz.csv b/source/callback-study/results/raw_data/results/callback_defs_dataviz.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_dataviz.csv
rename to source/callback-study/results/raw_data/results/callback_defs_dataviz.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_engines.csv b/source/callback-study/results/raw_data/results/callback_defs_engines.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_engines.csv
rename to source/callback-study/results/raw_data/results/callback_defs_engines.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_frameworks.csv b/source/callback-study/results/raw_data/results/callback_defs_frameworks.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_frameworks.csv
rename to source/callback-study/results/raw_data/results/callback_defs_frameworks.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_games.csv b/source/callback-study/results/raw_data/results/callback_defs_games.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_games.csv
rename to source/callback-study/results/raw_data/results/callback_defs_games.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_hybrid.csv b/source/callback-study/results/raw_data/results/callback_defs_hybrid.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_hybrid.csv
rename to source/callback-study/results/raw_data/results/callback_defs_hybrid.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_npm.csv b/source/callback-study/results/raw_data/results/callback_defs_npm.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_npm.csv
rename to source/callback-study/results/raw_data/results/callback_defs_npm.csv
diff --git a/callback-study/results/raw_data/results/callback_defs_total.csv b/source/callback-study/results/raw_data/results/callback_defs_total.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_defs_total.csv
rename to source/callback-study/results/raw_data/results/callback_defs_total.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_client.csv b/source/callback-study/results/raw_data/results/callback_usage_client.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_client.csv
rename to source/callback-study/results/raw_data/results/callback_usage_client.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_dataviz.csv b/source/callback-study/results/raw_data/results/callback_usage_dataviz.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_dataviz.csv
rename to source/callback-study/results/raw_data/results/callback_usage_dataviz.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_engines.csv b/source/callback-study/results/raw_data/results/callback_usage_engines.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_engines.csv
rename to source/callback-study/results/raw_data/results/callback_usage_engines.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_frameworks.csv b/source/callback-study/results/raw_data/results/callback_usage_frameworks.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_frameworks.csv
rename to source/callback-study/results/raw_data/results/callback_usage_frameworks.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_games.csv b/source/callback-study/results/raw_data/results/callback_usage_games.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_games.csv
rename to source/callback-study/results/raw_data/results/callback_usage_games.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_hybrid.csv b/source/callback-study/results/raw_data/results/callback_usage_hybrid.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_hybrid.csv
rename to source/callback-study/results/raw_data/results/callback_usage_hybrid.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_npm.csv b/source/callback-study/results/raw_data/results/callback_usage_npm.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_npm.csv
rename to source/callback-study/results/raw_data/results/callback_usage_npm.csv
diff --git a/callback-study/results/raw_data/results/callback_usage_total.csv b/source/callback-study/results/raw_data/results/callback_usage_total.csv
similarity index 100%
rename from callback-study/results/raw_data/results/callback_usage_total.csv
rename to source/callback-study/results/raw_data/results/callback_usage_total.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_client.csv b/source/callback-study/results/raw_data/results/cb_anon_client.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_client.csv
rename to source/callback-study/results/raw_data/results/cb_anon_client.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_d.csv b/source/callback-study/results/raw_data/results/cb_anon_d.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_d.csv
rename to source/callback-study/results/raw_data/results/cb_anon_d.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_e.csv b/source/callback-study/results/raw_data/results/cb_anon_e.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_e.csv
rename to source/callback-study/results/raw_data/results/cb_anon_e.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_f.csv b/source/callback-study/results/raw_data/results/cb_anon_f.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_f.csv
rename to source/callback-study/results/raw_data/results/cb_anon_f.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_g.csv b/source/callback-study/results/raw_data/results/cb_anon_g.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_g.csv
rename to source/callback-study/results/raw_data/results/cb_anon_g.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_h.csv b/source/callback-study/results/raw_data/results/cb_anon_h.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_h.csv
rename to source/callback-study/results/raw_data/results/cb_anon_h.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_n.csv b/source/callback-study/results/raw_data/results/cb_anon_n.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_n.csv
rename to source/callback-study/results/raw_data/results/cb_anon_n.csv
diff --git a/callback-study/results/raw_data/results/cb_anon_total.csv b/source/callback-study/results/raw_data/results/cb_anon_total.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cb_anon_total.csv
rename to source/callback-study/results/raw_data/results/cb_anon_total.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_client.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_client.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_client.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_client.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_d.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_d.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_d.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_d.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_e.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_e.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_e.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_e.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_f.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_f.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_f.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_f.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_g.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_g.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_g.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_g.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_h.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_h.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_h.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_h.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_n.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_n.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_n.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_n.csv
diff --git a/callback-study/results/raw_data/results/cbasync_callsites_total.csv b/source/callback-study/results/raw_data/results/cbasync_callsites_total.csv
similarity index 100%
rename from callback-study/results/raw_data/results/cbasync_callsites_total.csv
rename to source/callback-study/results/raw_data/results/cbasync_callsites_total.csv
diff --git a/callback-study/results/raw_data/results/chain_dataviz.csv b/source/callback-study/results/raw_data/results/chain_dataviz.csv
similarity index 100%
rename from callback-study/results/raw_data/results/chain_dataviz.csv
rename to source/callback-study/results/raw_data/results/chain_dataviz.csv
diff --git a/callback-study/results/raw_data/results/chain_engines.csv b/source/callback-study/results/raw_data/results/chain_engines.csv
similarity index 100%
rename from callback-study/results/raw_data/results/chain_engines.csv
rename to source/callback-study/results/raw_data/results/chain_engines.csv
diff --git a/callback-study/results/raw_data/results/chain_frameworks.csv b/source/callback-study/results/raw_data/results/chain_frameworks.csv
similarity index 100%
rename from callback-study/results/raw_data/results/chain_frameworks.csv
rename to source/callback-study/results/raw_data/results/chain_frameworks.csv
diff --git a/callback-study/results/raw_data/results/chain_games.csv b/source/callback-study/results/raw_data/results/chain_games.csv
similarity index 100%
rename from callback-study/results/raw_data/results/chain_games.csv
rename to source/callback-study/results/raw_data/results/chain_games.csv
diff --git a/callback-study/results/raw_data/results/chain_hybrid.csv b/source/callback-study/results/raw_data/results/chain_hybrid.csv
similarity index 100%
rename from callback-study/results/raw_data/results/chain_hybrid.csv
rename to source/callback-study/results/raw_data/results/chain_hybrid.csv
diff --git a/callback-study/results/raw_data/results/chain_npm.csv b/source/callback-study/results/raw_data/results/chain_npm.csv
similarity index 100%
rename from callback-study/results/raw_data/results/chain_npm.csv
rename to source/callback-study/results/raw_data/results/chain_npm.csv
diff --git a/callback-study/results/raw_data/results/file_dataviz.csv b/source/callback-study/results/raw_data/results/file_dataviz.csv
similarity index 100%
rename from callback-study/results/raw_data/results/file_dataviz.csv
rename to source/callback-study/results/raw_data/results/file_dataviz.csv
diff --git a/callback-study/results/raw_data/results/file_engines.csv b/source/callback-study/results/raw_data/results/file_engines.csv
similarity index 100%
rename from callback-study/results/raw_data/results/file_engines.csv
rename to source/callback-study/results/raw_data/results/file_engines.csv
diff --git a/callback-study/results/raw_data/results/file_frameworks.csv b/source/callback-study/results/raw_data/results/file_frameworks.csv
similarity index 100%
rename from callback-study/results/raw_data/results/file_frameworks.csv
rename to source/callback-study/results/raw_data/results/file_frameworks.csv
diff --git a/callback-study/results/raw_data/results/file_games.csv b/source/callback-study/results/raw_data/results/file_games.csv
similarity index 100%
rename from callback-study/results/raw_data/results/file_games.csv
rename to source/callback-study/results/raw_data/results/file_games.csv
diff --git a/callback-study/results/raw_data/results/file_hybrid.csv b/source/callback-study/results/raw_data/results/file_hybrid.csv
similarity index 100%
rename from callback-study/results/raw_data/results/file_hybrid.csv
rename to source/callback-study/results/raw_data/results/file_hybrid.csv
diff --git a/callback-study/results/raw_data/results/file_npm.csv b/source/callback-study/results/raw_data/results/file_npm.csv
similarity index 100%
rename from callback-study/results/raw_data/results/file_npm.csv
rename to source/callback-study/results/raw_data/results/file_npm.csv
diff --git a/callback-study/results/raw_data/results/hybrid_dep.csv b/source/callback-study/results/raw_data/results/hybrid_dep.csv
similarity index 100%
rename from callback-study/results/raw_data/results/hybrid_dep.csv
rename to source/callback-study/results/raw_data/results/hybrid_dep.csv
diff --git a/callback-study/results/raw_data/results/npm_dep.csv b/source/callback-study/results/raw_data/results/npm_dep.csv
similarity index 100%
rename from callback-study/results/raw_data/results/npm_dep.csv
rename to source/callback-study/results/raw_data/results/npm_dep.csv
diff --git a/callback-study/results/raw_data/results/pkg_dataviz.csv b/source/callback-study/results/raw_data/results/pkg_dataviz.csv
similarity index 100%
rename from callback-study/results/raw_data/results/pkg_dataviz.csv
rename to source/callback-study/results/raw_data/results/pkg_dataviz.csv
diff --git a/callback-study/results/raw_data/results/pkg_engines.csv b/source/callback-study/results/raw_data/results/pkg_engines.csv
similarity index 100%
rename from callback-study/results/raw_data/results/pkg_engines.csv
rename to source/callback-study/results/raw_data/results/pkg_engines.csv
diff --git a/callback-study/results/raw_data/results/pkg_frameworks.csv b/source/callback-study/results/raw_data/results/pkg_frameworks.csv
similarity index 100%
rename from callback-study/results/raw_data/results/pkg_frameworks.csv
rename to source/callback-study/results/raw_data/results/pkg_frameworks.csv
diff --git a/callback-study/results/raw_data/results/pkg_games.csv b/source/callback-study/results/raw_data/results/pkg_games.csv
similarity index 100%
rename from callback-study/results/raw_data/results/pkg_games.csv
rename to source/callback-study/results/raw_data/results/pkg_games.csv
diff --git a/callback-study/results/raw_data/results/pkg_hybrid.csv b/source/callback-study/results/raw_data/results/pkg_hybrid.csv
similarity index 100%
rename from callback-study/results/raw_data/results/pkg_hybrid.csv
rename to source/callback-study/results/raw_data/results/pkg_hybrid.csv
diff --git a/callback-study/results/raw_data/results/pkg_npm.csv b/source/callback-study/results/raw_data/results/pkg_npm.csv
similarity index 100%
rename from callback-study/results/raw_data/results/pkg_npm.csv
rename to source/callback-study/results/raw_data/results/pkg_npm.csv
diff --git a/callback-study/results/raw_data/results/promises-all.csv b/source/callback-study/results/raw_data/results/promises-all.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises-all.csv
rename to source/callback-study/results/raw_data/results/promises-all.csv
diff --git a/callback-study/results/raw_data/results/promises_c.csv b/source/callback-study/results/raw_data/results/promises_c.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_c.csv
rename to source/callback-study/results/raw_data/results/promises_c.csv
diff --git a/callback-study/results/raw_data/results/promises_d.csv b/source/callback-study/results/raw_data/results/promises_d.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_d.csv
rename to source/callback-study/results/raw_data/results/promises_d.csv
diff --git a/callback-study/results/raw_data/results/promises_e.csv b/source/callback-study/results/raw_data/results/promises_e.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_e.csv
rename to source/callback-study/results/raw_data/results/promises_e.csv
diff --git a/callback-study/results/raw_data/results/promises_f.csv b/source/callback-study/results/raw_data/results/promises_f.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_f.csv
rename to source/callback-study/results/raw_data/results/promises_f.csv
diff --git a/callback-study/results/raw_data/results/promises_g.csv b/source/callback-study/results/raw_data/results/promises_g.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_g.csv
rename to source/callback-study/results/raw_data/results/promises_g.csv
diff --git a/callback-study/results/raw_data/results/promises_h.csv b/source/callback-study/results/raw_data/results/promises_h.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_h.csv
rename to source/callback-study/results/raw_data/results/promises_h.csv
diff --git a/callback-study/results/raw_data/results/promises_n.csv b/source/callback-study/results/raw_data/results/promises_n.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_n.csv
rename to source/callback-study/results/raw_data/results/promises_n.csv
diff --git a/callback-study/results/raw_data/results/promises_n_noout.csv b/source/callback-study/results/raw_data/results/promises_n_noout.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_n_noout.csv
rename to source/callback-study/results/raw_data/results/promises_n_noout.csv
diff --git a/callback-study/results/raw_data/results/promises_total.csv b/source/callback-study/results/raw_data/results/promises_total.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_total.csv
rename to source/callback-study/results/raw_data/results/promises_total.csv
diff --git a/callback-study/results/raw_data/results/promises_total_noout.csv b/source/callback-study/results/raw_data/results/promises_total_noout.csv
similarity index 100%
rename from callback-study/results/raw_data/results/promises_total_noout.csv
rename to source/callback-study/results/raw_data/results/promises_total_noout.csv
diff --git a/source/content/cilla/index.markdown b/source/content/cilla/index.markdown
new file mode 100644
index 00000000..68aa258b
--- /dev/null
+++ b/source/content/cilla/index.markdown
@@ -0,0 +1,25 @@
+---
+layout: page
+title: "Cilla"
+date: 2012-10-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+The empirical data for all the fifteen experimental objects produced by Cilla including:
+
+
+ The CSS analysis data
+
+ The DOM state exploration data
+
+ The (20%) randomly selected CSS rules for assessment
+
+ Download (zip)
+
+
+ The tool implementation of Cilla is available here .
+
+ Paper: Automated Analysis of CSS Rules to Support Style Maintenance , ICSE 2012.
diff --git a/source/content/feedex/index.markdown b/source/content/feedex/index.markdown
new file mode 100644
index 00000000..59b6968b
--- /dev/null
+++ b/source/content/feedex/index.markdown
@@ -0,0 +1,17 @@
+---
+layout: page
+title: "feedex"
+date: 2013-02-20 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+
+
+
\ No newline at end of file
diff --git a/source/content/javis/index.markdown b/source/content/javis/index.markdown
new file mode 100644
index 00000000..9a128b12
--- /dev/null
+++ b/source/content/javis/index.markdown
@@ -0,0 +1,16 @@
+---
+layout: page
+title: "javis"
+date: 2012-10-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+ Javis: Client-side Hidden-web Analyzer
+
+ Our empirical data set can be downloaded from this link .
+ Tool Implementation: Javis
+Paper: Zahra Behfarshad and Ali Mesbah (2013). Hidden-Web Induced by Client-Side Scripting: An Empirical Study . In Proceedings of the International Conference on Web Engineering (ICWE’13). 15 pages. Springer.
+
diff --git a/source/content/jsart/index.markdown b/source/content/jsart/index.markdown
new file mode 100644
index 00000000..2efb6ac9
--- /dev/null
+++ b/source/content/jsart/index.markdown
@@ -0,0 +1,21 @@
+---
+layout: page
+title: "JSart"
+date: 2012-10-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+ Click here to download the experimental data and the tool.
+
+ The experimental data includes the following items:
+
+
+ Execution traces produced by JSART
+
+ Invariants collected by JSART
+
+ Injected faults
+
diff --git a/source/content/jsnose/index.markdown b/source/content/jsnose/index.markdown
new file mode 100644
index 00000000..755ed4ea
--- /dev/null
+++ b/source/content/jsnose/index.markdown
@@ -0,0 +1,11 @@
+---
+layout: page
+title: "JSNose"
+date: 2013-05-09 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+ Our JavaScript smell code detector (JSNose) and experimental data are available on this page .
diff --git a/source/favicon.png b/source/favicon.png
new file mode 100644
index 00000000..0f250673
Binary files /dev/null and b/source/favicon.png differ
diff --git a/source/images/bird_32_gray.png b/source/images/bird_32_gray.png
new file mode 100644
index 00000000..574f210a
Binary files /dev/null and b/source/images/bird_32_gray.png differ
diff --git a/source/images/bird_32_gray_fail.png b/source/images/bird_32_gray_fail.png
new file mode 100644
index 00000000..8337d103
Binary files /dev/null and b/source/images/bird_32_gray_fail.png differ
diff --git a/source/images/clematis.png b/source/images/clematis.png
new file mode 100644
index 00000000..4eb55a99
Binary files /dev/null and b/source/images/clematis.png differ
diff --git a/source/images/code_bg.png b/source/images/code_bg.png
new file mode 100644
index 00000000..a57bab56
Binary files /dev/null and b/source/images/code_bg.png differ
diff --git a/source/images/dotted-border.png b/source/images/dotted-border.png
new file mode 100644
index 00000000..57f99071
Binary files /dev/null and b/source/images/dotted-border.png differ
diff --git a/source/images/email.png b/source/images/email.png
new file mode 100644
index 00000000..e55473fe
Binary files /dev/null and b/source/images/email.png differ
diff --git a/source/images/esem15-award.jpg b/source/images/esem15-award.jpg
new file mode 100644
index 00000000..63d3be62
Binary files /dev/null and b/source/images/esem15-award.jpg differ
diff --git a/source/images/header_bg.png b/source/images/header_bg.png
new file mode 100644
index 00000000..fb63f122
Binary files /dev/null and b/source/images/header_bg.png differ
diff --git a/source/images/icse14award.png b/source/images/icse14award.png
new file mode 100644
index 00000000..eeebee4f
Binary files /dev/null and b/source/images/icse14award.png differ
diff --git a/source/images/icse14award2.JPG b/source/images/icse14award2.JPG
new file mode 100644
index 00000000..0fafbc34
Binary files /dev/null and b/source/images/icse14award2.JPG differ
diff --git a/source/images/icse14award3.JPG b/source/images/icse14award3.JPG
new file mode 100644
index 00000000..80cfcae4
Binary files /dev/null and b/source/images/icse14award3.JPG differ
diff --git a/source/images/line-tile.png b/source/images/line-tile.png
new file mode 100644
index 00000000..f67ee19f
Binary files /dev/null and b/source/images/line-tile.png differ
diff --git a/source/images/noise.png b/source/images/noise.png
new file mode 100644
index 00000000..432e05bf
Binary files /dev/null and b/source/images/noise.png differ
diff --git a/source/images/rss.png b/source/images/rss.png
new file mode 100644
index 00000000..151ae718
Binary files /dev/null and b/source/images/rss.png differ
diff --git a/source/images/s3g.jpg b/source/images/s3g.jpg
new file mode 100644
index 00000000..3c702a93
Binary files /dev/null and b/source/images/s3g.jpg differ
diff --git a/source/images/s4r.png b/source/images/s4r.png
new file mode 100644
index 00000000..cab3e27b
Binary files /dev/null and b/source/images/s4r.png differ
diff --git a/source/images/salt-logo.png b/source/images/salt-logo.png
new file mode 100644
index 00000000..0391ec5a
Binary files /dev/null and b/source/images/salt-logo.png differ
diff --git a/source/images/search.png b/source/images/search.png
new file mode 100644
index 00000000..1220ff4e
Binary files /dev/null and b/source/images/search.png differ
diff --git a/source/images/ubc-logo-white.png b/source/images/ubc-logo-white.png
new file mode 100644
index 00000000..cab3e27b
Binary files /dev/null and b/source/images/ubc-logo-white.png differ
diff --git a/source/images/ubcblack_basic.png b/source/images/ubcblack_basic.png
new file mode 100644
index 00000000..ed96f42b
Binary files /dev/null and b/source/images/ubcblack_basic.png differ
diff --git a/source/index.html b/source/index.html
new file mode 100644
index 00000000..64b665e4
--- /dev/null
+++ b/source/index.html
@@ -0,0 +1,29 @@
+---
+layout: default
+---
+
+
+ {% assign index = true %}
+ {% for post in paginator.posts %}
+ {% assign content = post.content %}
+
+ {% include article.html %}
+
+ {% endfor %}
+
+
+
diff --git a/source/javascripts/ender.js b/source/javascripts/ender.js
new file mode 100644
index 00000000..1add349c
--- /dev/null
+++ b/source/javascripts/ender.js
@@ -0,0 +1,45 @@
+/*!
+ * =============================================================
+ * Ender: open module JavaScript framework (https://ender.no.de)
+ * Build: ender build jeesh reqwest
+ * =============================================================
+ */
+
+
+/*!
+ * Ender: open module JavaScript framework (client-lib)
+ * copyright Dustin Diaz & Jacob Thornton 2011 (@ded @fat)
+ * http://ender.no.de
+ * License MIT
+ */
+!function(a){function d(a){var c=b[a]||window[a];if(!c)throw new Error("Requested module '"+a+"' has not been defined.");return c}function e(a,c){return b[a]=c}function f(a,b){for(var c in b)c!="noConflict"&&c!="_VERSION"&&(a[c]=b[c]);return a}function g(a,b,c){return h._select&&(typeof a=="string"||a.nodeName||a.length&&"item"in a||a==window)?(c=h._select(a,b),c.selector=a):c=isFinite(a.length)?a:[a],f(c,g)}function h(a,b){return g(a,b)}a.global=a;var b={},c=a.$;a.provide=e,a.require=d,f(h,{_VERSION:"0.3.4",fn:a.$&&a.$.fn||{},ender:function(a,b){f(b?g:h,a)},_select:function(a,b){return(b||document).querySelectorAll(a)}}),f(g,{forEach:function(a,b,c){for(c=0,l=this.length;c0?this:[]).concat(Array.prototype.slice.call(arguments,0));return b[a].apply(null,c)}},d=c("serialize"),e=c("serializeArray");a.ender({ajax:b,serialize:d,serializeArray:e,toQueryString:b.toQueryString}),a.ender({serialize:d,serializeArray:e},!0)}(ender)}(),!function(){var a={exports:{}},b=a.exports;
+/*!
+ * bean.js - copyright Jacob Thornton 2011
+ * https://github.com/fat/bean
+ * MIT License
+ * special thanks to:
+ * dean edwards: http://dean.edwards.name/
+ * dperini: https://github.com/dperini/nwevents
+ * the entire mootools team: github.com/mootools/mootools-core
+ */
+!function(b,c){typeof define=="function"?define(c):typeof a!="undefined"?a.exports=c():this[b]=c()}("bean",function(){function F(a){var b=a.relatedTarget;return b?b!=this&&b.prefix!="xul"&&!/document/.test(this.toString())&&!p(this,b):b===null}var a=window,b=1,c={},d={},e=/over|out/,f=/[^\.]*(?=\..*)\.|.*/,g=/\..*/,h="addEventListener",i="attachEvent",j="removeEventListener",k="detachEvent",l=document||{},m=l.documentElement||{},n=m[h],o=n?h:i,p=function(a,b){var c=b.parentNode;while(c!==null){if(c==a)return!0;c=c.parentNode}},q=function(a,c){return a.__uid=c&&c+"::"+b++||a.__uid||b++},r=function(a){var b=q(a);return c[b]=c[b]||{}},s=n?function(a,b,c,d){a[d?h:j](b,c,!1)}:function(a,b,c,d,e){e&&d&&a["_on"+e]===null&&(a["_on"+e]=0),a[d?i:k]("on"+b,c)},t=function(b,c,d){return function(e){return e=D(e||((this.ownerDocument||this.document||this).parentWindow||a).event),c.apply(b,[e].concat(d))}},u=function(b,c,d,e,f){return function(g){if(e?e.apply(this,arguments):n?!0:g&&g.propertyName=="_on"+d||!g)g=g?D(g||((this.ownerDocument||this.document||this).parentWindow||a).event):null,c.apply(b,Array.prototype.slice.call(arguments,g?0:1).concat(f))}},v=function(a,b,c,e){var h=b.replace(g,""),i=r(a),j=i[h]||(i[h]={}),k=c,l=q(c,b.replace(f,""));if(j[l])return a;var m=G[h];m&&(c=m.condition?u(a,c,h,m.condition):c,h=m.base||h);var p=E[h];c=p?t(a,c,e):u(a,c,h,!1,e),p=n||p;if(h=="unload"){var v=c;c=function(){w(a,h,c)&&v()}}return a[o]&&s(a,p?h:"propertychange",c,!0,!p&&h),j[l]=c,c.__uid=l,c.__originalFn=k,h=="unload"?a:d[q(a)]=a},w=function(a,b,c){function l(b){c=j[k][b];if(!c)return;delete j[k][b];if(a[o]){k=G[k]?G[k].base:k;var d=n||E[k];s(a,d?k:"propertychange",c,!1,!d&&k)}}var d,e,h,i,j=r(a),k=b.replace(g,"");if(!j||!j[k])return a;e=b.replace(f,""),h=e?e.split("."):[c.__uid],l(e);for(i=h.length;i--;l(h[i]));return a},x=function(a,b,c){return function(d){var e=typeof a=="string"?c(a,this):a;for(var f=d.target;f&&f!=this;f=f.parentNode)for(var g=e.length;g--;)if(e[g]==f)return b.apply(f,arguments)}},y=function(a,b,c,d,e){if(typeof b=="object"&&!c)for(var f in b)b.hasOwnProperty(f)&&y(a,f,b[f]);else{var g=typeof c=="string",h=(g?c:b).split(" ");c=g?x(b,d,e):c;for(var i=h.length;i--;)v(a,h[i],c,Array.prototype.slice.call(arguments,g?4:3))}return a},z=function(a,b,c){var d,e,h,i,j,k=typeof b=="string",l=k&&b.replace(f,""),m=w,n=r(a);l=l&&l.split(".");if(k&&/\s/.test(b)){b=b.split(" "),j=b.length-1;while(z(a,b[j])&&j--);return a}i=k?b.replace(g,""):b;if(!n||l||k&&!n[i]){for(d in n)if(n.hasOwnProperty(d))for(j in n[d])for(e=l.length;e--;)n[d].hasOwnProperty(j)&&(new RegExp("^"+l[e]+"::\\d*(\\..*)?$")).test(j)&&m(a,[d,j].join("."));return a}if(typeof c=="function")m(a,i,c);else if(l)m(a,b);else{m=i?m:z,h=k&&i,i=i?c||n[i]||i:n;for(d in i)i.hasOwnProperty(d)&&(m(a,h||d,i[d]),delete i[d])}return a},A=function(a,b,c){var d,e,h,i,j=b.split(" ");for(h=j.length;h--;){b=j[h].replace(g,"");var k=E[b],l=j[h].replace(f,""),m=r(a)[b];if(l){l=l.split(".");for(e=l.length;e--;)for(i in m)m.hasOwnProperty(i)&&(new RegExp("^"+l[e]+"::\\d*(\\..*)?$")).test(i)&&m[i].apply(a,[!1].concat(c))}else if(!c&&a[o])B(k,b,a);else for(e in m)m.hasOwnProperty(e)&&m[e].apply(a,[!1].concat(c))}return a},B=n?function(b,c,d){evt=document.createEvent(b?"HTMLEvents":"UIEvents"),evt[b?"initEvent":"initUIEvent"](c,!0,!0,a,1),d.dispatchEvent(evt)}:function(a,b,c){a?c.fireEvent("on"+b,document.createEventObject()):c["_on"+b]++},C=function(a,b,c){var d=r(b),e,f,g=q(a);e=c?d[c]:d;for(f in e)e.hasOwnProperty(f)&&(c?y:C)(a,c||b,c?e[f].__originalFn:f);return a},D=function(a){var b={};if(!a)return b;var c=a.type,d=a.target||a.srcElement;b.preventDefault=D.preventDefault(a),b.stopPropagation=D.stopPropagation(a),b.target=d&&d.nodeType==3?d.parentNode:d;if(~c.indexOf("key"))b.keyCode=a.which||a.keyCode;else if(/click|mouse|menu/i.test(c)){b.rightClick=a.which==3||a.button==2,b.pos={x:0,y:0};if(a.pageX||a.pageY)b.clientX=a.pageX,b.clientY=a.pageY;else if(a.clientX||a.clientY)b.clientX=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,b.clientY=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;e.test(c)&&(b.relatedTarget=a.relatedTarget||a[(c=="mouseover"?"from":"to")+"Element"])}for(var f in a)f in b||(b[f]=a[f]);return b};D.preventDefault=function(a){return function(){a.preventDefault?a.preventDefault():a.returnValue=!1}},D.stopPropagation=function(a){return function(){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}};var E={click:1,dblclick:1,mouseup:1,mousedown:1,contextmenu:1,mousewheel:1,DOMMouseScroll:1,mouseover:1,mouseout:1,mousemove:1,selectstart:1,selectend:1,keydown:1,keypress:1,keyup:1,orientationchange:1,touchstart:1,touchmove:1,touchend:1,touchcancel:1,gesturestart:1,gesturechange:1,gestureend:1,focus:1,blur:1,change:1,reset:1,select:1,submit:1,load:1,unload:1,beforeunload:1,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1},G={mouseenter:{base:"mouseover",condition:F},mouseleave:{base:"mouseout",condition:F},mousewheel:{base:/Firefox/.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel"}},H={add:y,remove:z,clone:C,fire:A},I=function(a){var b=z(a).__uid;b&&(delete d[b],delete c[b])};return a[i]&&y(a,"unload",function(){for(var b in d)d.hasOwnProperty(b)&&I(d[b]);a.CollectGarbage&&CollectGarbage()}),H.noConflict=function(){return context.bean=old,this},H}),provide("bean",a.exports),!function(a){var b=require("bean"),c=function(c,d,e){var f=d?[d]:[];return function(){for(var e,g=0,h=this.length;g]+)/.exec(a),d=c.createElement(b&&k[b[1].toLowerCase()]||"div"),e=[];d.innerHTML=a;var f=d.childNodes;d=d.firstChild,e.push(d);while(d=d.nextSibling)d.nodeType==1&&e.push(d);return e}():A(a)?[a.cloneNode(!0)]:[]},N.doc=function(){var a=this.viewport();return{width:Math.max(c.body.scrollWidth,d.scrollWidth,a.width),height:Math.max(c.body.scrollHeight,d.scrollHeight,a.height)}},N.firstChild=function(a){for(var b=a.childNodes,c=0,d=b&&b.length||0,e;c])\s*/g,C=/[\s\>\+\~]/,D=/(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\]|[\s\w\+\-]*\))/,E=/([.*+?\^=!:${}()|\[\]\/\\])/g,F=/^([a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/,G=/\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/,H=/:([\w\-]+)(\(['"]?([\s\w\+\-]+)['"]?\))?/,I=new RegExp("("+C.source+")"+D.source,"g"),J=new RegExp(C.source+D.source),K=new RegExp(F.source+"("+G.source+")?"+"("+H.source+")?"),L={" ":function(a){return a&&a!==u&&a.parentNode},">":function(a,b){return a&&a.parentNode==b.parentNode&&a.parentNode},"~":function(a){return a&&a.previousSibling},"+":function(a,b,c,d){return a?(c=S(a),d=S(b),c&&d&&c==d&&c):!1}};M.prototype={g:function(a){return this.c[a]||undefined},s:function(a,b){return this.c[a]=b,b}};var N=new M,O=new M,P=new M,Q=new M,bb="compareDocumentPosition"in u?function(a,b){return(b.compareDocumentPosition(a)&16)==16}:"contains"in u?function(a,c){return c=c==b||c==window?u:c,c!==a&&c.contains(a)}:function(a,b){while(a=a.parentNode)if(a===b)return 1;return 0},bc=function(){if(!b.querySelector||!b.querySelectorAll)return!1;try{return b.querySelectorAll(":nth-of-type(1)").length}catch(a){return!1}}(),bd=bc?function(a,c){return b.getElementsByClassName&&(i=a.match(y))?R(c.getElementsByClassName(i[1])):R(c.querySelectorAll(a))}:function(a,c){a=a.replace(B,"$1");var d=[],e,g,j=[],k;if(i=a.match(A)){s=c.getElementsByTagName(i[1]||"*"),l=N.g(i[2])||N.s(i[2],new RegExp("(^|\\s+)"+i[2]+"(\\s+|$)"));for(k=0,h=s.length,f=0;k]+)\s*/.exec(b)[1],f=(c||a).createElement(e[d]||"div"),g=[];f.innerHTML=b;var h=f.childNodes;f=f.firstChild,f.nodeType==1&&g.push(f);while(f=f.nextSibling)f.nodeType==1&&g.push(f);return g}var c=require("qwery"),d="table",e={thead:d,tbody:d,tfoot:d,tr:"tbody",th:"tr",td:"tr",fieldset:"form",option:"select"};b._select=function(a,b){return/^\s*').text(str).html();
+ }
+ function render(target, repos){
+ var i = 0, fragment = '', t = $(target)[0];
+
+ for(i = 0; i < repos.length; i++) {
+ fragment += ''+repos[i].name+' '+escapeHtml(repos[i].description||'')+'
';
+ }
+ t.innerHTML = fragment;
+ }
+ return {
+ showRepos: function(options){
+ $.ajax({
+ url: "https://api.github.com/users/"+options.user+"/repos?sort=pushed&callback=?"
+ , dataType: 'jsonp'
+ , error: function (err) { $(options.target + ' li.loading').addClass('error').text("Error loading feed"); }
+ , success: function(data) {
+ var repos = [];
+ if (!data || !data.data) { return; }
+ for (var i = 0; i < data.data.length; i++) {
+ if (options.skip_forks && data.data[i].fork) { continue; }
+ repos.push(data.data[i]);
+ }
+ if (options.count) { repos.splice(options.count); }
+ render(options.target, repos);
+ }
+ });
+ }
+ };
+})();
diff --git a/source/javascripts/libs/ender.js b/source/javascripts/libs/ender.js
new file mode 100644
index 00000000..5e56fd89
--- /dev/null
+++ b/source/javascripts/libs/ender.js
@@ -0,0 +1,1497 @@
+/*!
+ * Ender: open module JavaScript framework
+ * copyright Dustin Diaz & Jacob Thornton 2011 (@ded @fat)
+ * https://ender.no.de
+ * License MIT
+ * Build: ender -b jeesh
+ */
+!function (context) {
+
+ function aug(o, o2) {
+ for (var k in o2) {
+ k != 'noConflict' && k != '_VERSION' && (o[k] = o2[k]);
+ }
+ return o;
+ }
+
+ function boosh(s, r) {
+ var els;
+ if (ender._select && typeof s == 'string' || s.nodeName || s.length && 'item' in s || s == window) { //string || node || nodelist || window
+ els = ender._select(s, r);
+ els.selector = s;
+ } else {
+ els = isFinite(s.length) ? s : [s];
+ }
+ return aug(els, boosh);
+ }
+
+ function ender(s, r) {
+ return boosh(s, r);
+ }
+
+ aug(ender, {
+ _VERSION: '0.2.0',
+ ender: function (o, chain) {
+ aug(chain ? boosh : ender, o);
+ }
+ });
+
+ aug(boosh, {
+ forEach: function (fn, scope) {
+ // opt out of native forEach so we can intentionally call our own scope
+ // defaulting to the current item
+ for (var i = 0, l = this.length; i < l; ++i) {
+ i in this && fn.call(scope || this[i], this[i], i, this);
+ }
+ // return self for chaining
+ return this;
+ }
+ });
+
+ var old = context.$;
+ ender.noConflict = function () {
+ context.$ = old;
+ return this;
+ };
+
+ (typeof module !== 'undefined') && module.exports && (module.exports = ender);
+ // use subscript notation as extern for Closure compilation
+ context['ender'] = context['$'] = ender;
+
+}(this);
+/*!
+ * bean.js - copyright Jacob Thornton 2011
+ * https://github.com/fat/bean
+ * MIT License
+ * special thanks to:
+ * dean edwards: http://dean.edwards.name/
+ * dperini: https://github.com/dperini/nwevents
+ * the entire mootools team: github.com/mootools/mootools-core
+ */
+!function (context) {
+ var __uid = 1, registry = {}, collected = {},
+ overOut = /over|out/,
+ namespace = /[^\.]*(?=\..*)\.|.*/,
+ stripName = /\..*/,
+ addEvent = 'addEventListener',
+ attachEvent = 'attachEvent',
+ removeEvent = 'removeEventListener',
+ detachEvent = 'detachEvent',
+ doc = context.document || {},
+ root = doc.documentElement || {},
+ W3C_MODEL = root[addEvent],
+ eventSupport = W3C_MODEL ? addEvent : attachEvent,
+
+ isDescendant = function (parent, child) {
+ var node = child.parentNode;
+ while (node != null) {
+ if (node == parent) {
+ return true;
+ }
+ node = node.parentNode;
+ }
+ },
+
+ retrieveUid = function (obj, uid) {
+ return (obj.__uid = uid || obj.__uid || __uid++);
+ },
+
+ retrieveEvents = function (element) {
+ var uid = retrieveUid(element);
+ return (registry[uid] = registry[uid] || {});
+ },
+
+ listener = W3C_MODEL ? function (element, type, fn, add) {
+ element[add ? addEvent : removeEvent](type, fn, false);
+ } : function (element, type, fn, add, custom) {
+ custom && add && (element['_on' + custom] = element['_on' + custom] || 0);
+ element[add ? attachEvent : detachEvent]('on' + type, fn);
+ },
+
+ nativeHandler = function (element, fn, args) {
+ return function (event) {
+ event = fixEvent(event || ((this.ownerDocument || this.document || this).parentWindow || context).event);
+ return fn.apply(element, [event].concat(args));
+ };
+ },
+
+ customHandler = function (element, fn, type, condition, args) {
+ return function (event) {
+ if (condition ? condition.call(this, event) : W3C_MODEL ? true : event && event.propertyName == '_on' + type || !event) {
+ fn.apply(element, [event].concat(args));
+ }
+ };
+ },
+
+ addListener = function (element, orgType, fn, args) {
+ var type = orgType.replace(stripName, ''),
+ events = retrieveEvents(element),
+ handlers = events[type] || (events[type] = {}),
+ uid = retrieveUid(fn, orgType.replace(namespace, ''));
+ if (handlers[uid]) {
+ return element;
+ }
+ var custom = customEvents[type];
+ if (custom) {
+ fn = custom.condition ? customHandler(element, fn, type, custom.condition) : fn;
+ type = custom.base || type;
+ }
+ var isNative = nativeEvents[type];
+ fn = isNative ? nativeHandler(element, fn, args) : customHandler(element, fn, type, false, args);
+ isNative = W3C_MODEL || isNative;
+ if (type == 'unload') {
+ var org = fn;
+ fn = function () {
+ removeListener(element, type, fn) && org();
+ };
+ }
+ element[eventSupport] && listener(element, isNative ? type : 'propertychange', fn, true, !isNative && type);
+ handlers[uid] = fn;
+ fn.__uid = uid;
+ return type == 'unload' ? element : (collected[retrieveUid(element)] = element);
+ },
+
+ removeListener = function (element, orgType, handler) {
+ var uid, names, uids, i, events = retrieveEvents(element), type = orgType.replace(stripName, '');
+ if (!events || !events[type]) {
+ return element;
+ }
+ names = orgType.replace(namespace, '');
+ uids = names ? names.split('.') : [handler.__uid];
+ for (i = uids.length; i--;) {
+ uid = uids[i];
+ handler = events[type][uid];
+ delete events[type][uid];
+ if (element[eventSupport]) {
+ type = customEvents[type] ? customEvents[type].base : type;
+ var isNative = W3C_MODEL || nativeEvents[type];
+ listener(element, isNative ? type : 'propertychange', handler, false, !isNative && type);
+ }
+ }
+ return element;
+ },
+
+ del = function (selector, fn, $) {
+ return function (e) {
+ var array = typeof selector == 'string' ? $(selector, this) : selector;
+ for (var target = e.target; target && target != this; target = target.parentNode) {
+ for (var i = array.length; i--;) {
+ if (array[i] == target) {
+ return fn.apply(target, arguments);
+ }
+ }
+ }
+ };
+ },
+
+ add = function (element, events, fn, delfn, $) {
+ if (typeof events == 'object' && !fn) {
+ for (var type in events) {
+ events.hasOwnProperty(type) && add(element, type, events[type]);
+ }
+ } else {
+ var isDel = typeof fn == 'string', types = (isDel ? fn : events).split(' ');
+ fn = isDel ? del(events, delfn, $) : fn;
+ for (var i = types.length; i--;) {
+ addListener(element, types[i], fn, Array.prototype.slice.call(arguments, isDel ? 4 : 3));
+ }
+ }
+ return element;
+ },
+
+ remove = function (element, orgEvents, fn) {
+ var k, type, events,
+ isString = typeof(orgEvents) == 'string',
+ names = isString && orgEvents.replace(namespace, ''),
+ rm = removeListener,
+ attached = retrieveEvents(element);
+ if (isString && /\s/.test(orgEvents)) {
+ orgEvents = orgEvents.split(' ');
+ var i = orgEvents.length - 1;
+ while (remove(element, orgEvents[i]) && i--) {}
+ return element;
+ }
+ events = isString ? orgEvents.replace(stripName, '') : orgEvents;
+ if (!attached || (isString && !attached[events])) {
+ return element;
+ }
+ if (typeof fn == 'function') {
+ rm(element, events, fn);
+ } else if (names) {
+ rm(element, orgEvents);
+ } else {
+ rm = events ? rm : remove;
+ type = isString && events;
+ events = events ? (fn || attached[events] || events) : attached;
+ for (k in events) {
+ events.hasOwnProperty(k) && rm(element, type || k, events[k]);
+ }
+ }
+ return element;
+ },
+
+ fire = function (element, type, args) {
+ var evt, k, i, types = type.split(' ');
+ for (i = types.length; i--;) {
+ type = types[i].replace(stripName, '');
+ var isNative = nativeEvents[type],
+ isNamespace = types[i].replace(namespace, ''),
+ handlers = retrieveEvents(element)[type];
+ if (isNamespace) {
+ isNamespace = isNamespace.split('.');
+ for (k = isNamespace.length; k--;) {
+ handlers[isNamespace[k]] && handlers[isNamespace[k]].apply(element, args);
+ }
+ } else if (!args && element[eventSupport]) {
+ fireListener(isNative, type, element);
+ } else {
+ for (k in handlers) {
+ handlers.hasOwnProperty(k) && handlers[k].apply(element, args);
+ }
+ }
+ }
+ return element;
+ },
+
+ fireListener = W3C_MODEL ? function (isNative, type, element) {
+ evt = document.createEvent(isNative ? "HTMLEvents" : "UIEvents");
+ evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, context, 1);
+ element.dispatchEvent(evt);
+ } : function (isNative, type, element) {
+ isNative ? element.fireEvent('on' + type, document.createEventObject()) : element['_on' + type]++;
+ },
+
+ clone = function (element, from, type) {
+ var events = retrieveEvents(from), obj, k;
+ obj = type ? events[type] : events;
+ for (k in obj) {
+ obj.hasOwnProperty(k) && (type ? add : clone)(element, type || from, type ? obj[k] : k);
+ }
+ return element;
+ },
+
+ fixEvent = function (e) {
+ var result = {};
+ if (!e) {
+ return result;
+ }
+ var type = e.type, target = e.target || e.srcElement;
+ result.preventDefault = fixEvent.preventDefault(e);
+ result.stopPropagation = fixEvent.stopPropagation(e);
+ result.target = target && target.nodeType == 3 ? target.parentNode : target;
+ if (~type.indexOf('key')) {
+ result.keyCode = e.which || e.keyCode;
+ } else if ((/click|mouse|menu/i).test(type)) {
+ result.rightClick = e.which == 3 || e.button == 2;
+ result.pos = { x: 0, y: 0 };
+ if (e.pageX || e.pageY) {
+ result.clientX = e.pageX;
+ result.clientY = e.pageY;
+ } else if (e.clientX || e.clientY) {
+ result.clientX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
+ result.clientY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
+ }
+ overOut.test(type) && (result.relatedTarget = e.relatedTarget || e[(type == 'mouseover' ? 'from' : 'to') + 'Element']);
+ }
+ for (var k in e) {
+ if (!(k in result)) {
+ result[k] = e[k];
+ }
+ }
+ return result;
+ };
+
+ fixEvent.preventDefault = function (e) {
+ return function () {
+ if (e.preventDefault) {
+ e.preventDefault();
+ }
+ else {
+ e.returnValue = false;
+ }
+ };
+ };
+
+ fixEvent.stopPropagation = function (e) {
+ return function () {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ } else {
+ e.cancelBubble = true;
+ }
+ };
+ };
+
+ var nativeEvents = { click: 1, dblclick: 1, mouseup: 1, mousedown: 1, contextmenu: 1, //mouse buttons
+ mousewheel: 1, DOMMouseScroll: 1, //mouse wheel
+ mouseover: 1, mouseout: 1, mousemove: 1, selectstart: 1, selectend: 1, //mouse movement
+ keydown: 1, keypress: 1, keyup: 1, //keyboard
+ orientationchange: 1, // mobile
+ touchstart: 1, touchmove: 1, touchend: 1, touchcancel: 1, // touch
+ gesturestart: 1, gesturechange: 1, gestureend: 1, // gesture
+ focus: 1, blur: 1, change: 1, reset: 1, select: 1, submit: 1, //form elements
+ load: 1, unload: 1, beforeunload: 1, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
+ error: 1, abort: 1, scroll: 1 }; //misc
+
+ function check(event) {
+ var related = event.relatedTarget;
+ if (!related) {
+ return related == null;
+ }
+ return (related != this && related.prefix != 'xul' && !/document/.test(this.toString()) && !isDescendant(this, related));
+ }
+
+ var customEvents = {
+ mouseenter: { base: 'mouseover', condition: check },
+ mouseleave: { base: 'mouseout', condition: check },
+ mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }
+ };
+
+ var bean = { add: add, remove: remove, clone: clone, fire: fire };
+
+ var clean = function (el) {
+ var uid = remove(el).__uid;
+ if (uid) {
+ delete collected[uid];
+ delete registry[uid];
+ }
+ };
+
+ if (context[attachEvent]) {
+ add(context, 'unload', function () {
+ for (var k in collected) {
+ collected.hasOwnProperty(k) && clean(collected[k]);
+ }
+ context.CollectGarbage && CollectGarbage();
+ });
+ }
+
+ var oldBean = context.bean;
+ bean.noConflict = function () {
+ context.bean = oldBean;
+ return this;
+ };
+
+ (typeof module !== 'undefined' && module.exports) ?
+ (module.exports = bean) :
+ (context['bean'] = bean);
+
+}(this);!function ($) {
+ var b = bean.noConflict(),
+ integrate = function (method, type, method2) {
+ var _args = type ? [type] : [];
+ return function () {
+ for (var args, i = 0, l = this.length; i < l; i++) {
+ args = [this[i]].concat(_args, Array.prototype.slice.call(arguments, 0));
+ args.length == 4 && args.push($);
+ !arguments.length && method == 'add' && type && (method = 'fire');
+ b[method].apply(this, args);
+ }
+ return this;
+ };
+ };
+
+ var add = integrate('add'),
+ remove = integrate('remove'),
+ fire = integrate('fire');
+
+ var methods = {
+
+ on: add,
+ addListener: add,
+ bind: add,
+ listen: add,
+ delegate: add,
+
+ unbind: remove,
+ unlisten: remove,
+ removeListener: remove,
+ undelegate: remove,
+
+ emit: fire,
+ trigger: fire,
+
+ cloneEvents: integrate('clone'),
+
+ hover: function (enter, leave) {
+ for (var i = 0, l = this.length; i < l; i++) {
+ b.add.call(this, this[i], 'mouseenter', enter);
+ b.add.call(this, this[i], 'mouseleave', leave);
+ }
+ return this;
+ }
+ };
+
+ var shortcuts = [
+ 'blur', 'change', 'click', 'dblclick', 'error', 'focus', 'focusin',
+ 'focusout', 'keydown', 'keypress', 'keyup', 'load', 'mousedown',
+ 'mouseenter', 'mouseleave', 'mouseout', 'mouseover', 'mouseup',
+ 'resize', 'scroll', 'select', 'submit', 'unload'
+ ];
+
+ for (var i = shortcuts.length; i--;) {
+ var shortcut = shortcuts[i];
+ methods[shortcut] = integrate('add', shortcut);
+ }
+
+ $.ender(methods, true);
+}(ender);
+/*!
+ * bonzo.js - copyright @dedfat 2011
+ * https://github.com/ded/bonzo
+ * Follow our software http://twitter.com/dedfat
+ * MIT License
+ */
+!function (context) {
+
+ var doc = context.document,
+ html = doc.documentElement,
+ query = null,
+ byTag = 'getElementsByTagName',
+ specialAttributes = /^checked|value|selected$/,
+ specialTags = /select|map|fieldset|table|tbody|tr|colgroup/i,
+ tagMap = { select: 'option', table: 'tbody', tr: 'td' },
+ stateAttributes = /^checked|selected$/,
+ ie = /msie/i.test(navigator.userAgent),
+ uidList = [],
+ uuids = 0,
+ digit = /^-?[\d\.]+$/,
+ px = 'px',
+ // commonly used methods
+ setAttribute = 'setAttribute',
+ getAttribute = 'getAttribute',
+ trimReplace = /(^\s*|\s*$)/g,
+ unitless = { lineHeight: 1, zoom: 1, zIndex: 1, opacity: 1 };
+
+ function classReg(c) {
+ return new RegExp("(^|\\s+)" + c + "(\\s+|$)");
+ }
+
+ function each(ar, fn, scope) {
+ for (var i = 0, l = ar.length; i < l; i++) {
+ fn.call(scope || ar[i], ar[i], i, ar);
+ }
+ return ar;
+ }
+
+ var trim = String.prototype.trim ?
+ function (s) {
+ return s.trim();
+ } :
+ function (s) {
+ return s.replace(trimReplace, '');
+ };
+
+ function camelize(s) {
+ return s.replace(/-(.)/g, function (m, m1) {
+ return m1.toUpperCase();
+ });
+ }
+
+ function is(node) {
+ return node && node.nodeName && node.nodeType == 1;
+ }
+
+ function some(ar, fn, scope) {
+ for (var i = 0, j = ar.length; i < j; ++i) {
+ if (fn.call(scope, ar[i], i, ar)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ var getStyle = doc.defaultView && doc.defaultView.getComputedStyle ?
+ function (el, property) {
+ var value = null;
+ if (property == 'float') {
+ property = 'cssFloat';
+ }
+ var computed = doc.defaultView.getComputedStyle(el, '');
+ computed && (value = computed[camelize(property)]);
+ return el.style[property] || value;
+
+ } : (ie && html.currentStyle) ?
+
+ function (el, property) {
+ property = camelize(property);
+ property = property == 'float' ? 'styleFloat' : property;
+
+ if (property == 'opacity') {
+ var val = 100;
+ try {
+ val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
+ } catch (e1) {
+ try {
+ val = el.filters('alpha').opacity;
+ } catch (e2) {}
+ }
+ return val / 100;
+ }
+ var value = el.currentStyle ? el.currentStyle[property] : null;
+ return el.style[property] || value;
+ } :
+
+ function (el, property) {
+ return el.style[camelize(property)];
+ };
+
+ function insert(target, host, fn) {
+ var i = 0, self = host || this, r = [];
+ each(normalize(query ? query(target) : target), function (t) {
+ each(self, function (el) {
+ var n = el.cloneNode(true);
+ fn(t, n);
+ r[i] = n;
+ i++;
+ });
+ }, this);
+ each(r, function (e, i) {
+ self[i] = e;
+ });
+ self.length = i;
+ return self;
+ }
+
+ function xy(el, x, y) {
+ var $el = bonzo(el),
+ style = $el.css('position'),
+ offset = $el.offset(),
+ rel = 'relative',
+ isRel = style == rel,
+ delta = [parseInt($el.css('left'), 10), parseInt($el.css('top'), 10)];
+
+ if (style == 'static') {
+ $el.css('position', rel);
+ style = rel;
+ }
+
+ isNaN(delta[0]) && (delta[0] = isRel ? 0 : el.offsetLeft);
+ isNaN(delta[1]) && (delta[1] = isRel ? 0 : el.offsetTop);
+
+ x !== null && (el.style.left = x - offset.left + delta[0] + 'px');
+ y !== null && (el.style.top = y - offset.top + delta[1] + 'px');
+
+ }
+
+ function Bonzo(elements) {
+ this.length = 0;
+ this.original = elements;
+ if (elements) {
+ elements = typeof elements !== 'string' &&
+ !elements.nodeType &&
+ typeof elements.length !== 'undefined' ?
+ elements :
+ [elements];
+ this.length = elements.length;
+ for (var i = 0; i < elements.length; i++) {
+ this[i] = elements[i];
+ }
+ }
+ }
+
+ Bonzo.prototype = {
+
+ each: function (fn, scope) {
+ return each(this, fn, scope);
+ },
+
+ map: function (fn, reject) {
+ var m = [], n, i;
+ for (i = 0; i < this.length; i++) {
+ n = fn.call(this, this[i]);
+ reject ? (reject(n) && m.push(n)) : m.push(n);
+ }
+ return m;
+ },
+
+ first: function () {
+ return bonzo(this[0]);
+ },
+
+ last: function () {
+ return bonzo(this[this.length - 1]);
+ },
+
+ html: function (h, text) {
+ var method = text ?
+ html.textContent == null ?
+ 'innerText' :
+ 'textContent' :
+ 'innerHTML', m;
+ function append(el, tag) {
+ while (el.firstChild) {
+ el.removeChild(el.firstChild);
+ }
+ each(normalize(h, tag), function (node) {
+ el.appendChild(node);
+ });
+ }
+ return typeof h !== 'undefined' ?
+ this.each(function (el) {
+ (m = el.tagName.match(specialTags)) ?
+ append(el, m[0]) :
+ (el[method] = h);
+ }) :
+ this[0] ? this[0][method] : '';
+ },
+
+ text: function (text) {
+ return this.html(text, 1);
+ },
+
+ addClass: function (c) {
+ return this.each(function (el) {
+ this.hasClass(el, c) || (el.className = trim(el.className + ' ' + c));
+ }, this);
+ },
+
+ removeClass: function (c) {
+ return this.each(function (el) {
+ this.hasClass(el, c) && (el.className = trim(el.className.replace(classReg(c), ' ')));
+ }, this);
+ },
+
+ hasClass: function (el, c) {
+ return typeof c == 'undefined' ?
+ some(this, function (i) {
+ return classReg(el).test(i.className);
+ }) :
+ classReg(c).test(el.className);
+ },
+
+ toggleClass: function (c, condition) {
+ if (typeof condition !== 'undefined' && !condition) {
+ return this;
+ }
+ return this.each(function (el) {
+ this.hasClass(el, c) ?
+ (el.className = trim(el.className.replace(classReg(c), ' '))) :
+ (el.className = trim(el.className + ' ' + c));
+ }, this);
+ },
+
+ show: function (type) {
+ return this.each(function (el) {
+ el.style.display = type || '';
+ });
+ },
+
+ hide: function (elements) {
+ return this.each(function (el) {
+ el.style.display = 'none';
+ });
+ },
+
+ append: function (node) {
+ return this.each(function (el) {
+ each(normalize(node), function (i) {
+ el.appendChild(i);
+ });
+ });
+ },
+
+ prepend: function (node) {
+ return this.each(function (el) {
+ var first = el.firstChild;
+ each(normalize(node), function (i) {
+ el.insertBefore(i, first);
+ });
+ });
+ },
+
+ appendTo: function (target, host) {
+ return insert.call(this, target, host, function (t, el) {
+ t.appendChild(el);
+ });
+ },
+
+ prependTo: function (target, host) {
+ return insert.call(this, target, host, function (t, el) {
+ t.insertBefore(el, t.firstChild);
+ });
+ },
+
+ next: function () {
+ return this.related('nextSibling');
+ },
+
+ previous: function () {
+ return this.related('previousSibling');
+ },
+
+ related: function (method) {
+ return this.map(
+ function (el) {
+ el = el[method];
+ while (el && el.nodeType !== 1) {
+ el = el[method];
+ }
+ return el || 0;
+ },
+ function (el) {
+ return el;
+ }
+ );
+ },
+
+ before: function (node) {
+ return this.each(function (el) {
+ each(bonzo.create(node), function (i) {
+ el.parentNode.insertBefore(i, el);
+ });
+ });
+ },
+
+ after: function (node) {
+ return this.each(function (el) {
+ each(bonzo.create(node), function (i) {
+ el.parentNode.insertBefore(i, el.nextSibling);
+ });
+ });
+ },
+
+ insertBefore: function (target, host) {
+ return insert.call(this, target, host, function (t, el) {
+ t.parentNode.insertBefore(el, t);
+ });
+ },
+
+ insertAfter: function (target, host) {
+ return insert.call(this, target, host, function (t, el) {
+ var sibling = t.nextSibling;
+ if (sibling) {
+ t.parentNode.insertBefore(el, sibling);
+ }
+ else {
+ t.parentNode.appendChild(el);
+ }
+ });
+ },
+
+ css: function (o, v) {
+ // is this a request for just getting a style?
+ if (v === undefined && typeof o == 'string') {
+ return getStyle(this[0], o);
+ }
+ var iter = o;
+ if (typeof o == 'string') {
+ iter = {};
+ iter[o] = v;
+ }
+
+ if (ie && iter.opacity) {
+ // oh this 'ol gamut
+ iter.filter = 'alpha(opacity=' + (iter.opacity * 100) + ')';
+ // give it layout
+ iter.zoom = o.zoom || 1;
+ delete iter.opacity;
+ }
+
+ if (v = iter['float']) {
+ // float is a reserved style word. w3 uses cssFloat, ie uses styleFloat
+ ie ? (iter.styleFloat = v) : (iter.cssFloat = v);
+ delete iter['float'];
+ }
+
+ var fn = function (el, p, v) {
+ for (var k in iter) {
+ if (iter.hasOwnProperty(k)) {
+ v = iter[k];
+ // change "5" to "5px" - unless you're line-height, which is allowed
+ (p = camelize(k)) && digit.test(v) && !(p in unitless) && (v += px);
+ el.style[p] = v;
+ }
+ }
+ };
+ return this.each(fn);
+ },
+
+ offset: function (x, y) {
+ if (x || y) {
+ return this.each(function (el) {
+ xy(el, x, y);
+ });
+ }
+ var el = this[0];
+ var width = el.offsetWidth;
+ var height = el.offsetHeight;
+ var top = el.offsetTop;
+ var left = el.offsetLeft;
+ while (el = el.offsetParent) {
+ top = top + el.offsetTop;
+ left = left + el.offsetLeft;
+ }
+
+ return {
+ top: top,
+ left: left,
+ height: height,
+ width: width
+ };
+ },
+
+ attr: function (k, v) {
+ var el = this[0];
+ return typeof v == 'undefined' ?
+ specialAttributes.test(k) ?
+ stateAttributes.test(k) && typeof el[k] == 'string' ?
+ true : el[k] : el[getAttribute](k) :
+ this.each(function (el) {
+ k == 'value' ? (el.value = v) : el[setAttribute](k, v);
+ });
+ },
+
+ val: function (s) {
+ return (typeof s == 'string') ? this.attr('value', s) : this[0].value;
+ },
+
+ removeAttr: function (k) {
+ return this.each(function (el) {
+ el.removeAttribute(k);
+ });
+ },
+
+ data: function (k, v) {
+ var el = this[0];
+ if (typeof v === 'undefined') {
+ el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids);
+ var uid = el[getAttribute]('data-node-uid');
+ uidList[uid] || (uidList[uid] = {});
+ return uidList[uid][k];
+ } else {
+ return this.each(function (el) {
+ el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids);
+ var uid = el[getAttribute]('data-node-uid');
+ var o = {};
+ o[k] = v;
+ uidList[uid] = o;
+ });
+ }
+ },
+
+ remove: function () {
+ return this.each(function (el) {
+ el.parentNode && el.parentNode.removeChild(el);
+ });
+ },
+
+ empty: function () {
+ return this.each(function (el) {
+ while (el.firstChild) {
+ el.removeChild(el.firstChild);
+ }
+ });
+ },
+
+ detach: function () {
+ return this.map(function (el) {
+ return el.parentNode.removeChild(el);
+ });
+ },
+
+ scrollTop: function (y) {
+ return scroll.call(this, null, y, 'y');
+ },
+
+ scrollLeft: function (x) {
+ return scroll.call(this, x, null, 'x');
+ }
+ };
+
+ function normalize(node, tag) {
+ return typeof node == 'string' ? bonzo.create(node, tag) : is(node) ? [node] : node;
+ }
+
+ function scroll(x, y, type) {
+ var el = this[0];
+ if (x == null && y == null) {
+ return (isBody(el) ? getWindowScroll() : { x: el.scrollLeft, y: el.scrollTop })[type];
+ }
+ if (isBody(el)) {
+ window.scrollTo(x, y);
+ } else {
+ x != null && (el.scrollLeft = x);
+ y != null && (el.scrollTop = y);
+ }
+ return this;
+ }
+
+ function isBody(element) {
+ return element === window || (/^(?:body|html)$/i).test(element.tagName);
+ }
+
+ function getWindowScroll() {
+ return { x: window.pageXOffset || html.scrollLeft, y: window.pageYOffset || html.scrollTop };
+ }
+
+ function bonzo(els, host) {
+ return new Bonzo(els, host);
+ }
+
+ bonzo.setQueryEngine = function (q) {
+ query = q;
+ delete bonzo.setQueryEngine;
+ };
+
+ bonzo.aug = function (o, target) {
+ for (var k in o) {
+ o.hasOwnProperty(k) && ((target || Bonzo.prototype)[k] = o[k]);
+ }
+ };
+
+ bonzo.create = function (node, tag) {
+ return typeof node == 'string' ?
+ function () {
+ var t = tag ? tagMap[tag.toLowerCase()] : null;
+ var el = doc.createElement(t || 'div'), els = [];
+ if (tag) {
+ var bitches = node.match(new RegExp("<" + t + ">.+?<\\/" + t + ">", "g"));
+ each(bitches, function (m) {
+ m = m.replace(/<(.+)>(.+?)<\/\1>/, '$2');
+ var bah = doc.createElement(t);
+ bah.appendChild(doc.createDocumentFragment(m));
+ el.appendChild(bah);
+ });
+ } else {
+ el.innerHTML = node;
+ }
+ var nodes = el.childNodes;
+ el = el.firstChild;
+ els.push(el);
+ while (el = el.nextSibling) {
+ (el.nodeType == 1) && els.push(el);
+ }
+ return els;
+
+ }() : is(node) ? [node.cloneNode(true)] : [];
+ };
+
+ bonzo.doc = function () {
+ var w = html.scrollWidth,
+ h = html.scrollHeight,
+ vp = this.viewport();
+ return {
+ width: Math.max(w, vp.width),
+ height: Math.max(h, vp.height)
+ };
+ };
+
+ bonzo.firstChild = function (el) {
+ for (var c = el.childNodes, i = 0, j = (c && c.length) || 0, e; i < j; i++) {
+ if (c[i].nodeType === 1) {
+ e = c[j = i];
+ }
+ }
+ return e;
+ };
+
+ bonzo.viewport = function () {
+ var h = self.innerHeight,
+ w = self.innerWidth;
+ ie && (h = html.clientHeight) && (w = html.clientWidth);
+ return {
+ width: w,
+ height: h
+ };
+ };
+
+ bonzo.isAncestor = 'compareDocumentPosition' in html ?
+ function (container, element) {
+ return (container.compareDocumentPosition(element) & 16) == 16;
+ } : 'contains' in html ?
+ function (container, element) {
+ return container !== element && container.contains(element);
+ } :
+ function (container, element) {
+ while (element = element.parentNode) {
+ if (element === container) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ var old = context.bonzo;
+ bonzo.noConflict = function () {
+ context.bonzo = old;
+ return this;
+ };
+ context['bonzo'] = bonzo;
+
+}(this);!function ($) {
+
+ var b = bonzo;
+ b.setQueryEngine($);
+ $.ender(b);
+ $.ender(b(), true);
+ $.ender({
+ create: function (node) {
+ return $(b.create(node));
+ }
+ });
+
+ $.id = function (id) {
+ return $([document.getElementById(id)]);
+ };
+
+ function indexOf(ar, val) {
+ for (var i = 0; i < ar.length; i++) {
+ if (ar[i] === val) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ function uniq(ar) {
+ var a = [], i, j;
+ label:
+ for (i = 0; i < ar.length; i++) {
+ for (j = 0; j < a.length; j++) {
+ if (a[j] == ar[i]) {
+ continue label;
+ }
+ }
+ a[a.length] = ar[i];
+ }
+ return a;
+ }
+
+ $.ender({
+ parents: function (selector, closest) {
+ var collection = $(selector), j, k, p, r = [];
+ for (j = 0, k = this.length; j < k; j++) {
+ p = this[j];
+ while (p = p.parentNode) {
+ if (indexOf(collection, p) !== -1) {
+ r.push(p);
+ if (closest) break;
+ }
+ }
+ }
+ return $(uniq(r));
+ },
+
+ closest: function (selector) {
+ return this.parents(selector, true);
+ },
+
+ first: function () {
+ return $(this[0]);
+ },
+
+ last: function () {
+ return $(this[this.length - 1]);
+ },
+
+ next: function () {
+ return $(b(this).next());
+ },
+
+ previous: function () {
+ return $(b(this).previous());
+ },
+
+ appendTo: function (t) {
+ return b(this.selector).appendTo(t, this);
+ },
+
+ prependTo: function (t) {
+ return b(this.selector).prependTo(t, this);
+ },
+
+ insertAfter: function (t) {
+ return b(this.selector).insertAfter(t, this);
+ },
+
+ insertBefore: function (t) {
+ return b(this.selector).insertBefore(t, this);
+ },
+
+ siblings: function () {
+ var i, l, p, r = [];
+ for (i = 0, l = this.length; i < l; i++) {
+ p = this[i];
+ while (p = p.previousSibling) {
+ p.nodeType == 1 && r.push(p);
+ }
+ p = this[i];
+ while (p = p.nextSibling) {
+ p.nodeType == 1 && r.push(p);
+ }
+ }
+ return $(r);
+ },
+
+ children: function () {
+ var el, r = [];
+ for (i = 0, l = this.length; i < l; i++) {
+ if (!(el = b.firstChild(this[i]))) {
+ continue;
+ }
+ r.push(el);
+ while (el = el.nextSibling) {
+ el.nodeType == 1 && r.push(el);
+ }
+ }
+ return $(uniq(r));
+ },
+
+ height: function (v) {
+ return v ? this.css('height', v) : parseInt(this.css('height'), 10);
+ },
+
+ width: function (v) {
+ return v ? this.css('width', v) : parseInt(this.css('width'), 10);
+ }
+ }, true);
+
+}(ender || $);
+
+!function () { var exports = {}, module = { exports: exports }; !function (doc) {
+ var loaded = 0, fns = [], ol, f = false,
+ testEl = doc.createElement('a'),
+ domContentLoaded = 'DOMContentLoaded',
+ addEventListener = 'addEventListener',
+ onreadystatechange = 'onreadystatechange';
+
+ /^loade|c/.test(doc.readyState) && (loaded = 1);
+
+ function flush() {
+ loaded = 1;
+ for (var i = 0, l = fns.length; i < l; i++) {
+ fns[i]();
+ }
+ }
+ doc[addEventListener] && doc[addEventListener](domContentLoaded, function fn() {
+ doc.removeEventListener(domContentLoaded, fn, f);
+ flush();
+ }, f);
+
+
+ testEl.doScroll && doc.attachEvent(onreadystatechange, (ol = function ol() {
+ if (/^c/.test(doc.readyState)) {
+ doc.detachEvent(onreadystatechange, ol);
+ flush();
+ }
+ }));
+
+ var domReady = testEl.doScroll ?
+ function (fn) {
+ self != top ?
+ !loaded ?
+ fns.push(fn) :
+ fn() :
+ !function () {
+ try {
+ testEl.doScroll('left');
+ } catch (e) {
+ return setTimeout(function() {
+ domReady(fn);
+ }, 50);
+ }
+ fn();
+ }();
+ } :
+ function (fn) {
+ loaded ? fn() : fns.push(fn);
+ };
+
+ (typeof module !== 'undefined') && module.exports ?
+ (module.exports = {domReady: domReady}) :
+ (window.domReady = domReady);
+
+}(document); $.ender(module.exports); }.call($);
+/*!
+ * qwery.js - copyright @dedfat
+ * https://github.com/ded/qwery
+ * Follow our software http://twitter.com/dedfat
+ * MIT License
+ */
+
+!function (context, doc) {
+
+ var c, i, j, k, l, m, o, p, r, v,
+ el, node, len, found, classes, item, items, token,
+ id = /#([\w\-]+)/,
+ clas = /\.[\w\-]+/g,
+ idOnly = /^#([\w\-]+$)/,
+ classOnly = /^\.([\w\-]+)$/,
+ tagOnly = /^([\w\-]+)$/,
+ tagAndOrClass = /^([\w]+)?\.([\w\-]+)$/,
+ html = doc.documentElement,
+ tokenizr = /\s(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\])/,
+ specialChars = /([.*+?\^=!:${}()|\[\]\/\\])/g,
+ simple = /^([a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/,
+ attr = /\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/,
+ chunker = new RegExp(simple.source + '(' + attr.source + ')?');
+
+ function array(ar) {
+ r = [];
+ for (i = 0, len = ar.length; i < len; i++) {
+ r[i] = ar[i];
+ }
+ return r;
+ }
+
+ var cache = function () {
+ this.c = {};
+ };
+ cache.prototype = {
+ g: function (k) {
+ return this.c[k] || undefined;
+ },
+ s: function (k, v) {
+ this.c[k] = v;
+ return v;
+ }
+ };
+
+ var classCache = new cache(),
+ cleanCache = new cache(),
+ attrCache = new cache(),
+ tokenCache = new cache();
+
+ function q(query) {
+ return query.match(chunker);
+ }
+
+ function interpret(whole, tag, idsAndClasses, wholeAttribute, attribute, qualifier, value) {
+ var m, c, k;
+ if (tag && this.tagName.toLowerCase() !== tag) {
+ return false;
+ }
+ if (idsAndClasses && (m = idsAndClasses.match(id)) && m[1] !== this.id) {
+ return false;
+ }
+ if (idsAndClasses && (classes = idsAndClasses.match(clas))) {
+ for (i = classes.length; i--;) {
+ c = classes[i].slice(1);
+ if (!(classCache.g(c) || classCache.s(c, new RegExp('(^|\\s+)' + c + '(\\s+|$)'))).test(this.className)) {
+ return false;
+ }
+ }
+ }
+ if (wholeAttribute && !value) {
+ o = this.attributes;
+ for (k in o) {
+ if (Object.prototype.hasOwnProperty.call(o, k) && (o[k].name || k) == attribute) {
+ return this;
+ }
+ }
+ }
+ if (wholeAttribute && !checkAttr(qualifier, this.getAttribute(attribute) || '', value)) {
+ return false;
+ }
+ return this;
+ }
+
+ function loopAll(tokens) {
+ var r = [], token = tokens.pop(), intr = q(token), tag = intr[1] || '*', i, l, els,
+ root = tokens.length && (m = tokens[0].match(idOnly)) ? doc.getElementById(m[1]) : doc;
+ if (!root) {
+ return r;
+ }
+ els = root.getElementsByTagName(tag);
+ for (i = 0, l = els.length; i < l; i++) {
+ el = els[i];
+ if (item = interpret.apply(el, intr)) {
+ r.push(item);
+ }
+ }
+ return r;
+ }
+
+ function clean(s) {
+ return cleanCache.g(s) || cleanCache.s(s, s.replace(specialChars, '\\$1'));
+ }
+
+ function checkAttr(qualify, actual, val) {
+ switch (qualify) {
+ case '=':
+ return actual == val;
+ case '^=':
+ return actual.match(attrCache.g('^=' + val) || attrCache.s('^=' + val, new RegExp('^' + clean(val))));
+ case '$=':
+ return actual.match(attrCache.g('$=' + val) || attrCache.s('$=' + val, new RegExp(clean(val) + '$')));
+ case '*=':
+ return actual.match(attrCache.g(val) || attrCache.s(val, new RegExp(clean(val))));
+ case '~=':
+ return actual.match(attrCache.g('~=' + val) || attrCache.s('~=' + val, new RegExp('(?:^|\\s+)' + clean(val) + '(?:\\s+|$)')));
+ case '|=':
+ return actual.match(attrCache.g('|=' + val) || attrCache.s('|=' + val, new RegExp('^' + clean(val) + '(-|$)')));
+ }
+ return false;
+ }
+
+ function _qwery(selector) {
+ var r = [], ret = [], i, l,
+ tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr));
+ tokens = tokens.slice(0);
+ if (!tokens.length) {
+ return r;
+ }
+ r = loopAll(tokens);
+ if (!tokens.length) {
+ return r;
+ }
+ // loop through all descendent tokens
+ for (j = 0, l = r.length, k = 0; j < l; j++) {
+ node = r[j];
+ p = node;
+ // loop through each token
+ for (i = tokens.length; i--;) {
+ z: // loop through parent nodes
+ while (p !== html && (p = p.parentNode)) {
+ if (found = interpret.apply(p, q(tokens[i]))) {
+ break z;
+ }
+ }
+ }
+ found && (ret[k++] = node);
+ }
+ return ret;
+ }
+
+ function boilerPlate(selector, _root, fn) {
+ var root = (typeof _root == 'string') ? fn(_root)[0] : (_root || doc);
+ if (selector === window || isNode(selector)) {
+ return !_root || (selector !== window && isNode(root) && isAncestor(selector, root)) ? [selector] : [];
+ }
+ if (selector && typeof selector === 'object' && isFinite(selector.length)) {
+ return array(selector);
+ }
+ if (m = selector.match(idOnly)) {
+ return (el = doc.getElementById(m[1])) ? [el] : [];
+ }
+ if (m = selector.match(tagOnly)) {
+ return array(root.getElementsByTagName(m[1]));
+ }
+ return false;
+ }
+
+ function isNode(el) {
+ return (el && el.nodeType && (el.nodeType == 1 || el.nodeType == 9));
+ }
+
+ function uniq(ar) {
+ var a = [], i, j;
+ label:
+ for (i = 0; i < ar.length; i++) {
+ for (j = 0; j < a.length; j++) {
+ if (a[j] == ar[i]) {
+ continue label;
+ }
+ }
+ a[a.length] = ar[i];
+ }
+ return a;
+ }
+
+ function qwery(selector, _root) {
+ var root = (typeof _root == 'string') ? qwery(_root)[0] : (_root || doc);
+ if (!root || !selector) {
+ return [];
+ }
+ if (m = boilerPlate(selector, _root, qwery)) {
+ return m;
+ }
+ return select(selector, root);
+ }
+
+ var isAncestor = 'compareDocumentPosition' in html ?
+ function (element, container) {
+ return (container.compareDocumentPosition(element) & 16) == 16;
+ } : 'contains' in html ?
+ function (element, container) {
+ container = container == doc || container == window ? html : container;
+ return container !== element && container.contains(element);
+ } :
+ function (element, container) {
+ while (element = element.parentNode) {
+ if (element === container) {
+ return 1;
+ }
+ }
+ return 0;
+ },
+
+ select = (doc.querySelector && doc.querySelectorAll) ?
+ function (selector, root) {
+ if (doc.getElementsByClassName && (m = selector.match(classOnly))) {
+ return array((root).getElementsByClassName(m[1]));
+ }
+ return array((root).querySelectorAll(selector));
+ } :
+ function (selector, root) {
+ var result = [], collection, collections = [], i;
+ if (m = selector.match(tagAndOrClass)) {
+ items = root.getElementsByTagName(m[1] || '*');
+ r = classCache.g(m[2]) || classCache.s(m[2], new RegExp('(^|\\s+)' + m[2] + '(\\s+|$)'));
+ for (i = 0, l = items.length, j = 0; i < l; i++) {
+ r.test(items[i].className) && (result[j++] = items[i]);
+ }
+ return result;
+ }
+ for (i = 0, items = selector.split(','), l = items.length; i < l; i++) {
+ collections[i] = _qwery(items[i]);
+ }
+ for (i = 0, l = collections.length; i < l && (collection = collections[i]); i++) {
+ var ret = collection;
+ if (root !== doc) {
+ ret = [];
+ for (j = 0, m = collection.length; j < m && (element = collection[j]); j++) {
+ // make sure element is a descendent of root
+ isAncestor(element, root) && ret.push(element);
+ }
+ }
+ result = result.concat(ret);
+ }
+ return uniq(result);
+ };
+
+ qwery.uniq = uniq;
+ var oldQwery = context.qwery;
+ qwery.noConflict = function () {
+ context.qwery = oldQwery;
+ return this;
+ };
+ context['qwery'] = qwery;
+
+}(this, document);!function (doc) {
+ var q = qwery.noConflict();
+ function create(node, root) {
+ var el = (root || doc).createElement('div'), els = [];
+ el.innerHTML = node;
+ var nodes = el.childNodes;
+ el = el.firstChild;
+ els.push(el);
+ while (el = el.nextSibling) {
+ (el.nodeType == 1) && els.push(el);
+ }
+ return els;
+ };
+ $._select = function (s, r) {
+ return /^\s*)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" a ",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML=" ";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="
",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML=" ",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML=" ",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML=" ",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:b.support.htmlSerialize?[0,"",""]:[1,"X","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write(""),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
diff --git a/source/javascripts/libs/swfobject-dynamic.js b/source/javascripts/libs/swfobject-dynamic.js
new file mode 100644
index 00000000..b0216145
--- /dev/null
+++ b/source/javascripts/libs/swfobject-dynamic.js
@@ -0,0 +1,298 @@
+/*! SWFObject v2.2
+ is released under the MIT License
+*/
+
+var swfobject = function() {
+
+ var UNDEF = "undefined",
+ OBJECT = "object",
+ SHOCKWAVE_FLASH = "Shockwave Flash",
+ SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+ FLASH_MIME_TYPE = "application/x-shockwave-flash",
+ EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+
+ win = window,
+ doc = document,
+ nav = navigator,
+
+ plugin = false,
+ regObjArr = [],
+ objIdArr = [],
+ storedAltContent,
+ storedAltContentId,
+ storedCallbackFn,
+ storedCallbackObj,
+ autoHideShow = true,
+
+ /* Centralized function for browser feature detection
+ - User agent string detection is only used when no good alternative is possible
+ - Is executed directly for optimal performance
+ */
+ ua = function() {
+ var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+ u = nav.userAgent.toLowerCase(),
+ p = nav.platform.toLowerCase(),
+ windows = p ? /win/.test(p) : /win/.test(u),
+ mac = p ? /mac/.test(p) : /mac/.test(u),
+ webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+ ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
+ playerVersion = [0,0,0],
+ d = null;
+ if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+ d = nav.plugins[SHOCKWAVE_FLASH].description;
+ if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
+ plugin = true;
+ ie = false; // cascaded feature detection for Internet Explorer
+ d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+ playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+ playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+ playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+ }
+ }
+ else if (typeof win.ActiveXObject != UNDEF) {
+ try {
+ var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+ if (a) { // a will return null when ActiveX is disabled
+ d = a.GetVariable("$version");
+ if (d) {
+ ie = true; // cascaded feature detection for Internet Explorer
+ d = d.split(" ")[1].split(",");
+ playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+ }
+ }
+ }
+ catch(e) {}
+ }
+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+ }()
+
+
+ /* Main function
+ - Will preferably execute onDomLoad, otherwise onload (as a fallback)
+ */
+ function main() {
+ if (plugin) { testPlayerVersion(); }
+ else { matchVersions(); }
+ }
+
+ /* Detect the Flash Player version for non-Internet Explorer browsers
+ - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
+ a. Both release and build numbers can be detected
+ b. Avoid wrong descriptions by corrupt installers provided by Adobe
+ c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
+ - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
+ */
+ function testPlayerVersion() {
+ var b = doc.getElementsByTagName("body")[0];
+ var o = createElement(OBJECT);
+ o.setAttribute("type", FLASH_MIME_TYPE);
+ var t = b.appendChild(o);
+ if (t) {
+ var counter = 0;
+ (function(){
+ if (typeof t.GetVariable != UNDEF) {
+ var d = t.GetVariable("$version");
+ if (d) {
+ d = d.split(" ")[1].split(",");
+ ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+ }
+ }
+ else if (counter < 10) {
+ counter++;
+ setTimeout(arguments.callee, 10);
+ return;
+ }
+ b.removeChild(o);
+ t = null;
+ matchVersions();
+ })();
+ }
+ else {
+ matchVersions();
+ }
+ }
+
+
+ /* Cross-browser dynamic SWF creation
+ */
+ function createSWF(attObj, parObj, id) {
+ var r, el = getElementById(id);
+ if (ua.wk && ua.wk < 312) { return r; }
+ if (el) {
+ if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
+ attObj.id = id;
+ }
+ if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
+ var att = "";
+ for (var i in attObj) {
+ if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
+ if (i.toLowerCase() == "data") {
+ parObj.movie = attObj[i];
+ }
+ else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+ att += ' class="' + attObj[i] + '"';
+ }
+ else if (i.toLowerCase() != "classid") {
+ att += ' ' + i + '="' + attObj[i] + '"';
+ }
+ }
+ }
+ var par = "";
+ for (var j in parObj) {
+ if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
+ par += ' ';
+ }
+ }
+ el.outerHTML = '' + par + ' ';
+ objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
+ r = getElementById(attObj.id);
+ }
+ else { // well-behaving browsers
+ var o = createElement(OBJECT);
+ o.setAttribute("type", FLASH_MIME_TYPE);
+ for (var m in attObj) {
+ if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
+ if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+ o.setAttribute("class", attObj[m]);
+ }
+ else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
+ o.setAttribute(m, attObj[m]);
+ }
+ }
+ }
+ for (var n in parObj) {
+ if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
+ createObjParam(o, n, parObj[n]);
+ }
+ }
+ el.parentNode.replaceChild(o, el);
+ r = o;
+ }
+ }
+ return r;
+ }
+
+ function createObjParam(el, pName, pValue) {
+ var p = createElement("param");
+ p.setAttribute("name", pName);
+ p.setAttribute("value", pValue);
+ el.appendChild(p);
+ }
+
+ /* Cross-browser SWF removal
+ - Especially needed to safely and completely remove a SWF in Internet Explorer
+ */
+ /* Functions to optimize JavaScript compression
+ */
+ function getElementById(id) {
+ var el = null;
+ try {
+ el = doc.getElementById(id);
+ }
+ catch (e) {}
+ return el;
+ }
+
+ function createElement(el) {
+ return doc.createElement(el);
+ }
+
+ /* Flash Player and SWF content version matching
+ */
+ function hasPlayerVersion(rv) {
+ var pv = ua.pv, v = rv.split(".");
+ v[0] = parseInt(v[0], 10);
+ v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+ v[2] = parseInt(v[2], 10) || 0;
+ return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+ }
+
+
+ /* Filter to avoid XSS attacks
+ */
+ function urlEncodeIfNecessary(s) {
+ var regex = /[\\\"<>\.;]/;
+ var hasBadChars = regex.exec(s) != null;
+ return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+ }
+
+ return {
+ /* Public API
+ - Reference: http://code.google.com/p/swfobject/wiki/documentation
+ */
+
+ embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, flashvarsObj, parObj, attObj, callbackFn) {
+ var callbackObj = {success:false, id:replaceElemIdStr};
+ if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+ widthStr += ""; // auto-convert to string
+ heightStr += "";
+ var att = {};
+ if (attObj && typeof attObj === OBJECT) {
+ for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
+ att[i] = attObj[i];
+ }
+ }
+ att.data = swfUrlStr;
+ att.width = widthStr;
+ att.height = heightStr;
+ var par = {};
+ if (parObj && typeof parObj === OBJECT) {
+ for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
+ par[j] = parObj[j];
+ }
+ }
+ if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+ for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
+ if (typeof par.flashvars != UNDEF) {
+ par.flashvars += "&" + k + "=" + flashvarsObj[k];
+ }
+ else {
+ par.flashvars = k + "=" + flashvarsObj[k];
+ }
+ }
+ }
+ if (hasPlayerVersion(swfVersionStr)) { // create SWF
+ var obj = createSWF(att, par, replaceElemIdStr);
+ callbackObj.success = true;
+ callbackObj.ref = obj;
+ }
+ if (callbackFn) { callbackFn(callbackObj); }
+ }
+ else if (callbackFn) { callbackFn(callbackObj); }
+ },
+
+ ua: ua,
+
+ getFlashPlayerVersion: function() {
+ return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+ },
+
+ hasFlashPlayerVersion: hasPlayerVersion,
+
+ createSWF: function(attObj, parObj, replaceElemIdStr) {
+ if (ua.w3) {
+ return createSWF(attObj, parObj, replaceElemIdStr);
+ }
+ else {
+ return undefined;
+ }
+ },
+
+ getQueryParamValue: function(param) {
+ var q = doc.location.search || doc.location.hash;
+ if (q) {
+ if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
+ if (param == null) {
+ return urlEncodeIfNecessary(q);
+ }
+ var pairs = q.split("&");
+ for (var i = 0; i < pairs.length; i++) {
+ if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+ return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+ }
+ }
+ }
+ return "";
+ }
+ };
+}();
diff --git a/source/javascripts/modernizr-2.0.js b/source/javascripts/modernizr-2.0.js
new file mode 100644
index 00000000..9dca7b0e
--- /dev/null
+++ b/source/javascripts/modernizr-2.0.js
@@ -0,0 +1,5 @@
+/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-video-mq-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load
+ */
+;window.Modernizr=function(a,b,c){function A(a){j.cssText=a}function B(a,b){return A(m.join(a+";")+(b||""))}function C(a,b){return typeof a===b}function D(a,b){return!!~(""+a).indexOf(b)}function E(a,b){for(var d in a){var e=a[d];if(!D(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function F(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:C(f,"function")?f.bind(d||b):f}return!1}function G(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return C(b,"string")||C(b,"undefined")?E(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),F(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return w("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},y={}.hasOwnProperty,z;!C(y,"undefined")&&!C(y.call,"undefined")?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c};for(var H in q)z(q,H)&&(v=H.toLowerCase(),e[v]=q[H](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)z(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},A(""),i=k=null,e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.mq=x,e.testProp=function(a){return E([a])},e.testAllProps=G,e.testStyles=w,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f')
+ var mobileNav = $('fieldset.mobile-nav').append('');
+ mobileNav.find('select').append('Navigate… ');
+ var addOption = function(i, option) {
+ mobileNav.find('select').append('» ' + $(this).text() + ' ');
+ }
+ mainNav.find('a').each(addOption);
+ $('ul.subscription a').each(addOption);
+ mobileNav.find('select').bind('change', function(event) {
+ if (event.target.value) { window.location.href = event.target.value; }
+ });
+}
+
+function addSidebarToggler() {
+ if(!$('body').hasClass('sidebar-footer')) {
+ $('#content').append('');
+ $('.toggle-sidebar').bind('click', function(e) {
+ e.preventDefault();
+ $('body').toggleClass('collapse-sidebar');
+ });
+ }
+ var sections = $('aside.sidebar > section');
+ if (sections.length > 1) {
+ sections.each(function(index, section){
+ if ((sections.length >= 3) && index % 3 === 0) {
+ $(section).addClass("first");
+ }
+ var count = ((index +1) % 2) ? "odd" : "even";
+ $(section).addClass(count);
+ });
+ }
+ if (sections.length >= 3){ $('aside.sidebar').addClass('thirds'); }
+}
+
+function testFeatures() {
+ var features = ['maskImage'];
+ $(features).map(function(i, feature) {
+ if (Modernizr.testAllProps(feature)) {
+ $('html').addClass(feature);
+ } else {
+ $('html').addClass('no-'+feature);
+ }
+ });
+ if ("placeholder" in document.createElement("input")) {
+ $('html').addClass('placeholder');
+ } else {
+ $('html').addClass('no-placeholder');
+ }
+}
+
+function addCodeLineNumbers() {
+ if (navigator.appName === 'Microsoft Internet Explorer') { return; }
+ $('div.gist-highlight').each(function(code) {
+ var tableStart = '',
+ lineNumbers = '',
+ tableMiddle = ' ',
+ tableEnd = '
',
+ count = $('.line', code).length;
+ for (var i=1;i<=count; i++) {
+ lineNumbers += ''+i+' \n';
+ }
+ var table = tableStart + lineNumbers + tableMiddle + ''+$('pre', code).html()+' ' + tableEnd;
+ $(code).html(table);
+ });
+}
+
+function flashVideoFallback(){
+ var flashplayerlocation = "/assets/jwplayer/player.swf",
+ flashplayerskin = "/assets/jwplayer/glow/glow.xml";
+ $('video').each(function(i, video){
+ video = $(video);
+ if (!Modernizr.video.h264 && swfobject.getFlashPlayerVersion() || window.location.hash.indexOf("flash-test") !== -1){
+ video.children('source[src$=mp4]').first().map(i, function(source){
+ var src = $(source).attr('src'),
+ id = 'video_'+Math.round(1 + Math.random()*(100000)),
+ width = video.attr('width'),
+ height = parseInt(video.attr('height'), 10) + 30;
+ video.after('');
+ swfobject.embedSWF(flashplayerlocation, id, width, height + 30, "9.0.0",
+ { file : src, image : video.attr('poster'), skin : flashplayerskin } ,
+ { movie : src, wmode : "opaque", allowfullscreen : "true" }
+ );
+ });
+ video.remove();
+ }
+ });
+}
+
+function wrapFlashVideos() {
+ $('object').each(function(i, object) {
+ if( $(object).find('param[name=movie]').length ){
+ $(object).wrap('
')
+ }
+ });
+ $('iframe[src*=vimeo],iframe[src*=youtube]').wrap('
')
+}
+
+function renderDeliciousLinks(items) {
+ var output = "
";
+ $('#delicious').html(output);
+}
+
+$('document').ready(function() {
+ testFeatures();
+ wrapFlashVideos();
+ flashVideoFallback();
+ addCodeLineNumbers();
+ getNav();
+ addSidebarToggler();
+});
+
+// iOS scaling bug fix
+// Rewritten version
+// By @mathias, @cheeaun and @jdalton
+// Source url: https://gist.github.com/901295
+(function(doc) {
+ var addEvent = 'addEventListener',
+ type = 'gesturestart',
+ qsa = 'querySelectorAll',
+ scales = [1, 1],
+ meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : [];
+ function fix() {
+ meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1];
+ doc.removeEventListener(type, fix, true);
+ }
+ if ((meta = meta[meta.length - 1]) && addEvent in doc) {
+ fix();
+ scales = [0.25, 1.6];
+ doc[addEvent](type, fix, true);
+ }
+}(document));
+
+/*! SWFObject v2.2 modified by Brandon Mathis to contain only what is necessary to dynamically embed flash objects
+ * Uncompressed source in javascripts/libs/swfobject-dynamic.js
+ *
+ released under the MIT License
+*/
+var swfobject=function(){function s(a,b,d){var q,k=n(d);if(g.wk&&g.wk<312)return q;if(k){if(typeof a.id==l)a.id=d;if(g.ie&&g.win){var e="",c;for(c in a)if(a[c]!=Object.prototype[c])c.toLowerCase()=="data"?b.movie=a[c]:c.toLowerCase()=="styleclass"?e+=' class="'+a[c]+'"':c.toLowerCase()!="classid"&&(e+=" "+c+'="'+a[c]+'"');c="";for(var f in b)b[f]!=Object.prototype[f]&&(c+=' ');k.outerHTML='"+c+
+" ";q=n(a.id)}else{f=i.createElement(o);f.setAttribute("type",m);for(var h in a)a[h]!=Object.prototype[h]&&(h.toLowerCase()=="styleclass"?f.setAttribute("class",a[h]):h.toLowerCase()!="classid"&&f.setAttribute(h,a[h]));for(e in b)b[e]!=Object.prototype[e]&&e.toLowerCase()!="movie"&&(a=f,c=e,h=b[e],d=i.createElement("param"),d.setAttribute("name",c),d.setAttribute("value",h),a.appendChild(d));k.parentNode.replaceChild(f,k);q=f}}return q}function n(a){var b=null;try{b=i.getElementById(a)}catch(d){}return b}
+function t(a){var b=g.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function u(a){return/[\\\"<>\.;]/.exec(a)!=null&&typeof encodeURIComponent!=l?encodeURIComponent(a):a}var l="undefined",o="object",m="application/x-shockwave-flash",v=window,i=document,j=navigator,g=function(){var a=typeof i.getElementById!=l&&typeof i.getElementsByTagName!=l&&typeof i.createElement!=l,
+b=j.userAgent.toLowerCase(),d=j.platform.toLowerCase(),g=d?/win/.test(d):/win/.test(b),d=d?/mac/.test(d):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,k=!+"\u000b1",e=[0,0,0],c=null;if(typeof j.plugins!=l&&typeof j.plugins["Shockwave Flash"]==o){if((c=j.plugins["Shockwave Flash"].description)&&!(typeof j.mimeTypes!=l&&j.mimeTypes[m]&&!j.mimeTypes[m].enabledPlugin))k=!1,c=c.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(c.replace(/^(.*)\..*$/,"$1"),
+10),e[1]=parseInt(c.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(c)?parseInt(c.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof v.ActiveXObject!=l)try{var f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(f&&(c=f.GetVariable("$version")))k=!0,c=c.split(" ")[1].split(","),e=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]}catch(h){}return{w3:a,pv:e,wk:b,ie:k,win:g,mac:d}}();return{embedSWF:function(a,b,d,i,k,e,c,f,h){var j={success:!1,id:b};if(g.w3&&!(g.wk&&g.wk<312)&&
+a&&b&&d&&i&&k){d+="";i+="";var p={};if(f&&typeof f===o)for(var m in f)p[m]=f[m];p.data=a;p.width=d;p.height=i;a={};if(c&&typeof c===o)for(var n in c)a[n]=c[n];if(e&&typeof e===o)for(var r in e)typeof a.flashvars!=l?a.flashvars+="&"+r+"="+e[r]:a.flashvars=r+"="+e[r];if(t(k))b=s(p,a,b),j.success=!0,j.ref=b}h&&h(j)},ua:g,getFlashPlayerVersion:function(){return{major:g.pv[0],minor:g.pv[1],release:g.pv[2]}},hasFlashPlayerVersion:t,createSWF:function(a,b,d){if(g.w3)return s(a,b,d)},getQueryParamValue:function(a){var b=
+i.location.search||i.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(a==null)return u(b);for(var b=b.split("&"),d=0;d');
+ (function(){
+ var pinboardLinkroll = document.createElement('script');
+ pinboardLinkroll.type = 'text/javascript';
+ pinboardLinkroll.async = true;
+ pinboardLinkroll.src = url;
+ document.getElementsByTagName('head')[0].appendChild(pinboardLinkroll);
+ })();
+}
+
+function pinboardNS_show_bmarks(r) {
+ var lr = new Pinboard_Linkroll();
+ lr.set_items(r);
+ lr.show_bmarks();
+}
+
+function Pinboard_Linkroll() {
+ var items;
+
+ this.set_items = function(i) {
+ this.items = i;
+ }
+ this.show_bmarks = function() {
+ var lines = [];
+ for (var i = 0; i < this.items.length; i++) {
+ var item = this.items[i];
+ var str = this.format_item(item);
+ lines.push(str);
+ }
+ document.getElementById(linkroll).innerHTML = lines.join("\n");
+ }
+ this.cook = function(v) {
+ return v.replace('<', '<').replace('>', '>>');
+ }
+
+ this.format_item = function(it) {
+ var str = "";
+ if (!it.d) { return; }
+ str += "" + this.cook(it.d) + " ";
+ if (it.n) {
+ str += "" + this.cook(it.n) + " \n";
+ }
+ if (it.t.length > 0) {
+ for (var i = 0; i < it.t.length; i++) {
+ var tag = it.t[i];
+ str += " " + this.cook(tag).replace(/^\s+|\s+$/g, '') + " ";
+ }
+ }
+ str += "
\n";
+ return str;
+ }
+}
+Pinboard_Linkroll.prototype = new Pinboard_Linkroll();
+pinboardNS_fetch_script("https://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count="+pinboard_count);
+
diff --git a/source/javascripts/twitter.js b/source/javascripts/twitter.js
new file mode 100644
index 00000000..3e2dd0d7
--- /dev/null
+++ b/source/javascripts/twitter.js
@@ -0,0 +1,78 @@
+// JSON-P Twitter fetcher for Octopress
+// (c) Brandon Mathis // MIT License
+
+/* Sky Slavin, Ludopoli. MIT license. * based on JavaScript Pretty Date * Copyright (c) 2008 John Resig (jquery.com) * Licensed under the MIT license. */
+function prettyDate(time) {
+ if (navigator.appName === 'Microsoft Internet Explorer') {
+ return "∞ "; // because IE date parsing isn't fun.
+ }
+ var say = {
+ just_now: " now",
+ minute_ago: "1m",
+ minutes_ago: "m",
+ hour_ago: "1h",
+ hours_ago: "h",
+ yesterday: "1d",
+ days_ago: "d",
+ last_week: "1w",
+ weeks_ago: "w"
+ };
+
+ var current_date = new Date(),
+ current_date_time = current_date.getTime(),
+ current_date_full = current_date_time + (1 * 60000),
+ date = new Date(time),
+ diff = ((current_date_full - date.getTime()) / 1000),
+ day_diff = Math.floor(diff / 86400);
+
+ if (isNaN(day_diff) || day_diff < 0) { return "∞ "; }
+
+ return day_diff === 0 && (
+ diff < 60 && say.just_now ||
+ diff < 120 && say.minute_ago ||
+ diff < 3600 && Math.floor(diff / 60) + say.minutes_ago ||
+ diff < 7200 && say.hour_ago ||
+ diff < 86400 && Math.floor(diff / 3600) + say.hours_ago) ||
+ day_diff === 1 && say.yesterday ||
+ day_diff < 7 && day_diff + say.days_ago ||
+ day_diff === 7 && say.last_week ||
+ day_diff > 7 && Math.ceil(day_diff / 7) + say.weeks_ago;
+}
+
+function linkifyTweet(text, url) {
+ // Linkify urls, usernames, hashtags
+ text = text.replace(/(https?:\/\/)([\w\-:;?&=+.%#\/]+)/gi, '$2 ')
+ .replace(/(^|\W)@(\w+)/g, '$1@$2 ')
+ .replace(/(^|\W)#(\w+)/g, '$1#$2 ');
+
+ // Use twitter's api to replace t.co shortened urls with expanded ones.
+ for (var u in url) {
+ if(url[u].expanded_url != null){
+ var shortUrl = new RegExp(url[u].url, 'g');
+ text = text.replace(shortUrl, url[u].expanded_url);
+ var shortUrl = new RegExp(">"+(url[u].url.replace(/https?:\/\//, '')), 'g');
+ text = text.replace(shortUrl, ">"+url[u].display_url);
+ }
+ }
+ return text
+}
+
+function showTwitterFeed(tweets, twitter_user) {
+ var timeline = document.getElementById('tweets'),
+ content = '';
+
+ for (var t in tweets) {
+ content += ''+''+''+prettyDate(tweets[t].created_at)+' '+linkifyTweet(tweets[t].text.replace(/\n/g, ' '), tweets[t].entities.urls)+'
'+' ';
+ }
+ timeline.innerHTML = content;
+}
+
+function getTwitterFeed(user, count, replies) {
+ count = parseInt(count, 10);
+ $.ajax({
+ url: "https://api.twitter.com/1/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + (count + 20) + "&include_entities=1&exclude_replies=" + (replies ? "0" : "1") + "&callback=?"
+ , type: 'jsonp'
+ , error: function (err) { $('#tweets li.loading').addClass('error').text("Twitter's busted"); }
+ , success: function(data) { showTwitterFeed(data.slice(0, count), user); }
+ })
+}
diff --git a/source/members/group-photo-2014.jpg b/source/members/group-photo-2014.jpg
new file mode 100644
index 00000000..3b0b9492
Binary files /dev/null and b/source/members/group-photo-2014.jpg differ
diff --git a/source/members/group-photo-2015.jpg b/source/members/group-photo-2015.jpg
new file mode 100644
index 00000000..342d051c
Binary files /dev/null and b/source/members/group-photo-2015.jpg differ
diff --git a/source/members/group-photo.png b/source/members/group-photo.png
new file mode 100644
index 00000000..522f30d0
Binary files /dev/null and b/source/members/group-photo.png differ
diff --git a/source/members/index.markdown b/source/members/index.markdown
new file mode 100644
index 00000000..a907d068
--- /dev/null
+++ b/source/members/index.markdown
@@ -0,0 +1,86 @@
+---
+layout: page
+title: "Members"
+date: 2013-01-20 11:36
+comments: false
+sharing: false
+footer: false
+---
+
+[comment]: <> ( )
+
+Faculty
+
+
+
+
+PhD Students
+
+
+ Nashid Noor (Jan 2020 - present)
+ Rahul Krishna (Sep 2017 - present)
+ Mohammad Bajammal (Jan 2017 - present)
+ Quinn Hanam (Jan 2015 -- present)
+
+
+Master Students
+
+
+ Marjane Namavar (Sep 2019 - present)
+ Amirhossein Abbasi Makhshari (Sep 2019 - present)
+
+
+Graduated (Alumni)
+
+ Davood Mazinanian (post-doc, Oct 2017 - May 2019)
+
+ Andrea Stocco (post-doc, Jan 2017 - Jan 2019)
+
+ Saba Alimadadi (PhD, November 2017, dissertation) . Now Assistant Professor at SFU
+
+ Amin Milani Fard (PhD, January 2017, dissertation )
+ Mohamed Ali (MASc 2016 )
+
+ Frolin Ocariza Jr. (PhD, October 2016, dissertation)
+
+ Arash Vahabzadeh (MASc 2016 )
+
+ Yucheng Zhang (MASc 2016 )
+
+ Mona Erfani Joorabchi (PhD, April 2016, dissertation )
+
+ Keheliya Gallaba (MASc 2015 , co-supervised with Ivan Beschastnikh )
+
+ Shabnam Mirshokraie (PhD, October 2015, dissertation )
+
+ Kartik Bajaj (MASc 2014 )
+ Golnaz Gharachorlu (MASc 2014 )
+ Sheldon Sequeira (MASc 2014 )
+ Mehdi Mirzaaghaei (post-doc 2014)
+ Charanpreet Toor (MEng 2014)
+ Alireza Zarei (MASc 2014 )
+ Zahra Behfarshad (MASc 2013 )
+ Alex Nederlof (MSc 2013 ), co-supervised with Arie van Deursen
+ Jeremy Hewett (MEng 2013)
+ Prabhjot Singh (MEng 2013)
+
+
+Interns/Visitors
+
+ Oksana Hlushko (2019)
+ Fernando Brito, Mitacs Global Link (2015)
+ Gregory Zhang (2014)
+ Erin Bush, NSERC USRA (2014)
+ Aakanksha Saha, Mitacs Global Link (2014)
+ Joseph Hejderup, TU Delft (2014)
+ Mohamed Ali, NSERC USRA (2013)
+ Nainy Argawal, Mitacs Global Link (2013)
+
+
+
+
diff --git a/source/mission/index.markdown b/source/mission/index.markdown
new file mode 100644
index 00000000..43930e55
--- /dev/null
+++ b/source/mission/index.markdown
@@ -0,0 +1,12 @@
+---
+layout: page
+title: "Mission"
+date: 2013-01-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+The main mission of the Software AnaLysis and Testing (SALT) lab is to explore novel and automated techniques for supporting software dependability and evolution. Our main focus is currently on analysis and testing, fault localization and debugging, program comprehension, as well as software maintenance and evolution of modern web-based and mobile applications.
+
+SALT Lab is part of the department of Electrical and Computer Engineering , faculty of Applied Science , University of British Columbia (UBC).
\ No newline at end of file
diff --git a/source/open-positions/496.markdown b/source/open-positions/496.markdown
new file mode 100644
index 00000000..2d7ebf35
--- /dev/null
+++ b/source/open-positions/496.markdown
@@ -0,0 +1,41 @@
+---
+layout: page
+title: "EECE 496"
+date: 2013-01-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+
496 Projects
+
+The SALT lab is offering the following projects as part of EECE 496 at UBC.
+
+
+
+List of Projects
+
+
+
+CSS Analysis and Visualization: CSS is a widely used language for describing the presentation semantics of HTML elements on the web. The
+language has a number of characteristics, such as inheritance
+and cascading order, which makes maintaining CSS code a
+challenging task for web developers. As a result, it is common
+for unused rules to be accumulated over time. Our lab has developed a software tool called CILLA, which is written in Java and is capable of automatically detecting unused CSS code in web applications. The goal of this 496 project is to build a visualization component for the textual output produced by CILLA by linking the detected unused code to the original CSS code so that developers can easily see which parts of the code needs maintenance and cleaning up activities.
+
+Mobile Application Navigation : This project offers an opportunity to explore how web applications running on mobile operating systems such as iOS (on e.g., iPhone, iPad) and Android can be automatically navigated and analyzed for cross-platform compatibility.
+
+Crawljax Plugins: Crawljax is a web crawler (see crawljax.com ) that can navigate any modern standards-based web application including JavaScript and Ajax-based ones. Crawljax has a plugin-based architecture and there are already many plugins available. This 496 project aims at designing and developing new generic web crawling and analysis plugins.
+
+
+
+
+These projects require strong programming skills. Students are expected to be committed and be able to work relatively independently as far as the implementation steps are concerned. There will be regular meetings to discuss the milestones on a conceptual/design level throughout the project.
+
+
+If you have other interesting EECE 496 projects in the areas of web and software engineering, send me an email and we can discuss the possibilities.
+
+
+
+
\ No newline at end of file
diff --git a/source/open-positions/index.markdown b/source/open-positions/index.markdown
new file mode 100644
index 00000000..d9c7836f
--- /dev/null
+++ b/source/open-positions/index.markdown
@@ -0,0 +1,56 @@
+---
+layout: page
+title: "Open Positions"
+date: 2013-01-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+Postdoctoral Position
+A postdoctoral position is available in the SALT lab starting January 1, 2018 (negotiable). The term of the position is one year with a possible extension.
+Strong applicants are solicited in the broad areas of software engineering, software analysis and testing, bug prediction/detection/repair, web and mobile engineering, and software maintenance and evolution.
+
+Applications for this position should:
+
+have received (or soon expect to receive) their PhD
+have a strong publication record in software engineering and/or related venues
+strong software engineering skills
+
+
+If interested, please send a CV and a brief research statement to Dr. Mesbah , and arrange to have 3 letters of recommendation directly sent to the same email address.
+
+
+PhD and Master Students
+
+ We currently have PhD and MSc positions in the SALT lab. There are a number of exciting projects for graduate students with strong academic background and experience in software engineering, software analysis and testing, web and mobile engineering, and/or related areas of research. Interested candidates may contact Dr. Mesbah provided they meet the following criteria:
+
+
+ Strong academic background
+
+ Excellent programming skills
+
+ PhD applicants: Published or submitted ACM/IEEE papers from your Master's work. Having publications will strengthen your case.
+
+
+
+ Visit this page for general information about admission requirements and deadlines.
+
+
+
+ Undergraduate Research Assistantships
+
+
+ Each year, we have a number of USRA (Undergraduate Student Research Awards) interns in the SALT lab. If you are interested, contact Dr. Mesbah before the departmental deadline .
+
+
+ We also have a number of exciting EECE 496 thesis projects for strong undergrad students.
+
+
+ International undergraduate students should consider the MITACS Global Link projects. These are fully funded summer research projects. We are offering a number of research projects there for top international students.
+
+
+
+
+
+ VIDEO
diff --git a/source/publications/docs/UBC-SALT-2014-001.pdf b/source/publications/docs/UBC-SALT-2014-001.pdf
new file mode 100644
index 00000000..7b5f9c9c
Binary files /dev/null and b/source/publications/docs/UBC-SALT-2014-001.pdf differ
diff --git a/source/publications/docs/UBC-SALT-2014-002.pdf b/source/publications/docs/UBC-SALT-2014-002.pdf
new file mode 100644
index 00000000..23712228
Binary files /dev/null and b/source/publications/docs/UBC-SALT-2014-002.pdf differ
diff --git a/source/publications/docs/ase13.pdf b/source/publications/docs/ase13.pdf
new file mode 100644
index 00000000..d20fe65f
Binary files /dev/null and b/source/publications/docs/ase13.pdf differ
diff --git a/source/publications/docs/ase15-confix.pdf b/source/publications/docs/ase15-confix.pdf
new file mode 100644
index 00000000..f6bd3cc9
Binary files /dev/null and b/source/publications/docs/ase15-confix.pdf differ
diff --git a/source/publications/docs/ase15-led.pdf b/source/publications/docs/ase15-led.pdf
new file mode 100644
index 00000000..1ec870dc
Binary files /dev/null and b/source/publications/docs/ase15-led.pdf differ
diff --git a/source/publications/docs/ase17.pdf b/source/publications/docs/ase17.pdf
new file mode 100644
index 00000000..e17aad23
Binary files /dev/null and b/source/publications/docs/ase17.pdf differ
diff --git a/source/publications/docs/ase18.pdf b/source/publications/docs/ase18.pdf
new file mode 100644
index 00000000..472b0632
Binary files /dev/null and b/source/publications/docs/ase18.pdf differ
diff --git a/source/publications/docs/azarei-masc-thesis14.pdf b/source/publications/docs/azarei-masc-thesis14.pdf
new file mode 100644
index 00000000..f8d838df
Binary files /dev/null and b/source/publications/docs/azarei-masc-thesis14.pdf differ
diff --git a/source/publications/docs/clematis-icse14.pdf b/source/publications/docs/clematis-icse14.pdf
new file mode 100644
index 00000000..fb8a5869
Binary files /dev/null and b/source/publications/docs/clematis-icse14.pdf differ
diff --git a/source/publications/docs/deepdelta-fse19.pdf b/source/publications/docs/deepdelta-fse19.pdf
new file mode 100644
index 00000000..753ec928
Binary files /dev/null and b/source/publications/docs/deepdelta-fse19.pdf differ
diff --git a/source/publications/docs/dompletion-ase14.pdf b/source/publications/docs/dompletion-ase14.pdf
new file mode 100644
index 00000000..82c69077
Binary files /dev/null and b/source/publications/docs/dompletion-ase14.pdf differ
diff --git a/source/publications/docs/ecoop15.pdf b/source/publications/docs/ecoop15.pdf
new file mode 100644
index 00000000..aadb8976
Binary files /dev/null and b/source/publications/docs/ecoop15.pdf differ
diff --git a/source/publications/docs/fose16.pdf b/source/publications/docs/fose16.pdf
new file mode 100644
index 00000000..8d4266be
Binary files /dev/null and b/source/publications/docs/fose16.pdf differ
diff --git a/source/publications/docs/frolin-tse16.pdf b/source/publications/docs/frolin-tse16.pdf
new file mode 100644
index 00000000..3d3db510
Binary files /dev/null and b/source/publications/docs/frolin-tse16.pdf differ
diff --git a/source/publications/docs/fse14.pdf b/source/publications/docs/fse14.pdf
new file mode 100644
index 00000000..589ba315
Binary files /dev/null and b/source/publications/docs/fse14.pdf differ
diff --git a/source/publications/docs/fse15.pdf b/source/publications/docs/fse15.pdf
new file mode 100644
index 00000000..ac317745
Binary files /dev/null and b/source/publications/docs/fse15.pdf differ
diff --git a/source/publications/docs/fse16.pdf b/source/publications/docs/fse16.pdf
new file mode 100644
index 00000000..b15865b4
Binary files /dev/null and b/source/publications/docs/fse16.pdf differ
diff --git a/source/publications/docs/fse18-vista.pdf b/source/publications/docs/fse18-vista.pdf
new file mode 100644
index 00000000..d58d5590
Binary files /dev/null and b/source/publications/docs/fse18-vista.pdf differ
diff --git a/source/publications/docs/icse14-seip.pdf b/source/publications/docs/icse14-seip.pdf
new file mode 100644
index 00000000..4a528d8d
Binary files /dev/null and b/source/publications/docs/icse14-seip.pdf differ
diff --git a/source/publications/docs/icse15.pdf b/source/publications/docs/icse15.pdf
new file mode 100644
index 00000000..f67de612
Binary files /dev/null and b/source/publications/docs/icse15.pdf differ
diff --git a/source/publications/docs/icse16.pdf b/source/publications/docs/icse16.pdf
new file mode 100644
index 00000000..acfe3de9
Binary files /dev/null and b/source/publications/docs/icse16.pdf differ
diff --git a/source/publications/docs/icse18-sabalan.pdf b/source/publications/docs/icse18-sabalan.pdf
new file mode 100644
index 00000000..121c11c1
Binary files /dev/null and b/source/publications/docs/icse18-sabalan.pdf differ
diff --git a/source/publications/docs/icse18-testler.pdf b/source/publications/docs/icse18-testler.pdf
new file mode 100644
index 00000000..faf7f571
Binary files /dev/null and b/source/publications/docs/icse18-testler.pdf differ
diff --git a/source/publications/docs/icse19.pdf b/source/publications/docs/icse19.pdf
new file mode 100644
index 00000000..62984eea
Binary files /dev/null and b/source/publications/docs/icse19.pdf differ
diff --git a/source/publications/docs/icse20.pdf b/source/publications/docs/icse20.pdf
new file mode 100644
index 00000000..251930c4
Binary files /dev/null and b/source/publications/docs/icse20.pdf differ
diff --git a/source/publications/docs/icsme15.pdf b/source/publications/docs/icsme15.pdf
new file mode 100644
index 00000000..443854d3
Binary files /dev/null and b/source/publications/docs/icsme15.pdf differ
diff --git a/source/publications/docs/icsme17.pdf b/source/publications/docs/icsme17.pdf
new file mode 100644
index 00000000..c47edbb2
Binary files /dev/null and b/source/publications/docs/icsme17.pdf differ
diff --git a/source/publications/docs/icsme19.pdf b/source/publications/docs/icsme19.pdf
new file mode 100644
index 00000000..82144cc7
Binary files /dev/null and b/source/publications/docs/icsme19.pdf differ
diff --git a/source/publications/docs/icst10.pdf b/source/publications/docs/icst10.pdf
new file mode 100644
index 00000000..c43d3113
Binary files /dev/null and b/source/publications/docs/icst10.pdf differ
diff --git a/source/publications/docs/icst15.pdf b/source/publications/docs/icst15.pdf
new file mode 100644
index 00000000..82bc5325
Binary files /dev/null and b/source/publications/docs/icst15.pdf differ
diff --git a/source/publications/docs/icst16.pdf b/source/publications/docs/icst16.pdf
new file mode 100644
index 00000000..dca18c62
Binary files /dev/null and b/source/publications/docs/icst16.pdf differ
diff --git a/source/publications/docs/icst17.pdf b/source/publications/docs/icst17.pdf
new file mode 100644
index 00000000..be074598
Binary files /dev/null and b/source/publications/docs/icst17.pdf differ
diff --git a/source/publications/docs/icst18.pdf b/source/publications/docs/icst18.pdf
new file mode 100644
index 00000000..1c8d080d
Binary files /dev/null and b/source/publications/docs/icst18.pdf differ
diff --git a/source/publications/docs/icst19.pdf b/source/publications/docs/icst19.pdf
new file mode 100644
index 00000000..fe6b6f29
Binary files /dev/null and b/source/publications/docs/icst19.pdf differ
diff --git a/source/publications/docs/issre15.pdf b/source/publications/docs/issre15.pdf
new file mode 100644
index 00000000..5fed4f74
Binary files /dev/null and b/source/publications/docs/issre15.pdf differ
diff --git a/source/publications/docs/issta14.pdf b/source/publications/docs/issta14.pdf
new file mode 100644
index 00000000..1b7574c3
Binary files /dev/null and b/source/publications/docs/issta14.pdf differ
diff --git a/source/publications/docs/jss08.pdf b/source/publications/docs/jss08.pdf
new file mode 100644
index 00000000..0f5f9dc0
Binary files /dev/null and b/source/publications/docs/jss08.pdf differ
diff --git a/source/publications/docs/kartik-msr14.pdf b/source/publications/docs/kartik-msr14.pdf
new file mode 100644
index 00000000..271ac7bb
Binary files /dev/null and b/source/publications/docs/kartik-msr14.pdf differ
diff --git a/source/publications/docs/mesbah-dissertation.pdf b/source/publications/docs/mesbah-dissertation.pdf
new file mode 100644
index 00000000..f12a0a27
Binary files /dev/null and b/source/publications/docs/mesbah-dissertation.pdf differ
diff --git a/source/publications/docs/mobilesoft17.pdf b/source/publications/docs/mobilesoft17.pdf
new file mode 100644
index 00000000..50beb250
Binary files /dev/null and b/source/publications/docs/mobilesoft17.pdf differ
diff --git a/source/publications/docs/mona-msr14.pdf b/source/publications/docs/mona-msr14.pdf
new file mode 100644
index 00000000..b1bdc1a2
Binary files /dev/null and b/source/publications/docs/mona-msr14.pdf differ
diff --git a/source/publications/docs/mutandis-tse.pdf b/source/publications/docs/mutandis-tse.pdf
new file mode 100644
index 00000000..4d7d6a72
Binary files /dev/null and b/source/publications/docs/mutandis-tse.pdf differ
diff --git a/source/publications/docs/roundtable16.pdf b/source/publications/docs/roundtable16.pdf
new file mode 100644
index 00000000..85e63439
Binary files /dev/null and b/source/publications/docs/roundtable16.pdf differ
diff --git a/source/publications/docs/stvr15-frolin.pdf b/source/publications/docs/stvr15-frolin.pdf
new file mode 100644
index 00000000..7bf0b385
Binary files /dev/null and b/source/publications/docs/stvr15-frolin.pdf differ
diff --git a/source/publications/docs/tedd-fse19.pdf b/source/publications/docs/tedd-fse19.pdf
new file mode 100644
index 00000000..e77bc119
Binary files /dev/null and b/source/publications/docs/tedd-fse19.pdf differ
diff --git a/source/publications/docs/testilizer-ase14.pdf b/source/publications/docs/testilizer-ase14.pdf
new file mode 100644
index 00000000..859094fe
Binary files /dev/null and b/source/publications/docs/testilizer-ase14.pdf differ
diff --git a/source/publications/docs/tosem16.pdf b/source/publications/docs/tosem16.pdf
new file mode 100644
index 00000000..126485ce
Binary files /dev/null and b/source/publications/docs/tosem16.pdf differ
diff --git a/source/publications/docs/vejovis-icse14.pdf b/source/publications/docs/vejovis-icse14.pdf
new file mode 100644
index 00000000..cd475922
Binary files /dev/null and b/source/publications/docs/vejovis-icse14.pdf differ
diff --git a/source/publications/index.markdown b/source/publications/index.markdown
new file mode 100644
index 00000000..a09e2d13
--- /dev/null
+++ b/source/publications/index.markdown
@@ -0,0 +1,17 @@
+---
+layout: page
+title: "Publications"
+comments: false
+sharing: false
+footer: false
+sidebar: false
+---
+
+
+
+{% for myyear in (2007..2020) reversed %}
+
{{myyear}}
+ {% bibliography --query @*[year={{myyear}}] %}
+{% endfor %}
+
+
\ No newline at end of file
diff --git a/source/robots.txt b/source/robots.txt
new file mode 100644
index 00000000..ee34c720
--- /dev/null
+++ b/source/robots.txt
@@ -0,0 +1,7 @@
+---
+layout: null
+---
+User-agent: *
+Disallow:
+
+Sitemap: {{ site.url }}/sitemap.xml
diff --git a/source/slides/dompletion-ase14.pdf b/source/slides/dompletion-ase14.pdf
new file mode 100644
index 00000000..27e3d61b
Binary files /dev/null and b/source/slides/dompletion-ase14.pdf differ
diff --git a/source/slides/icse14-clematis.pdf b/source/slides/icse14-clematis.pdf
new file mode 100644
index 00000000..9d34b1fe
Binary files /dev/null and b/source/slides/icse14-clematis.pdf differ
diff --git a/source/slides/icse14-seip.pdf b/source/slides/icse14-seip.pdf
new file mode 100644
index 00000000..e3c54855
Binary files /dev/null and b/source/slides/icse14-seip.pdf differ
diff --git a/source/slides/icse14-vejovis.pdf b/source/slides/icse14-vejovis.pdf
new file mode 100644
index 00000000..03184b17
Binary files /dev/null and b/source/slides/icse14-vejovis.pdf differ
diff --git a/source/slides/issta14.pdf b/source/slides/issta14.pdf
new file mode 100644
index 00000000..80b69bab
Binary files /dev/null and b/source/slides/issta14.pdf differ
diff --git a/source/slides/msr14-nr.pdf b/source/slides/msr14-nr.pdf
new file mode 100644
index 00000000..4fdb99b3
Binary files /dev/null and b/source/slides/msr14-nr.pdf differ
diff --git a/source/slides/msr14-so.pdf b/source/slides/msr14-so.pdf
new file mode 100644
index 00000000..b06c5d85
Binary files /dev/null and b/source/slides/msr14-so.pdf differ
diff --git a/source/slides/ppt/icse14-clematis.pptx b/source/slides/ppt/icse14-clematis.pptx
new file mode 100644
index 00000000..63ac10ed
Binary files /dev/null and b/source/slides/ppt/icse14-clematis.pptx differ
diff --git a/source/slides/ppt/icse14-vejovis.pptx b/source/slides/ppt/icse14-vejovis.pptx
new file mode 100644
index 00000000..bbb4b6bc
Binary files /dev/null and b/source/slides/ppt/icse14-vejovis.pptx differ
diff --git a/source/slides/ppt/msr14-nr.ppt b/source/slides/ppt/msr14-nr.ppt
new file mode 100644
index 00000000..985f642f
Binary files /dev/null and b/source/slides/ppt/msr14-nr.ppt differ
diff --git a/source/slides/ppt/msr14-so.pptx b/source/slides/ppt/msr14-so.pptx
new file mode 100644
index 00000000..6ef47a12
Binary files /dev/null and b/source/slides/ppt/msr14-so.pptx differ
diff --git a/software/assertion-study/experimental-data.zip b/source/software/assertion-study/experimental-data.zip
similarity index 100%
rename from software/assertion-study/experimental-data.zip
rename to source/software/assertion-study/experimental-data.zip
diff --git a/software/assertion-study/index.markdown b/source/software/assertion-study/index.markdown
similarity index 100%
rename from software/assertion-study/index.markdown
rename to source/software/assertion-study/index.markdown
diff --git a/software/bugaid-old/.index.html.swp b/source/software/bugaid-old/.index.html.swp
similarity index 100%
rename from software/bugaid-old/.index.html.swp
rename to source/software/bugaid-old/.index.html.swp
diff --git a/software/bugaid-old/bootstrap.css b/source/software/bugaid-old/bootstrap.css
similarity index 100%
rename from software/bugaid-old/bootstrap.css
rename to source/software/bugaid-old/bootstrap.css
diff --git a/software/bugaid-old/bootswatch.js b/source/software/bugaid-old/bootswatch.js
similarity index 100%
rename from software/bugaid-old/bootswatch.js
rename to source/software/bugaid-old/bootswatch.js
diff --git a/software/bugaid-old/bootswatch.min.css b/source/software/bugaid-old/bootswatch.min.css
similarity index 100%
rename from software/bugaid-old/bootswatch.min.css
rename to source/software/bugaid-old/bootswatch.min.css
diff --git a/software/bugaid-old/data/subject-apps.csv b/source/software/bugaid-old/data/subject-apps.csv
similarity index 100%
rename from software/bugaid-old/data/subject-apps.csv
rename to source/software/bugaid-old/data/subject-apps.csv
diff --git a/software/bugaid-old/data/subject-modules.csv b/source/software/bugaid-old/data/subject-modules.csv
similarity index 100%
rename from software/bugaid-old/data/subject-modules.csv
rename to source/software/bugaid-old/data/subject-modules.csv
diff --git a/software/bugaid-old/index.html b/source/software/bugaid-old/index.html
similarity index 100%
rename from software/bugaid-old/index.html
rename to source/software/bugaid-old/index.html
diff --git a/software/bugaid-old/jquery.csv-0.71.min.js b/source/software/bugaid-old/jquery.csv-0.71.min.js
similarity index 100%
rename from software/bugaid-old/jquery.csv-0.71.min.js
rename to source/software/bugaid-old/jquery.csv-0.71.min.js
diff --git a/software/bugaid-old/results/empirical_data.tar.gz b/source/software/bugaid-old/results/empirical_data.tar.gz
similarity index 100%
rename from software/bugaid-old/results/empirical_data.tar.gz
rename to source/software/bugaid-old/results/empirical_data.tar.gz
diff --git a/software/bugaid-old/results/tech-report.pdf b/source/software/bugaid-old/results/tech-report.pdf
similarity index 100%
rename from software/bugaid-old/results/tech-report.pdf
rename to source/software/bugaid-old/results/tech-report.pdf
diff --git a/software/bugaid-old/results/tuning_data.tar.gz b/source/software/bugaid-old/results/tuning_data.tar.gz
similarity index 100%
rename from software/bugaid-old/results/tuning_data.tar.gz
rename to source/software/bugaid-old/results/tuning_data.tar.gz
diff --git a/software/bugaid-old/table-bugs.png b/source/software/bugaid-old/table-bugs.png
similarity index 100%
rename from software/bugaid-old/table-bugs.png
rename to source/software/bugaid-old/table-bugs.png
diff --git a/software/bugaid/bootstrap.css b/source/software/bugaid/bootstrap.css
similarity index 100%
rename from software/bugaid/bootstrap.css
rename to source/software/bugaid/bootstrap.css
diff --git a/software/bugaid/bootswatch.js b/source/software/bugaid/bootswatch.js
similarity index 100%
rename from software/bugaid/bootswatch.js
rename to source/software/bugaid/bootswatch.js
diff --git a/software/bugaid/bootswatch.min.css b/source/software/bugaid/bootswatch.min.css
similarity index 100%
rename from software/bugaid/bootswatch.min.css
rename to source/software/bugaid/bootswatch.min.css
diff --git a/software/bugaid/custom.css b/source/software/bugaid/custom.css
similarity index 100%
rename from software/bugaid/custom.css
rename to source/software/bugaid/custom.css
diff --git a/software/bugaid/custom.js b/source/software/bugaid/custom.js
similarity index 100%
rename from software/bugaid/custom.js
rename to source/software/bugaid/custom.js
diff --git a/software/bugaid/data/basic-change-types.csv b/source/software/bugaid/data/basic-change-types.csv
similarity index 100%
rename from software/bugaid/data/basic-change-types.csv
rename to source/software/bugaid/data/basic-change-types.csv
diff --git a/software/bugaid/data/bug-patterns.csv b/source/software/bugaid/data/bug-patterns.csv
similarity index 100%
rename from software/bugaid/data/bug-patterns.csv
rename to source/software/bugaid/data/bug-patterns.csv
diff --git a/software/bugaid/data/clusters/0.csv b/source/software/bugaid/data/clusters/0.csv
similarity index 100%
rename from software/bugaid/data/clusters/0.csv
rename to source/software/bugaid/data/clusters/0.csv
diff --git a/software/bugaid/data/clusters/1.csv b/source/software/bugaid/data/clusters/1.csv
similarity index 100%
rename from software/bugaid/data/clusters/1.csv
rename to source/software/bugaid/data/clusters/1.csv
diff --git a/software/bugaid/data/clusters/10.csv b/source/software/bugaid/data/clusters/10.csv
similarity index 100%
rename from software/bugaid/data/clusters/10.csv
rename to source/software/bugaid/data/clusters/10.csv
diff --git a/software/bugaid/data/clusters/100.csv b/source/software/bugaid/data/clusters/100.csv
similarity index 100%
rename from software/bugaid/data/clusters/100.csv
rename to source/software/bugaid/data/clusters/100.csv
diff --git a/software/bugaid/data/clusters/101.csv b/source/software/bugaid/data/clusters/101.csv
similarity index 100%
rename from software/bugaid/data/clusters/101.csv
rename to source/software/bugaid/data/clusters/101.csv
diff --git a/software/bugaid/data/clusters/102.csv b/source/software/bugaid/data/clusters/102.csv
similarity index 100%
rename from software/bugaid/data/clusters/102.csv
rename to source/software/bugaid/data/clusters/102.csv
diff --git a/software/bugaid/data/clusters/103.csv b/source/software/bugaid/data/clusters/103.csv
similarity index 100%
rename from software/bugaid/data/clusters/103.csv
rename to source/software/bugaid/data/clusters/103.csv
diff --git a/software/bugaid/data/clusters/104.csv b/source/software/bugaid/data/clusters/104.csv
similarity index 100%
rename from software/bugaid/data/clusters/104.csv
rename to source/software/bugaid/data/clusters/104.csv
diff --git a/software/bugaid/data/clusters/105.csv b/source/software/bugaid/data/clusters/105.csv
similarity index 100%
rename from software/bugaid/data/clusters/105.csv
rename to source/software/bugaid/data/clusters/105.csv
diff --git a/software/bugaid/data/clusters/106.csv b/source/software/bugaid/data/clusters/106.csv
similarity index 100%
rename from software/bugaid/data/clusters/106.csv
rename to source/software/bugaid/data/clusters/106.csv
diff --git a/software/bugaid/data/clusters/107.csv b/source/software/bugaid/data/clusters/107.csv
similarity index 100%
rename from software/bugaid/data/clusters/107.csv
rename to source/software/bugaid/data/clusters/107.csv
diff --git a/software/bugaid/data/clusters/108.csv b/source/software/bugaid/data/clusters/108.csv
similarity index 100%
rename from software/bugaid/data/clusters/108.csv
rename to source/software/bugaid/data/clusters/108.csv
diff --git a/software/bugaid/data/clusters/109.csv b/source/software/bugaid/data/clusters/109.csv
similarity index 100%
rename from software/bugaid/data/clusters/109.csv
rename to source/software/bugaid/data/clusters/109.csv
diff --git a/software/bugaid/data/clusters/11.csv b/source/software/bugaid/data/clusters/11.csv
similarity index 100%
rename from software/bugaid/data/clusters/11.csv
rename to source/software/bugaid/data/clusters/11.csv
diff --git a/software/bugaid/data/clusters/110.csv b/source/software/bugaid/data/clusters/110.csv
similarity index 100%
rename from software/bugaid/data/clusters/110.csv
rename to source/software/bugaid/data/clusters/110.csv
diff --git a/software/bugaid/data/clusters/111.csv b/source/software/bugaid/data/clusters/111.csv
similarity index 100%
rename from software/bugaid/data/clusters/111.csv
rename to source/software/bugaid/data/clusters/111.csv
diff --git a/software/bugaid/data/clusters/112.csv b/source/software/bugaid/data/clusters/112.csv
similarity index 100%
rename from software/bugaid/data/clusters/112.csv
rename to source/software/bugaid/data/clusters/112.csv
diff --git a/software/bugaid/data/clusters/113.csv b/source/software/bugaid/data/clusters/113.csv
similarity index 100%
rename from software/bugaid/data/clusters/113.csv
rename to source/software/bugaid/data/clusters/113.csv
diff --git a/software/bugaid/data/clusters/114.csv b/source/software/bugaid/data/clusters/114.csv
similarity index 100%
rename from software/bugaid/data/clusters/114.csv
rename to source/software/bugaid/data/clusters/114.csv
diff --git a/software/bugaid/data/clusters/115.csv b/source/software/bugaid/data/clusters/115.csv
similarity index 100%
rename from software/bugaid/data/clusters/115.csv
rename to source/software/bugaid/data/clusters/115.csv
diff --git a/software/bugaid/data/clusters/116.csv b/source/software/bugaid/data/clusters/116.csv
similarity index 100%
rename from software/bugaid/data/clusters/116.csv
rename to source/software/bugaid/data/clusters/116.csv
diff --git a/software/bugaid/data/clusters/117.csv b/source/software/bugaid/data/clusters/117.csv
similarity index 100%
rename from software/bugaid/data/clusters/117.csv
rename to source/software/bugaid/data/clusters/117.csv
diff --git a/software/bugaid/data/clusters/118.csv b/source/software/bugaid/data/clusters/118.csv
similarity index 100%
rename from software/bugaid/data/clusters/118.csv
rename to source/software/bugaid/data/clusters/118.csv
diff --git a/software/bugaid/data/clusters/119.csv b/source/software/bugaid/data/clusters/119.csv
similarity index 100%
rename from software/bugaid/data/clusters/119.csv
rename to source/software/bugaid/data/clusters/119.csv
diff --git a/software/bugaid/data/clusters/12.csv b/source/software/bugaid/data/clusters/12.csv
similarity index 100%
rename from software/bugaid/data/clusters/12.csv
rename to source/software/bugaid/data/clusters/12.csv
diff --git a/software/bugaid/data/clusters/120.csv b/source/software/bugaid/data/clusters/120.csv
similarity index 100%
rename from software/bugaid/data/clusters/120.csv
rename to source/software/bugaid/data/clusters/120.csv
diff --git a/software/bugaid/data/clusters/121.csv b/source/software/bugaid/data/clusters/121.csv
similarity index 100%
rename from software/bugaid/data/clusters/121.csv
rename to source/software/bugaid/data/clusters/121.csv
diff --git a/software/bugaid/data/clusters/122.csv b/source/software/bugaid/data/clusters/122.csv
similarity index 100%
rename from software/bugaid/data/clusters/122.csv
rename to source/software/bugaid/data/clusters/122.csv
diff --git a/software/bugaid/data/clusters/123.csv b/source/software/bugaid/data/clusters/123.csv
similarity index 100%
rename from software/bugaid/data/clusters/123.csv
rename to source/software/bugaid/data/clusters/123.csv
diff --git a/software/bugaid/data/clusters/124.csv b/source/software/bugaid/data/clusters/124.csv
similarity index 100%
rename from software/bugaid/data/clusters/124.csv
rename to source/software/bugaid/data/clusters/124.csv
diff --git a/software/bugaid/data/clusters/125.csv b/source/software/bugaid/data/clusters/125.csv
similarity index 100%
rename from software/bugaid/data/clusters/125.csv
rename to source/software/bugaid/data/clusters/125.csv
diff --git a/software/bugaid/data/clusters/126.csv b/source/software/bugaid/data/clusters/126.csv
similarity index 100%
rename from software/bugaid/data/clusters/126.csv
rename to source/software/bugaid/data/clusters/126.csv
diff --git a/software/bugaid/data/clusters/127.csv b/source/software/bugaid/data/clusters/127.csv
similarity index 100%
rename from software/bugaid/data/clusters/127.csv
rename to source/software/bugaid/data/clusters/127.csv
diff --git a/software/bugaid/data/clusters/128.csv b/source/software/bugaid/data/clusters/128.csv
similarity index 100%
rename from software/bugaid/data/clusters/128.csv
rename to source/software/bugaid/data/clusters/128.csv
diff --git a/software/bugaid/data/clusters/129.csv b/source/software/bugaid/data/clusters/129.csv
similarity index 100%
rename from software/bugaid/data/clusters/129.csv
rename to source/software/bugaid/data/clusters/129.csv
diff --git a/software/bugaid/data/clusters/13.csv b/source/software/bugaid/data/clusters/13.csv
similarity index 100%
rename from software/bugaid/data/clusters/13.csv
rename to source/software/bugaid/data/clusters/13.csv
diff --git a/software/bugaid/data/clusters/130.csv b/source/software/bugaid/data/clusters/130.csv
similarity index 100%
rename from software/bugaid/data/clusters/130.csv
rename to source/software/bugaid/data/clusters/130.csv
diff --git a/software/bugaid/data/clusters/131.csv b/source/software/bugaid/data/clusters/131.csv
similarity index 100%
rename from software/bugaid/data/clusters/131.csv
rename to source/software/bugaid/data/clusters/131.csv
diff --git a/software/bugaid/data/clusters/132.csv b/source/software/bugaid/data/clusters/132.csv
similarity index 100%
rename from software/bugaid/data/clusters/132.csv
rename to source/software/bugaid/data/clusters/132.csv
diff --git a/software/bugaid/data/clusters/133.csv b/source/software/bugaid/data/clusters/133.csv
similarity index 100%
rename from software/bugaid/data/clusters/133.csv
rename to source/software/bugaid/data/clusters/133.csv
diff --git a/software/bugaid/data/clusters/134.csv b/source/software/bugaid/data/clusters/134.csv
similarity index 100%
rename from software/bugaid/data/clusters/134.csv
rename to source/software/bugaid/data/clusters/134.csv
diff --git a/software/bugaid/data/clusters/135.csv b/source/software/bugaid/data/clusters/135.csv
similarity index 100%
rename from software/bugaid/data/clusters/135.csv
rename to source/software/bugaid/data/clusters/135.csv
diff --git a/software/bugaid/data/clusters/136.csv b/source/software/bugaid/data/clusters/136.csv
similarity index 100%
rename from software/bugaid/data/clusters/136.csv
rename to source/software/bugaid/data/clusters/136.csv
diff --git a/software/bugaid/data/clusters/137.csv b/source/software/bugaid/data/clusters/137.csv
similarity index 100%
rename from software/bugaid/data/clusters/137.csv
rename to source/software/bugaid/data/clusters/137.csv
diff --git a/software/bugaid/data/clusters/138.csv b/source/software/bugaid/data/clusters/138.csv
similarity index 100%
rename from software/bugaid/data/clusters/138.csv
rename to source/software/bugaid/data/clusters/138.csv
diff --git a/software/bugaid/data/clusters/139.csv b/source/software/bugaid/data/clusters/139.csv
similarity index 100%
rename from software/bugaid/data/clusters/139.csv
rename to source/software/bugaid/data/clusters/139.csv
diff --git a/software/bugaid/data/clusters/14.csv b/source/software/bugaid/data/clusters/14.csv
similarity index 100%
rename from software/bugaid/data/clusters/14.csv
rename to source/software/bugaid/data/clusters/14.csv
diff --git a/software/bugaid/data/clusters/140.csv b/source/software/bugaid/data/clusters/140.csv
similarity index 100%
rename from software/bugaid/data/clusters/140.csv
rename to source/software/bugaid/data/clusters/140.csv
diff --git a/software/bugaid/data/clusters/141.csv b/source/software/bugaid/data/clusters/141.csv
similarity index 100%
rename from software/bugaid/data/clusters/141.csv
rename to source/software/bugaid/data/clusters/141.csv
diff --git a/software/bugaid/data/clusters/142.csv b/source/software/bugaid/data/clusters/142.csv
similarity index 100%
rename from software/bugaid/data/clusters/142.csv
rename to source/software/bugaid/data/clusters/142.csv
diff --git a/software/bugaid/data/clusters/143.csv b/source/software/bugaid/data/clusters/143.csv
similarity index 100%
rename from software/bugaid/data/clusters/143.csv
rename to source/software/bugaid/data/clusters/143.csv
diff --git a/software/bugaid/data/clusters/144.csv b/source/software/bugaid/data/clusters/144.csv
similarity index 100%
rename from software/bugaid/data/clusters/144.csv
rename to source/software/bugaid/data/clusters/144.csv
diff --git a/software/bugaid/data/clusters/145.csv b/source/software/bugaid/data/clusters/145.csv
similarity index 100%
rename from software/bugaid/data/clusters/145.csv
rename to source/software/bugaid/data/clusters/145.csv
diff --git a/software/bugaid/data/clusters/146.csv b/source/software/bugaid/data/clusters/146.csv
similarity index 100%
rename from software/bugaid/data/clusters/146.csv
rename to source/software/bugaid/data/clusters/146.csv
diff --git a/software/bugaid/data/clusters/147.csv b/source/software/bugaid/data/clusters/147.csv
similarity index 100%
rename from software/bugaid/data/clusters/147.csv
rename to source/software/bugaid/data/clusters/147.csv
diff --git a/software/bugaid/data/clusters/148.csv b/source/software/bugaid/data/clusters/148.csv
similarity index 100%
rename from software/bugaid/data/clusters/148.csv
rename to source/software/bugaid/data/clusters/148.csv
diff --git a/software/bugaid/data/clusters/149.csv b/source/software/bugaid/data/clusters/149.csv
similarity index 100%
rename from software/bugaid/data/clusters/149.csv
rename to source/software/bugaid/data/clusters/149.csv
diff --git a/software/bugaid/data/clusters/15.csv b/source/software/bugaid/data/clusters/15.csv
similarity index 100%
rename from software/bugaid/data/clusters/15.csv
rename to source/software/bugaid/data/clusters/15.csv
diff --git a/software/bugaid/data/clusters/150.csv b/source/software/bugaid/data/clusters/150.csv
similarity index 100%
rename from software/bugaid/data/clusters/150.csv
rename to source/software/bugaid/data/clusters/150.csv
diff --git a/software/bugaid/data/clusters/151.csv b/source/software/bugaid/data/clusters/151.csv
similarity index 100%
rename from software/bugaid/data/clusters/151.csv
rename to source/software/bugaid/data/clusters/151.csv
diff --git a/software/bugaid/data/clusters/152.csv b/source/software/bugaid/data/clusters/152.csv
similarity index 100%
rename from software/bugaid/data/clusters/152.csv
rename to source/software/bugaid/data/clusters/152.csv
diff --git a/software/bugaid/data/clusters/153.csv b/source/software/bugaid/data/clusters/153.csv
similarity index 100%
rename from software/bugaid/data/clusters/153.csv
rename to source/software/bugaid/data/clusters/153.csv
diff --git a/software/bugaid/data/clusters/154.csv b/source/software/bugaid/data/clusters/154.csv
similarity index 100%
rename from software/bugaid/data/clusters/154.csv
rename to source/software/bugaid/data/clusters/154.csv
diff --git a/software/bugaid/data/clusters/155.csv b/source/software/bugaid/data/clusters/155.csv
similarity index 100%
rename from software/bugaid/data/clusters/155.csv
rename to source/software/bugaid/data/clusters/155.csv
diff --git a/software/bugaid/data/clusters/156.csv b/source/software/bugaid/data/clusters/156.csv
similarity index 100%
rename from software/bugaid/data/clusters/156.csv
rename to source/software/bugaid/data/clusters/156.csv
diff --git a/software/bugaid/data/clusters/157.csv b/source/software/bugaid/data/clusters/157.csv
similarity index 100%
rename from software/bugaid/data/clusters/157.csv
rename to source/software/bugaid/data/clusters/157.csv
diff --git a/software/bugaid/data/clusters/158.csv b/source/software/bugaid/data/clusters/158.csv
similarity index 100%
rename from software/bugaid/data/clusters/158.csv
rename to source/software/bugaid/data/clusters/158.csv
diff --git a/software/bugaid/data/clusters/159.csv b/source/software/bugaid/data/clusters/159.csv
similarity index 100%
rename from software/bugaid/data/clusters/159.csv
rename to source/software/bugaid/data/clusters/159.csv
diff --git a/software/bugaid/data/clusters/16.csv b/source/software/bugaid/data/clusters/16.csv
similarity index 100%
rename from software/bugaid/data/clusters/16.csv
rename to source/software/bugaid/data/clusters/16.csv
diff --git a/software/bugaid/data/clusters/160.csv b/source/software/bugaid/data/clusters/160.csv
similarity index 100%
rename from software/bugaid/data/clusters/160.csv
rename to source/software/bugaid/data/clusters/160.csv
diff --git a/software/bugaid/data/clusters/161.csv b/source/software/bugaid/data/clusters/161.csv
similarity index 100%
rename from software/bugaid/data/clusters/161.csv
rename to source/software/bugaid/data/clusters/161.csv
diff --git a/software/bugaid/data/clusters/162.csv b/source/software/bugaid/data/clusters/162.csv
similarity index 100%
rename from software/bugaid/data/clusters/162.csv
rename to source/software/bugaid/data/clusters/162.csv
diff --git a/software/bugaid/data/clusters/163.csv b/source/software/bugaid/data/clusters/163.csv
similarity index 100%
rename from software/bugaid/data/clusters/163.csv
rename to source/software/bugaid/data/clusters/163.csv
diff --git a/software/bugaid/data/clusters/164.csv b/source/software/bugaid/data/clusters/164.csv
similarity index 100%
rename from software/bugaid/data/clusters/164.csv
rename to source/software/bugaid/data/clusters/164.csv
diff --git a/software/bugaid/data/clusters/165.csv b/source/software/bugaid/data/clusters/165.csv
similarity index 100%
rename from software/bugaid/data/clusters/165.csv
rename to source/software/bugaid/data/clusters/165.csv
diff --git a/software/bugaid/data/clusters/166.csv b/source/software/bugaid/data/clusters/166.csv
similarity index 100%
rename from software/bugaid/data/clusters/166.csv
rename to source/software/bugaid/data/clusters/166.csv
diff --git a/software/bugaid/data/clusters/167.csv b/source/software/bugaid/data/clusters/167.csv
similarity index 100%
rename from software/bugaid/data/clusters/167.csv
rename to source/software/bugaid/data/clusters/167.csv
diff --git a/software/bugaid/data/clusters/168.csv b/source/software/bugaid/data/clusters/168.csv
similarity index 100%
rename from software/bugaid/data/clusters/168.csv
rename to source/software/bugaid/data/clusters/168.csv
diff --git a/software/bugaid/data/clusters/169.csv b/source/software/bugaid/data/clusters/169.csv
similarity index 100%
rename from software/bugaid/data/clusters/169.csv
rename to source/software/bugaid/data/clusters/169.csv
diff --git a/software/bugaid/data/clusters/17.csv b/source/software/bugaid/data/clusters/17.csv
similarity index 100%
rename from software/bugaid/data/clusters/17.csv
rename to source/software/bugaid/data/clusters/17.csv
diff --git a/software/bugaid/data/clusters/170.csv b/source/software/bugaid/data/clusters/170.csv
similarity index 100%
rename from software/bugaid/data/clusters/170.csv
rename to source/software/bugaid/data/clusters/170.csv
diff --git a/software/bugaid/data/clusters/171.csv b/source/software/bugaid/data/clusters/171.csv
similarity index 100%
rename from software/bugaid/data/clusters/171.csv
rename to source/software/bugaid/data/clusters/171.csv
diff --git a/software/bugaid/data/clusters/172.csv b/source/software/bugaid/data/clusters/172.csv
similarity index 100%
rename from software/bugaid/data/clusters/172.csv
rename to source/software/bugaid/data/clusters/172.csv
diff --git a/software/bugaid/data/clusters/173.csv b/source/software/bugaid/data/clusters/173.csv
similarity index 100%
rename from software/bugaid/data/clusters/173.csv
rename to source/software/bugaid/data/clusters/173.csv
diff --git a/software/bugaid/data/clusters/174.csv b/source/software/bugaid/data/clusters/174.csv
similarity index 100%
rename from software/bugaid/data/clusters/174.csv
rename to source/software/bugaid/data/clusters/174.csv
diff --git a/software/bugaid/data/clusters/175.csv b/source/software/bugaid/data/clusters/175.csv
similarity index 100%
rename from software/bugaid/data/clusters/175.csv
rename to source/software/bugaid/data/clusters/175.csv
diff --git a/software/bugaid/data/clusters/176.csv b/source/software/bugaid/data/clusters/176.csv
similarity index 100%
rename from software/bugaid/data/clusters/176.csv
rename to source/software/bugaid/data/clusters/176.csv
diff --git a/software/bugaid/data/clusters/177.csv b/source/software/bugaid/data/clusters/177.csv
similarity index 100%
rename from software/bugaid/data/clusters/177.csv
rename to source/software/bugaid/data/clusters/177.csv
diff --git a/software/bugaid/data/clusters/178.csv b/source/software/bugaid/data/clusters/178.csv
similarity index 100%
rename from software/bugaid/data/clusters/178.csv
rename to source/software/bugaid/data/clusters/178.csv
diff --git a/software/bugaid/data/clusters/179.csv b/source/software/bugaid/data/clusters/179.csv
similarity index 100%
rename from software/bugaid/data/clusters/179.csv
rename to source/software/bugaid/data/clusters/179.csv
diff --git a/software/bugaid/data/clusters/18.csv b/source/software/bugaid/data/clusters/18.csv
similarity index 100%
rename from software/bugaid/data/clusters/18.csv
rename to source/software/bugaid/data/clusters/18.csv
diff --git a/software/bugaid/data/clusters/180.csv b/source/software/bugaid/data/clusters/180.csv
similarity index 100%
rename from software/bugaid/data/clusters/180.csv
rename to source/software/bugaid/data/clusters/180.csv
diff --git a/software/bugaid/data/clusters/181.csv b/source/software/bugaid/data/clusters/181.csv
similarity index 100%
rename from software/bugaid/data/clusters/181.csv
rename to source/software/bugaid/data/clusters/181.csv
diff --git a/software/bugaid/data/clusters/182.csv b/source/software/bugaid/data/clusters/182.csv
similarity index 100%
rename from software/bugaid/data/clusters/182.csv
rename to source/software/bugaid/data/clusters/182.csv
diff --git a/software/bugaid/data/clusters/183.csv b/source/software/bugaid/data/clusters/183.csv
similarity index 100%
rename from software/bugaid/data/clusters/183.csv
rename to source/software/bugaid/data/clusters/183.csv
diff --git a/software/bugaid/data/clusters/184.csv b/source/software/bugaid/data/clusters/184.csv
similarity index 100%
rename from software/bugaid/data/clusters/184.csv
rename to source/software/bugaid/data/clusters/184.csv
diff --git a/software/bugaid/data/clusters/185.csv b/source/software/bugaid/data/clusters/185.csv
similarity index 100%
rename from software/bugaid/data/clusters/185.csv
rename to source/software/bugaid/data/clusters/185.csv
diff --git a/software/bugaid/data/clusters/186.csv b/source/software/bugaid/data/clusters/186.csv
similarity index 100%
rename from software/bugaid/data/clusters/186.csv
rename to source/software/bugaid/data/clusters/186.csv
diff --git a/software/bugaid/data/clusters/187.csv b/source/software/bugaid/data/clusters/187.csv
similarity index 100%
rename from software/bugaid/data/clusters/187.csv
rename to source/software/bugaid/data/clusters/187.csv
diff --git a/software/bugaid/data/clusters/188.csv b/source/software/bugaid/data/clusters/188.csv
similarity index 100%
rename from software/bugaid/data/clusters/188.csv
rename to source/software/bugaid/data/clusters/188.csv
diff --git a/software/bugaid/data/clusters/189.csv b/source/software/bugaid/data/clusters/189.csv
similarity index 100%
rename from software/bugaid/data/clusters/189.csv
rename to source/software/bugaid/data/clusters/189.csv
diff --git a/software/bugaid/data/clusters/19.csv b/source/software/bugaid/data/clusters/19.csv
similarity index 100%
rename from software/bugaid/data/clusters/19.csv
rename to source/software/bugaid/data/clusters/19.csv
diff --git a/software/bugaid/data/clusters/190.csv b/source/software/bugaid/data/clusters/190.csv
similarity index 100%
rename from software/bugaid/data/clusters/190.csv
rename to source/software/bugaid/data/clusters/190.csv
diff --git a/software/bugaid/data/clusters/191.csv b/source/software/bugaid/data/clusters/191.csv
similarity index 100%
rename from software/bugaid/data/clusters/191.csv
rename to source/software/bugaid/data/clusters/191.csv
diff --git a/software/bugaid/data/clusters/192.csv b/source/software/bugaid/data/clusters/192.csv
similarity index 100%
rename from software/bugaid/data/clusters/192.csv
rename to source/software/bugaid/data/clusters/192.csv
diff --git a/software/bugaid/data/clusters/193.csv b/source/software/bugaid/data/clusters/193.csv
similarity index 100%
rename from software/bugaid/data/clusters/193.csv
rename to source/software/bugaid/data/clusters/193.csv
diff --git a/software/bugaid/data/clusters/194.csv b/source/software/bugaid/data/clusters/194.csv
similarity index 100%
rename from software/bugaid/data/clusters/194.csv
rename to source/software/bugaid/data/clusters/194.csv
diff --git a/software/bugaid/data/clusters/195.csv b/source/software/bugaid/data/clusters/195.csv
similarity index 100%
rename from software/bugaid/data/clusters/195.csv
rename to source/software/bugaid/data/clusters/195.csv
diff --git a/software/bugaid/data/clusters/196.csv b/source/software/bugaid/data/clusters/196.csv
similarity index 100%
rename from software/bugaid/data/clusters/196.csv
rename to source/software/bugaid/data/clusters/196.csv
diff --git a/software/bugaid/data/clusters/197.csv b/source/software/bugaid/data/clusters/197.csv
similarity index 100%
rename from software/bugaid/data/clusters/197.csv
rename to source/software/bugaid/data/clusters/197.csv
diff --git a/software/bugaid/data/clusters/198.csv b/source/software/bugaid/data/clusters/198.csv
similarity index 100%
rename from software/bugaid/data/clusters/198.csv
rename to source/software/bugaid/data/clusters/198.csv
diff --git a/software/bugaid/data/clusters/199.csv b/source/software/bugaid/data/clusters/199.csv
similarity index 100%
rename from software/bugaid/data/clusters/199.csv
rename to source/software/bugaid/data/clusters/199.csv
diff --git a/software/bugaid/data/clusters/2.csv b/source/software/bugaid/data/clusters/2.csv
similarity index 100%
rename from software/bugaid/data/clusters/2.csv
rename to source/software/bugaid/data/clusters/2.csv
diff --git a/software/bugaid/data/clusters/20.csv b/source/software/bugaid/data/clusters/20.csv
similarity index 100%
rename from software/bugaid/data/clusters/20.csv
rename to source/software/bugaid/data/clusters/20.csv
diff --git a/software/bugaid/data/clusters/200.csv b/source/software/bugaid/data/clusters/200.csv
similarity index 100%
rename from software/bugaid/data/clusters/200.csv
rename to source/software/bugaid/data/clusters/200.csv
diff --git a/software/bugaid/data/clusters/201.csv b/source/software/bugaid/data/clusters/201.csv
similarity index 100%
rename from software/bugaid/data/clusters/201.csv
rename to source/software/bugaid/data/clusters/201.csv
diff --git a/software/bugaid/data/clusters/202.csv b/source/software/bugaid/data/clusters/202.csv
similarity index 100%
rename from software/bugaid/data/clusters/202.csv
rename to source/software/bugaid/data/clusters/202.csv
diff --git a/software/bugaid/data/clusters/203.csv b/source/software/bugaid/data/clusters/203.csv
similarity index 100%
rename from software/bugaid/data/clusters/203.csv
rename to source/software/bugaid/data/clusters/203.csv
diff --git a/software/bugaid/data/clusters/204.csv b/source/software/bugaid/data/clusters/204.csv
similarity index 100%
rename from software/bugaid/data/clusters/204.csv
rename to source/software/bugaid/data/clusters/204.csv
diff --git a/software/bugaid/data/clusters/205.csv b/source/software/bugaid/data/clusters/205.csv
similarity index 100%
rename from software/bugaid/data/clusters/205.csv
rename to source/software/bugaid/data/clusters/205.csv
diff --git a/software/bugaid/data/clusters/206.csv b/source/software/bugaid/data/clusters/206.csv
similarity index 100%
rename from software/bugaid/data/clusters/206.csv
rename to source/software/bugaid/data/clusters/206.csv
diff --git a/software/bugaid/data/clusters/207.csv b/source/software/bugaid/data/clusters/207.csv
similarity index 100%
rename from software/bugaid/data/clusters/207.csv
rename to source/software/bugaid/data/clusters/207.csv
diff --git a/software/bugaid/data/clusters/208.csv b/source/software/bugaid/data/clusters/208.csv
similarity index 100%
rename from software/bugaid/data/clusters/208.csv
rename to source/software/bugaid/data/clusters/208.csv
diff --git a/software/bugaid/data/clusters/209.csv b/source/software/bugaid/data/clusters/209.csv
similarity index 100%
rename from software/bugaid/data/clusters/209.csv
rename to source/software/bugaid/data/clusters/209.csv
diff --git a/software/bugaid/data/clusters/21.csv b/source/software/bugaid/data/clusters/21.csv
similarity index 100%
rename from software/bugaid/data/clusters/21.csv
rename to source/software/bugaid/data/clusters/21.csv
diff --git a/software/bugaid/data/clusters/210.csv b/source/software/bugaid/data/clusters/210.csv
similarity index 100%
rename from software/bugaid/data/clusters/210.csv
rename to source/software/bugaid/data/clusters/210.csv
diff --git a/software/bugaid/data/clusters/211.csv b/source/software/bugaid/data/clusters/211.csv
similarity index 100%
rename from software/bugaid/data/clusters/211.csv
rename to source/software/bugaid/data/clusters/211.csv
diff --git a/software/bugaid/data/clusters/212.csv b/source/software/bugaid/data/clusters/212.csv
similarity index 100%
rename from software/bugaid/data/clusters/212.csv
rename to source/software/bugaid/data/clusters/212.csv
diff --git a/software/bugaid/data/clusters/213.csv b/source/software/bugaid/data/clusters/213.csv
similarity index 100%
rename from software/bugaid/data/clusters/213.csv
rename to source/software/bugaid/data/clusters/213.csv
diff --git a/software/bugaid/data/clusters/214.csv b/source/software/bugaid/data/clusters/214.csv
similarity index 100%
rename from software/bugaid/data/clusters/214.csv
rename to source/software/bugaid/data/clusters/214.csv
diff --git a/software/bugaid/data/clusters/215.csv b/source/software/bugaid/data/clusters/215.csv
similarity index 100%
rename from software/bugaid/data/clusters/215.csv
rename to source/software/bugaid/data/clusters/215.csv
diff --git a/software/bugaid/data/clusters/216.csv b/source/software/bugaid/data/clusters/216.csv
similarity index 100%
rename from software/bugaid/data/clusters/216.csv
rename to source/software/bugaid/data/clusters/216.csv
diff --git a/software/bugaid/data/clusters/217.csv b/source/software/bugaid/data/clusters/217.csv
similarity index 100%
rename from software/bugaid/data/clusters/217.csv
rename to source/software/bugaid/data/clusters/217.csv
diff --git a/software/bugaid/data/clusters/218.csv b/source/software/bugaid/data/clusters/218.csv
similarity index 100%
rename from software/bugaid/data/clusters/218.csv
rename to source/software/bugaid/data/clusters/218.csv
diff --git a/software/bugaid/data/clusters/22.csv b/source/software/bugaid/data/clusters/22.csv
similarity index 100%
rename from software/bugaid/data/clusters/22.csv
rename to source/software/bugaid/data/clusters/22.csv
diff --git a/software/bugaid/data/clusters/23.csv b/source/software/bugaid/data/clusters/23.csv
similarity index 100%
rename from software/bugaid/data/clusters/23.csv
rename to source/software/bugaid/data/clusters/23.csv
diff --git a/software/bugaid/data/clusters/24.csv b/source/software/bugaid/data/clusters/24.csv
similarity index 100%
rename from software/bugaid/data/clusters/24.csv
rename to source/software/bugaid/data/clusters/24.csv
diff --git a/software/bugaid/data/clusters/25.csv b/source/software/bugaid/data/clusters/25.csv
similarity index 100%
rename from software/bugaid/data/clusters/25.csv
rename to source/software/bugaid/data/clusters/25.csv
diff --git a/software/bugaid/data/clusters/26.csv b/source/software/bugaid/data/clusters/26.csv
similarity index 100%
rename from software/bugaid/data/clusters/26.csv
rename to source/software/bugaid/data/clusters/26.csv
diff --git a/software/bugaid/data/clusters/27.csv b/source/software/bugaid/data/clusters/27.csv
similarity index 100%
rename from software/bugaid/data/clusters/27.csv
rename to source/software/bugaid/data/clusters/27.csv
diff --git a/software/bugaid/data/clusters/28.csv b/source/software/bugaid/data/clusters/28.csv
similarity index 100%
rename from software/bugaid/data/clusters/28.csv
rename to source/software/bugaid/data/clusters/28.csv
diff --git a/software/bugaid/data/clusters/29.csv b/source/software/bugaid/data/clusters/29.csv
similarity index 100%
rename from software/bugaid/data/clusters/29.csv
rename to source/software/bugaid/data/clusters/29.csv
diff --git a/software/bugaid/data/clusters/3.csv b/source/software/bugaid/data/clusters/3.csv
similarity index 100%
rename from software/bugaid/data/clusters/3.csv
rename to source/software/bugaid/data/clusters/3.csv
diff --git a/software/bugaid/data/clusters/30.csv b/source/software/bugaid/data/clusters/30.csv
similarity index 100%
rename from software/bugaid/data/clusters/30.csv
rename to source/software/bugaid/data/clusters/30.csv
diff --git a/software/bugaid/data/clusters/31.csv b/source/software/bugaid/data/clusters/31.csv
similarity index 100%
rename from software/bugaid/data/clusters/31.csv
rename to source/software/bugaid/data/clusters/31.csv
diff --git a/software/bugaid/data/clusters/32.csv b/source/software/bugaid/data/clusters/32.csv
similarity index 100%
rename from software/bugaid/data/clusters/32.csv
rename to source/software/bugaid/data/clusters/32.csv
diff --git a/software/bugaid/data/clusters/33.csv b/source/software/bugaid/data/clusters/33.csv
similarity index 100%
rename from software/bugaid/data/clusters/33.csv
rename to source/software/bugaid/data/clusters/33.csv
diff --git a/software/bugaid/data/clusters/34.csv b/source/software/bugaid/data/clusters/34.csv
similarity index 100%
rename from software/bugaid/data/clusters/34.csv
rename to source/software/bugaid/data/clusters/34.csv
diff --git a/software/bugaid/data/clusters/35.csv b/source/software/bugaid/data/clusters/35.csv
similarity index 100%
rename from software/bugaid/data/clusters/35.csv
rename to source/software/bugaid/data/clusters/35.csv
diff --git a/software/bugaid/data/clusters/36.csv b/source/software/bugaid/data/clusters/36.csv
similarity index 100%
rename from software/bugaid/data/clusters/36.csv
rename to source/software/bugaid/data/clusters/36.csv
diff --git a/software/bugaid/data/clusters/37.csv b/source/software/bugaid/data/clusters/37.csv
similarity index 100%
rename from software/bugaid/data/clusters/37.csv
rename to source/software/bugaid/data/clusters/37.csv
diff --git a/software/bugaid/data/clusters/38.csv b/source/software/bugaid/data/clusters/38.csv
similarity index 100%
rename from software/bugaid/data/clusters/38.csv
rename to source/software/bugaid/data/clusters/38.csv
diff --git a/software/bugaid/data/clusters/39.csv b/source/software/bugaid/data/clusters/39.csv
similarity index 100%
rename from software/bugaid/data/clusters/39.csv
rename to source/software/bugaid/data/clusters/39.csv
diff --git a/software/bugaid/data/clusters/4.csv b/source/software/bugaid/data/clusters/4.csv
similarity index 100%
rename from software/bugaid/data/clusters/4.csv
rename to source/software/bugaid/data/clusters/4.csv
diff --git a/software/bugaid/data/clusters/40.csv b/source/software/bugaid/data/clusters/40.csv
similarity index 100%
rename from software/bugaid/data/clusters/40.csv
rename to source/software/bugaid/data/clusters/40.csv
diff --git a/software/bugaid/data/clusters/41.csv b/source/software/bugaid/data/clusters/41.csv
similarity index 100%
rename from software/bugaid/data/clusters/41.csv
rename to source/software/bugaid/data/clusters/41.csv
diff --git a/software/bugaid/data/clusters/42.csv b/source/software/bugaid/data/clusters/42.csv
similarity index 100%
rename from software/bugaid/data/clusters/42.csv
rename to source/software/bugaid/data/clusters/42.csv
diff --git a/software/bugaid/data/clusters/43.csv b/source/software/bugaid/data/clusters/43.csv
similarity index 100%
rename from software/bugaid/data/clusters/43.csv
rename to source/software/bugaid/data/clusters/43.csv
diff --git a/software/bugaid/data/clusters/44.csv b/source/software/bugaid/data/clusters/44.csv
similarity index 100%
rename from software/bugaid/data/clusters/44.csv
rename to source/software/bugaid/data/clusters/44.csv
diff --git a/software/bugaid/data/clusters/45.csv b/source/software/bugaid/data/clusters/45.csv
similarity index 100%
rename from software/bugaid/data/clusters/45.csv
rename to source/software/bugaid/data/clusters/45.csv
diff --git a/software/bugaid/data/clusters/46.csv b/source/software/bugaid/data/clusters/46.csv
similarity index 100%
rename from software/bugaid/data/clusters/46.csv
rename to source/software/bugaid/data/clusters/46.csv
diff --git a/software/bugaid/data/clusters/47.csv b/source/software/bugaid/data/clusters/47.csv
similarity index 100%
rename from software/bugaid/data/clusters/47.csv
rename to source/software/bugaid/data/clusters/47.csv
diff --git a/software/bugaid/data/clusters/48.csv b/source/software/bugaid/data/clusters/48.csv
similarity index 100%
rename from software/bugaid/data/clusters/48.csv
rename to source/software/bugaid/data/clusters/48.csv
diff --git a/software/bugaid/data/clusters/49.csv b/source/software/bugaid/data/clusters/49.csv
similarity index 100%
rename from software/bugaid/data/clusters/49.csv
rename to source/software/bugaid/data/clusters/49.csv
diff --git a/software/bugaid/data/clusters/5.csv b/source/software/bugaid/data/clusters/5.csv
similarity index 100%
rename from software/bugaid/data/clusters/5.csv
rename to source/software/bugaid/data/clusters/5.csv
diff --git a/software/bugaid/data/clusters/50.csv b/source/software/bugaid/data/clusters/50.csv
similarity index 100%
rename from software/bugaid/data/clusters/50.csv
rename to source/software/bugaid/data/clusters/50.csv
diff --git a/software/bugaid/data/clusters/51.csv b/source/software/bugaid/data/clusters/51.csv
similarity index 100%
rename from software/bugaid/data/clusters/51.csv
rename to source/software/bugaid/data/clusters/51.csv
diff --git a/software/bugaid/data/clusters/52.csv b/source/software/bugaid/data/clusters/52.csv
similarity index 100%
rename from software/bugaid/data/clusters/52.csv
rename to source/software/bugaid/data/clusters/52.csv
diff --git a/software/bugaid/data/clusters/53.csv b/source/software/bugaid/data/clusters/53.csv
similarity index 100%
rename from software/bugaid/data/clusters/53.csv
rename to source/software/bugaid/data/clusters/53.csv
diff --git a/software/bugaid/data/clusters/54.csv b/source/software/bugaid/data/clusters/54.csv
similarity index 100%
rename from software/bugaid/data/clusters/54.csv
rename to source/software/bugaid/data/clusters/54.csv
diff --git a/software/bugaid/data/clusters/55.csv b/source/software/bugaid/data/clusters/55.csv
similarity index 100%
rename from software/bugaid/data/clusters/55.csv
rename to source/software/bugaid/data/clusters/55.csv
diff --git a/software/bugaid/data/clusters/56.csv b/source/software/bugaid/data/clusters/56.csv
similarity index 100%
rename from software/bugaid/data/clusters/56.csv
rename to source/software/bugaid/data/clusters/56.csv
diff --git a/software/bugaid/data/clusters/57.csv b/source/software/bugaid/data/clusters/57.csv
similarity index 100%
rename from software/bugaid/data/clusters/57.csv
rename to source/software/bugaid/data/clusters/57.csv
diff --git a/software/bugaid/data/clusters/58.csv b/source/software/bugaid/data/clusters/58.csv
similarity index 100%
rename from software/bugaid/data/clusters/58.csv
rename to source/software/bugaid/data/clusters/58.csv
diff --git a/software/bugaid/data/clusters/59.csv b/source/software/bugaid/data/clusters/59.csv
similarity index 100%
rename from software/bugaid/data/clusters/59.csv
rename to source/software/bugaid/data/clusters/59.csv
diff --git a/software/bugaid/data/clusters/6.csv b/source/software/bugaid/data/clusters/6.csv
similarity index 100%
rename from software/bugaid/data/clusters/6.csv
rename to source/software/bugaid/data/clusters/6.csv
diff --git a/software/bugaid/data/clusters/60.csv b/source/software/bugaid/data/clusters/60.csv
similarity index 100%
rename from software/bugaid/data/clusters/60.csv
rename to source/software/bugaid/data/clusters/60.csv
diff --git a/software/bugaid/data/clusters/61.csv b/source/software/bugaid/data/clusters/61.csv
similarity index 100%
rename from software/bugaid/data/clusters/61.csv
rename to source/software/bugaid/data/clusters/61.csv
diff --git a/software/bugaid/data/clusters/62.csv b/source/software/bugaid/data/clusters/62.csv
similarity index 100%
rename from software/bugaid/data/clusters/62.csv
rename to source/software/bugaid/data/clusters/62.csv
diff --git a/software/bugaid/data/clusters/63.csv b/source/software/bugaid/data/clusters/63.csv
similarity index 100%
rename from software/bugaid/data/clusters/63.csv
rename to source/software/bugaid/data/clusters/63.csv
diff --git a/software/bugaid/data/clusters/64.csv b/source/software/bugaid/data/clusters/64.csv
similarity index 100%
rename from software/bugaid/data/clusters/64.csv
rename to source/software/bugaid/data/clusters/64.csv
diff --git a/software/bugaid/data/clusters/65.csv b/source/software/bugaid/data/clusters/65.csv
similarity index 100%
rename from software/bugaid/data/clusters/65.csv
rename to source/software/bugaid/data/clusters/65.csv
diff --git a/software/bugaid/data/clusters/66.csv b/source/software/bugaid/data/clusters/66.csv
similarity index 100%
rename from software/bugaid/data/clusters/66.csv
rename to source/software/bugaid/data/clusters/66.csv
diff --git a/software/bugaid/data/clusters/67.csv b/source/software/bugaid/data/clusters/67.csv
similarity index 100%
rename from software/bugaid/data/clusters/67.csv
rename to source/software/bugaid/data/clusters/67.csv
diff --git a/software/bugaid/data/clusters/68.csv b/source/software/bugaid/data/clusters/68.csv
similarity index 100%
rename from software/bugaid/data/clusters/68.csv
rename to source/software/bugaid/data/clusters/68.csv
diff --git a/software/bugaid/data/clusters/69.csv b/source/software/bugaid/data/clusters/69.csv
similarity index 100%
rename from software/bugaid/data/clusters/69.csv
rename to source/software/bugaid/data/clusters/69.csv
diff --git a/software/bugaid/data/clusters/7.csv b/source/software/bugaid/data/clusters/7.csv
similarity index 100%
rename from software/bugaid/data/clusters/7.csv
rename to source/software/bugaid/data/clusters/7.csv
diff --git a/software/bugaid/data/clusters/70.csv b/source/software/bugaid/data/clusters/70.csv
similarity index 100%
rename from software/bugaid/data/clusters/70.csv
rename to source/software/bugaid/data/clusters/70.csv
diff --git a/software/bugaid/data/clusters/71.csv b/source/software/bugaid/data/clusters/71.csv
similarity index 100%
rename from software/bugaid/data/clusters/71.csv
rename to source/software/bugaid/data/clusters/71.csv
diff --git a/software/bugaid/data/clusters/72.csv b/source/software/bugaid/data/clusters/72.csv
similarity index 100%
rename from software/bugaid/data/clusters/72.csv
rename to source/software/bugaid/data/clusters/72.csv
diff --git a/software/bugaid/data/clusters/73.csv b/source/software/bugaid/data/clusters/73.csv
similarity index 100%
rename from software/bugaid/data/clusters/73.csv
rename to source/software/bugaid/data/clusters/73.csv
diff --git a/software/bugaid/data/clusters/74.csv b/source/software/bugaid/data/clusters/74.csv
similarity index 100%
rename from software/bugaid/data/clusters/74.csv
rename to source/software/bugaid/data/clusters/74.csv
diff --git a/software/bugaid/data/clusters/75.csv b/source/software/bugaid/data/clusters/75.csv
similarity index 100%
rename from software/bugaid/data/clusters/75.csv
rename to source/software/bugaid/data/clusters/75.csv
diff --git a/software/bugaid/data/clusters/76.csv b/source/software/bugaid/data/clusters/76.csv
similarity index 100%
rename from software/bugaid/data/clusters/76.csv
rename to source/software/bugaid/data/clusters/76.csv
diff --git a/software/bugaid/data/clusters/77.csv b/source/software/bugaid/data/clusters/77.csv
similarity index 100%
rename from software/bugaid/data/clusters/77.csv
rename to source/software/bugaid/data/clusters/77.csv
diff --git a/software/bugaid/data/clusters/78.csv b/source/software/bugaid/data/clusters/78.csv
similarity index 100%
rename from software/bugaid/data/clusters/78.csv
rename to source/software/bugaid/data/clusters/78.csv
diff --git a/software/bugaid/data/clusters/79.csv b/source/software/bugaid/data/clusters/79.csv
similarity index 100%
rename from software/bugaid/data/clusters/79.csv
rename to source/software/bugaid/data/clusters/79.csv
diff --git a/software/bugaid/data/clusters/8.csv b/source/software/bugaid/data/clusters/8.csv
similarity index 100%
rename from software/bugaid/data/clusters/8.csv
rename to source/software/bugaid/data/clusters/8.csv
diff --git a/software/bugaid/data/clusters/80.csv b/source/software/bugaid/data/clusters/80.csv
similarity index 100%
rename from software/bugaid/data/clusters/80.csv
rename to source/software/bugaid/data/clusters/80.csv
diff --git a/software/bugaid/data/clusters/81.csv b/source/software/bugaid/data/clusters/81.csv
similarity index 100%
rename from software/bugaid/data/clusters/81.csv
rename to source/software/bugaid/data/clusters/81.csv
diff --git a/software/bugaid/data/clusters/82.csv b/source/software/bugaid/data/clusters/82.csv
similarity index 100%
rename from software/bugaid/data/clusters/82.csv
rename to source/software/bugaid/data/clusters/82.csv
diff --git a/software/bugaid/data/clusters/83.csv b/source/software/bugaid/data/clusters/83.csv
similarity index 100%
rename from software/bugaid/data/clusters/83.csv
rename to source/software/bugaid/data/clusters/83.csv
diff --git a/software/bugaid/data/clusters/84.csv b/source/software/bugaid/data/clusters/84.csv
similarity index 100%
rename from software/bugaid/data/clusters/84.csv
rename to source/software/bugaid/data/clusters/84.csv
diff --git a/software/bugaid/data/clusters/85.csv b/source/software/bugaid/data/clusters/85.csv
similarity index 100%
rename from software/bugaid/data/clusters/85.csv
rename to source/software/bugaid/data/clusters/85.csv
diff --git a/software/bugaid/data/clusters/86.csv b/source/software/bugaid/data/clusters/86.csv
similarity index 100%
rename from software/bugaid/data/clusters/86.csv
rename to source/software/bugaid/data/clusters/86.csv
diff --git a/software/bugaid/data/clusters/87.csv b/source/software/bugaid/data/clusters/87.csv
similarity index 100%
rename from software/bugaid/data/clusters/87.csv
rename to source/software/bugaid/data/clusters/87.csv
diff --git a/software/bugaid/data/clusters/88.csv b/source/software/bugaid/data/clusters/88.csv
similarity index 100%
rename from software/bugaid/data/clusters/88.csv
rename to source/software/bugaid/data/clusters/88.csv
diff --git a/software/bugaid/data/clusters/89.csv b/source/software/bugaid/data/clusters/89.csv
similarity index 100%
rename from software/bugaid/data/clusters/89.csv
rename to source/software/bugaid/data/clusters/89.csv
diff --git a/software/bugaid/data/clusters/9.csv b/source/software/bugaid/data/clusters/9.csv
similarity index 100%
rename from software/bugaid/data/clusters/9.csv
rename to source/software/bugaid/data/clusters/9.csv
diff --git a/software/bugaid/data/clusters/90.csv b/source/software/bugaid/data/clusters/90.csv
similarity index 100%
rename from software/bugaid/data/clusters/90.csv
rename to source/software/bugaid/data/clusters/90.csv
diff --git a/software/bugaid/data/clusters/91.csv b/source/software/bugaid/data/clusters/91.csv
similarity index 100%
rename from software/bugaid/data/clusters/91.csv
rename to source/software/bugaid/data/clusters/91.csv
diff --git a/software/bugaid/data/clusters/92.csv b/source/software/bugaid/data/clusters/92.csv
similarity index 100%
rename from software/bugaid/data/clusters/92.csv
rename to source/software/bugaid/data/clusters/92.csv
diff --git a/software/bugaid/data/clusters/93.csv b/source/software/bugaid/data/clusters/93.csv
similarity index 100%
rename from software/bugaid/data/clusters/93.csv
rename to source/software/bugaid/data/clusters/93.csv
diff --git a/software/bugaid/data/clusters/94.csv b/source/software/bugaid/data/clusters/94.csv
similarity index 100%
rename from software/bugaid/data/clusters/94.csv
rename to source/software/bugaid/data/clusters/94.csv
diff --git a/software/bugaid/data/clusters/95.csv b/source/software/bugaid/data/clusters/95.csv
similarity index 100%
rename from software/bugaid/data/clusters/95.csv
rename to source/software/bugaid/data/clusters/95.csv
diff --git a/software/bugaid/data/clusters/96.csv b/source/software/bugaid/data/clusters/96.csv
similarity index 100%
rename from software/bugaid/data/clusters/96.csv
rename to source/software/bugaid/data/clusters/96.csv
diff --git a/software/bugaid/data/clusters/97.csv b/source/software/bugaid/data/clusters/97.csv
similarity index 100%
rename from software/bugaid/data/clusters/97.csv
rename to source/software/bugaid/data/clusters/97.csv
diff --git a/software/bugaid/data/clusters/98.csv b/source/software/bugaid/data/clusters/98.csv
similarity index 100%
rename from software/bugaid/data/clusters/98.csv
rename to source/software/bugaid/data/clusters/98.csv
diff --git a/software/bugaid/data/clusters/99.csv b/source/software/bugaid/data/clusters/99.csv
similarity index 100%
rename from software/bugaid/data/clusters/99.csv
rename to source/software/bugaid/data/clusters/99.csv
diff --git a/software/bugaid/data/complex-change-types.csv b/source/software/bugaid/data/complex-change-types.csv
similarity index 100%
rename from software/bugaid/data/complex-change-types.csv
rename to source/software/bugaid/data/complex-change-types.csv
diff --git a/software/bugaid/data/subject-apps.csv b/source/software/bugaid/data/subject-apps.csv
similarity index 100%
rename from software/bugaid/data/subject-apps.csv
rename to source/software/bugaid/data/subject-apps.csv
diff --git a/software/bugaid/data/subject-modules.csv b/source/software/bugaid/data/subject-modules.csv
similarity index 100%
rename from software/bugaid/data/subject-modules.csv
rename to source/software/bugaid/data/subject-modules.csv
diff --git a/software/bugaid/index.html b/source/software/bugaid/index.html
similarity index 100%
rename from software/bugaid/index.html
rename to source/software/bugaid/index.html
diff --git a/software/bugaid/jquery.csv-0.71.min.js b/source/software/bugaid/jquery.csv-0.71.min.js
similarity index 100%
rename from software/bugaid/jquery.csv-0.71.min.js
rename to source/software/bugaid/jquery.csv-0.71.min.js
diff --git a/software/bugaid/results/empirical_data.tar.gz b/source/software/bugaid/results/empirical_data.tar.gz
similarity index 100%
rename from software/bugaid/results/empirical_data.tar.gz
rename to source/software/bugaid/results/empirical_data.tar.gz
diff --git a/software/bugaid/results/tech-report.pdf b/source/software/bugaid/results/tech-report.pdf
similarity index 100%
rename from software/bugaid/results/tech-report.pdf
rename to source/software/bugaid/results/tech-report.pdf
diff --git a/software/bugaid/results/tuning_data.tar.gz b/source/software/bugaid/results/tuning_data.tar.gz
similarity index 100%
rename from software/bugaid/results/tuning_data.tar.gz
rename to source/software/bugaid/results/tuning_data.tar.gz
diff --git a/software/camellia/index.markdown b/source/software/camellia/index.markdown
similarity index 100%
rename from software/camellia/index.markdown
rename to source/software/camellia/index.markdown
diff --git a/software/clematis/index.markdown b/source/software/clematis/index.markdown
similarity index 100%
rename from software/clematis/index.markdown
rename to source/software/clematis/index.markdown
diff --git a/software/confix/experiments.zip b/source/software/confix/experiments.zip
similarity index 100%
rename from software/confix/experiments.zip
rename to source/software/confix/experiments.zip
diff --git a/software/confix/index.markdown b/source/software/confix/index.markdown
similarity index 100%
rename from software/confix/index.markdown
rename to source/software/confix/index.markdown
diff --git a/software/cssnose/index.markdown b/source/software/cssnose/index.markdown
similarity index 100%
rename from software/cssnose/index.markdown
rename to source/software/cssnose/index.markdown
diff --git a/software/domcovery/index.markdown b/source/software/domcovery/index.markdown
similarity index 100%
rename from software/domcovery/index.markdown
rename to source/software/domcovery/index.markdown
diff --git a/software/index.markdown b/source/software/index.markdown
similarity index 100%
rename from software/index.markdown
rename to source/software/index.markdown
diff --git a/software/jseft/index.markdown b/source/software/jseft/index.markdown
similarity index 100%
rename from software/jseft/index.markdown
rename to source/software/jseft/index.markdown
diff --git a/software/pangor/bootstrap.css b/source/software/pangor/bootstrap.css
similarity index 100%
rename from software/pangor/bootstrap.css
rename to source/software/pangor/bootstrap.css
diff --git a/software/pangor/bootswatch.js b/source/software/pangor/bootswatch.js
similarity index 100%
rename from software/pangor/bootswatch.js
rename to source/software/pangor/bootswatch.js
diff --git a/software/pangor/bootswatch.min.css b/source/software/pangor/bootswatch.min.css
similarity index 100%
rename from software/pangor/bootswatch.min.css
rename to source/software/pangor/bootswatch.min.css
diff --git a/software/pangor/data/pangor-data-sets.tar.gz b/source/software/pangor/data/pangor-data-sets.tar.gz
similarity index 100%
rename from software/pangor/data/pangor-data-sets.tar.gz
rename to source/software/pangor/data/pangor-data-sets.tar.gz
diff --git a/software/pangor/data/subject-apps.csv b/source/software/pangor/data/subject-apps.csv
similarity index 100%
rename from software/pangor/data/subject-apps.csv
rename to source/software/pangor/data/subject-apps.csv
diff --git a/software/pangor/data/subject-modules.csv b/source/software/pangor/data/subject-modules.csv
similarity index 100%
rename from software/pangor/data/subject-modules.csv
rename to source/software/pangor/data/subject-modules.csv
diff --git a/software/pangor/index.html b/source/software/pangor/index.html
similarity index 100%
rename from software/pangor/index.html
rename to source/software/pangor/index.html
diff --git a/software/pangor/jquery.csv-0.71.min.js b/source/software/pangor/jquery.csv-0.71.min.js
similarity index 100%
rename from software/pangor/jquery.csv-0.71.min.js
rename to source/software/pangor/jquery.csv-0.71.min.js
diff --git a/software/pangor/table-bugs.png b/source/software/pangor/table-bugs.png
similarity index 100%
rename from software/pangor/table-bugs.png
rename to source/software/pangor/table-bugs.png
diff --git a/software/promisland/bootstrap.css b/source/software/promisland/bootstrap.css
similarity index 100%
rename from software/promisland/bootstrap.css
rename to source/software/promisland/bootstrap.css
diff --git a/software/promisland/css/bootswatch.min.css b/source/software/promisland/css/bootswatch.min.css
similarity index 100%
rename from software/promisland/css/bootswatch.min.css
rename to source/software/promisland/css/bootswatch.min.css
diff --git a/software/promisland/index.html b/source/software/promisland/index.html
similarity index 100%
rename from software/promisland/index.html
rename to source/software/promisland/index.html
diff --git a/software/promisland/js/bootstrap.min.js b/source/software/promisland/js/bootstrap.min.js
similarity index 100%
rename from software/promisland/js/bootstrap.min.js
rename to source/software/promisland/js/bootstrap.min.js
diff --git a/software/promisland/js/bootswatch.js b/source/software/promisland/js/bootswatch.js
similarity index 100%
rename from software/promisland/js/bootswatch.js
rename to source/software/promisland/js/bootswatch.js
diff --git a/software/promisland/readme.md b/source/software/promisland/readme.md
similarity index 100%
rename from software/promisland/readme.md
rename to source/software/promisland/readme.md
diff --git a/software/promisland/results/eval-targets.json b/source/software/promisland/results/eval-targets.json
similarity index 100%
rename from software/promisland/results/eval-targets.json
rename to source/software/promisland/results/eval-targets.json
diff --git a/software/promisland/results/promisesLand-evaluation-power.csv b/source/software/promisland/results/promisesLand-evaluation-power.csv
similarity index 100%
rename from software/promisland/results/promisesLand-evaluation-power.csv
rename to source/software/promisland/results/promisesLand-evaluation-power.csv
diff --git a/software/promisland/results/promisesLand-evaluation-runtime-perf.csv b/source/software/promisland/results/promisesLand-evaluation-runtime-perf.csv
similarity index 100%
rename from software/promisland/results/promisesLand-evaluation-runtime-perf.csv
rename to source/software/promisland/results/promisesLand-evaluation-runtime-perf.csv
diff --git a/software/promisland/results/promisesland_full_dataset.zip b/source/software/promisland/results/promisesland_full_dataset.zip
similarity index 100%
rename from software/promisland/results/promisesland_full_dataset.zip
rename to source/software/promisland/results/promisesland_full_dataset.zip
diff --git a/software/sahand/index.markdown b/source/software/sahand/index.markdown
similarity index 100%
rename from software/sahand/index.markdown
rename to source/software/sahand/index.markdown
diff --git a/software/sahand/study.zip b/source/software/sahand/study.zip
similarity index 100%
rename from software/sahand/study.zip
rename to source/software/sahand/study.zip
diff --git a/software/slicejs/index.markdown b/source/software/slicejs/index.markdown
similarity index 100%
rename from software/slicejs/index.markdown
rename to source/software/slicejs/index.markdown
diff --git a/software/testbugs-study/index.markdown b/source/software/testbugs-study/index.markdown
similarity index 100%
rename from software/testbugs-study/index.markdown
rename to source/software/testbugs-study/index.markdown
diff --git a/software/testilizer/index.markdown b/source/software/testilizer/index.markdown
similarity index 100%
rename from software/testilizer/index.markdown
rename to source/software/testilizer/index.markdown
diff --git a/software/tochal/index.markdown b/source/software/tochal/index.markdown
similarity index 100%
rename from software/tochal/index.markdown
rename to source/software/tochal/index.markdown
diff --git a/source/sponsors/index.markdown b/source/sponsors/index.markdown
new file mode 100644
index 00000000..50673619
--- /dev/null
+++ b/source/sponsors/index.markdown
@@ -0,0 +1,25 @@
+---
+layout: page
+title: "sponsors"
+date: 2013-01-03 12:36
+comments: false
+sharing: false
+footer: false
+---
+
+
+ SALT lab is supported by:
+
+
diff --git a/source/stylesheets/screen.css.notused b/source/stylesheets/screen.css.notused
new file mode 100644
index 00000000..5040bb96
--- /dev/null
+++ b/source/stylesheets/screen.css.notused
@@ -0,0 +1 @@
+html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}.icon-sprite,.icon-facebook,.facebook-share:before,.icon-github,.sidebar .github-follow:before,.icon-googleplus,.googleplus-share:before,.icon-twitter-bird,#tweets .loading:before,.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background:url('/images/icon-sdc231d6676.png') no-repeat}.icon-facebook,.facebook-share:before{background-position:0 -80px;height:16px;width:12px}.icon-github,.sidebar .github-follow:before{background-position:0 -48px;height:16px;width:16px}.icon-googleplus,.googleplus-share:before{background-position:0 -64px;height:16px;width:11px}.icon-twitter-bird,#tweets .loading:before{background-position:0 0;height:32px;width:32px}.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background-position:0 -32px;height:16px;width:14px}a{color:#1863a1;color:#1863a1}a:visited{color:#751590}a:focus{color:#0181eb}a:hover{color:#0181eb}a:active{color:#01579f}.sidebar a{color:#1863a1}.sidebar a:focus{color:#0181eb}.sidebar a:hover{color:#0181eb}.sidebar a:active{color:#01579f}a{-webkit-transition:color 0.3s;-moz-transition:color 0.3s;-o-transition:color 0.3s;transition:color 0.3s}html{background:#12212b url('/images/line-tile.png?1357438739') top left}body>div{background:#f2f2f2 url('/images/noise.png?1357266755') top left;border-bottom:1px solid #bfbfbf}body>div>div{background:#f8f8f8 url('/images/noise.png?1357266755') top left;border-right:1px solid #e0e0e0}.icon-sprite,.icon-facebook,.facebook-share:before,.icon-github,.sidebar .github-follow:before,.icon-googleplus,.googleplus-share:before,.icon-twitter-bird,#tweets .loading:before,.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background:url('/images/icon-sdc231d6676.png') no-repeat}.icon-facebook,.facebook-share:before{background-position:0 -80px;height:16px;width:12px}.icon-github,.sidebar .github-follow:before{background-position:0 -48px;height:16px;width:16px}.icon-googleplus,.googleplus-share:before{background-position:0 -64px;height:16px;width:11px}.icon-twitter-bird,#tweets .loading:before{background-position:0 0;height:32px;width:32px}.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background-position:0 -32px;height:16px;width:14px}a{color:#1863a1;color:#1863a1}a:visited{color:#751590}a:focus{color:#0181eb}a:hover{color:#0181eb}a:active{color:#01579f}.sidebar a{color:#1863a1}.sidebar a:focus{color:#0181eb}.sidebar a:hover{color:#0181eb}.sidebar a:active{color:#01579f}a{-webkit-transition:color 0.3s;-moz-transition:color 0.3s;-o-transition:color 0.3s;transition:color 0.3s}html{background:#12212b url('/images/line-tile.png?1357438739') top left}body>div{background:#f2f2f2 url('/images/noise.png?1357266755') top left;border-bottom:1px solid #bfbfbf}body>div>div{background:#f8f8f8 url('/images/noise.png?1357266755') top left;border-right:1px solid #e0e0e0}.heading,body>header h1,h1,h2,h3,h4,h5,h6{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}.sans,body>header h2,article header p.meta,article>footer,#blog-archives a.category,#blog-archives time,.sidebar section,body>footer{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}.serif,body,article a[rel=full-article]{font-family:"MJX_Main",Georgia,Times,"Times New Roman",serif}.mono,pre,code,tt,p code,li code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace}body>header h1{font-size:2.2em;font-family:"Varela","Helvetica Neue",Arial,sans-serif;font-weight:normal;line-height:1.2em;margin-bottom:0.6667em}body>header h2{font-family:"Varela","Helvetica Neue",Arial,sans-serif}body{line-height:1.5em;color:#111}h1,h2,h3,h4,h5,h6{text-rendering:optimizelegibility;margin-bottom:1em;font-weight:bold}h1{font-size:2.2em;line-height:1.2em}h2,section h1{font-size:1.5em}h3,section h2,section section h1{font-size:1.3em}h4,section h3,section section h2,section section section h1{font-size:1em}h5,section h4,section section h3{font-size:0.9em}h6,section h5,section section h4,section section section h3{font-size:0.8em}@media only screen and (min-width: 992px){body{font-size:1.15em}}p,blockquote,ul,ol{margin-bottom:1.5em}ul{list-style-type:disc}ul ul{list-style-type:circle;margin-bottom:0px}ul ul ul{list-style-type:square;margin-bottom:0px}ol{list-style-type:decimal}ol ol{list-style-type:lower-alpha;margin-bottom:0px}ol ol ol{list-style-type:lower-roman;margin-bottom:0px}ul,ul ul,ul ol,ol,ol ul,ol ol{margin-left:1.3em}strong{font-weight:bold}em{font-style:italic}sup,sub{vertical-align:baseline;font-size:0.8em;position:relative}sup{top:-.5em}sub{bottom:-.5em}q{font-style:italic}q:before{content:"\201C"}q:after{content:"\201D"}em,dfn{font-style:italic}strong,dfn{font-weight:bold}del,s{text-decoration:line-through}abbr,acronym{border-bottom:1px dotted;cursor:help}sub,sup{line-height:0}hr{margin-bottom:0.2em}small{font-size:.8em}big{font-size:1.2em}blockquote{font-style:italic;position:relative;font-size:1.2em;line-height:1.5em;padding-left:1em;border-left:4px solid rgba(170,170,170,0.5)}blockquote cite{font-style:italic}blockquote cite a{color:#aaa !important;word-wrap:break-word}blockquote cite:before{content:'\2014';padding-right:.3em;padding-left:.3em;color:#aaa}@media only screen and (min-width: 992px){blockquote{padding-left:1.5em;border-left-width:4px}}.pullquote-right:before,.pullquote-left:before{padding:0;border:none;content:attr(data-pullquote);float:right;width:45%;margin:0.5em 0 1em 1.5em;position:relative;top:7px;font-size:1.4em;line-height:1.45em}.pullquote-left:before{float:left;margin:0.5em 1.5em 1em 0}.force-wrap,article a,.sidebar a{white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word}.group,body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section,body div.pagination,aside.sidebar,#main,#content,.sidebar{*zoom:1}.group:after,body>header:after,body>nav:after,body>footer:after,body #content>article:after,body #content>div>article:after,body #content>div>section:after,body div.pagination:after,#main:after,#content:after,.sidebar:after{content:"";display:table;clear:both}body{-webkit-text-size-adjust:none;max-width:1200px;position:relative;margin:0 auto}body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:18px;padding-right:18px}@media only screen and (min-width: 480px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:25px;padding-right:25px}}@media only screen and (min-width: 768px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:35px;padding-right:35px}}@media only screen and (min-width: 992px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:55px;padding-right:55px}}body div.pagination{margin-left:18px;margin-right:18px}@media only screen and (min-width: 480px){body div.pagination{margin-left:25px;margin-right:25px}}@media only screen and (min-width: 768px){body div.pagination{margin-left:35px;margin-right:35px}}@media only screen and (min-width: 992px){body div.pagination{margin-left:55px;margin-right:55px}}body>header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em}#content{overflow:hidden}#content>div,#content>article{width:100%}aside.sidebar{float:none;padding:0 18px 1px;background-color:#f7f7f7;border-top:1px solid #e0e0e0}.flex-content,article img,article video,article .flash-video,.sidebar img{max-width:100%;height:auto}.basic-alignment.left,article img.left,article video.left,article .left.flash-video,.sidebar img.left{float:left;margin-right:1.5em}.basic-alignment.right,article img.right,article video.right,article .right.flash-video,.sidebar img.right{float:right;margin-left:1.5em}.basic-alignment.center,article img.center,article video.center,article .center.flash-video,.sidebar img.center{display:block;margin:0 auto 1.5em}.basic-alignment.left,article img.left,article video.left,article .left.flash-video,.sidebar img.left,.basic-alignment.right,article img.right,article video.right,article .right.flash-video,.sidebar img.right{margin-bottom:.8em}.toggle-sidebar,.no-sidebar .toggle-sidebar{display:none}@media only screen and (min-width: 750px){body.sidebar-footer aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}body.sidebar-footer aside.sidebar section.odd,body.sidebar-footer aside.sidebar section.even{float:left;width:48%}body.sidebar-footer aside.sidebar section.odd{margin-left:0}body.sidebar-footer aside.sidebar section.even{margin-left:4%}body.sidebar-footer aside.sidebar.thirds section{width:30%;margin-left:5%}body.sidebar-footer aside.sidebar.thirds section.first{margin-left:0;clear:both}}body.sidebar-footer #content{margin-right:0px}body.sidebar-footer .toggle-sidebar{display:none}@media only screen and (min-width: 550px){body>header{font-size:1em}}@media only screen and (min-width: 750px){aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}aside.sidebar section.odd,aside.sidebar section.even{float:left;width:48%}aside.sidebar section.odd{margin-left:0}aside.sidebar section.even{margin-left:4%}aside.sidebar.thirds section{width:30%;margin-left:5%}aside.sidebar.thirds section.first{margin-left:0;clear:both}}@media only screen and (min-width: 768px){body{-webkit-text-size-adjust:auto}body>header{font-size:1.2em}#main{padding:0;margin:0 auto}#content{overflow:visible;margin-right:240px;position:relative}.no-sidebar #content{margin-right:0;border-right:0}.collapse-sidebar #content{margin-right:20px}#content>div,#content>article{padding-top:17.5px;padding-bottom:17.5px;float:left}aside.sidebar{width:210px;padding:0 15px 15px;background:none;clear:none;float:left;margin:0 -100% 0 0}aside.sidebar section{width:auto;margin-left:0}aside.sidebar section.odd,aside.sidebar section.even{float:none;width:auto;margin-left:0}.collapse-sidebar aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}.collapse-sidebar aside.sidebar section.odd,.collapse-sidebar aside.sidebar section.even{float:left;width:48%}.collapse-sidebar aside.sidebar section.odd{margin-left:0}.collapse-sidebar aside.sidebar section.even{margin-left:4%}.collapse-sidebar aside.sidebar.thirds section{width:30%;margin-left:5%}.collapse-sidebar aside.sidebar.thirds section.first{margin-left:0;clear:both}}@media only screen and (min-width: 992px){body>header{font-size:1.3em}#content{margin-right:300px}#content>div,#content>article{padding-top:27.5px;padding-bottom:27.5px}aside.sidebar{width:260px;padding:1.2em 20px 20px}.collapse-sidebar aside.sidebar{padding-left:55px;padding-right:55px}}@media only screen and (min-width: 768px){ul,ol{margin-left:0}}body>header{background:#333}body>header h1{display:inline-block;margin:0}body>header h1 a,body>header h1 a:visited,body>header h1 a:hover{color:#f2f2f2;text-decoration:none}body>header h2{margin:0.2em 0 0;font-size:1em;color:#f2f2f2;font-weight:normal}body>nav{position:relative;background-color:#223442;background:url('/images/noise.png?1357266755'),-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #30495d), color-stop(50%, #223442), color-stop(100%, #0f171d));background:url('/images/noise.png?1357266755'),-webkit-linear-gradient(#30495d,#223442,#0f171d);background:url('/images/noise.png?1357266755'),-moz-linear-gradient(#30495d,#223442,#0f171d);background:url('/images/noise.png?1357266755'),-o-linear-gradient(#30495d,#223442,#0f171d);background:url('/images/noise.png?1357266755'),linear-gradient(#30495d,#223442,#0f171d);border-top:1px solid #3c5c74;border-bottom:1px solid #000;padding-top:.35em;padding-bottom:.35em}body>nav form{-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;margin:0;padding:0}body>nav form .search{padding:0.3em 0.5em 0;font-size:.85em;font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;line-height:1.1em;width:95%;-webkit-border-radius:0.5em;-moz-border-radius:0.5em;-ms-border-radius:0.5em;-o-border-radius:0.5em;border-radius:0.5em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-box-shadow:#253949 0 1px;-moz-box-shadow:#253949 0 1px;box-shadow:#253949 0 1px;background-color:#3c5c74;border:1px solid #111920;color:#888}body>nav form .search:focus{color:#444;border-color:#80b1df;-webkit-box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;-moz-box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;background-color:#fff;outline:none}body>nav fieldset[role=search]{float:right;width:48%}body>nav fieldset.mobile-nav{float:left;width:48%}body>nav fieldset.mobile-nav select{width:100%;font-size:.8em;border:1px solid #888}body>nav ul{display:none}@media only screen and (min-width: 550px){body>nav{font-size:.9em}body>nav ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;float:left;display:block;padding-top:.15em}body>nav ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;display:inline;float:left;padding-left:0;padding-right:0}body>nav ul li:first-child,body>nav ul li.first{padding-left:0}body>nav ul li:last-child{padding-right:0}body>nav ul li.last{padding-right:0}body>nav ul.subscription{margin-left:.8em;float:right}body>nav ul.subscription li:last-child a{padding-right:0}body>nav ul li{margin:0}body>nav a{color:#dce6ed;font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;text-shadow:#37546a 0 1px;float:left;text-decoration:none;font-size:1.1em;padding:0.1em 0;line-height:1.5em}body>nav a:visited{color:#dce6ed}body>nav a:hover{color:#88a8c2}body>nav li+li{border-left:1px solid #0f171d;margin-left:.8em}body>nav li+li a{padding-left:.8em;border-left:1px solid #2e475a}body>nav form{float:right;text-align:left;padding-left:.8em;width:175px}body>nav form .search{width:93%;font-size:.95em;line-height:1.2em}body>nav ul[data-subscription$=email]+form{width:97px}body>nav ul[data-subscription$=email]+form .search{width:91%}body>nav fieldset.mobile-nav{display:none}body>nav fieldset[role=search]{width:99%}}@media only screen and (min-width: 992px){body>nav form{width:215px}body>nav ul[data-subscription$=email]+form{width:147px}}.no-placeholder body>nav .search{background:#3c5c74 url('/images/search.png?1357266755') 0.3em 0.25em no-repeat;text-indent:1.3em}@media only screen and (min-width: 550px){.maskimage body>nav ul[data-subscription$=email]+form{width:123px}}@media only screen and (min-width: 992px){.maskimage body>nav ul[data-subscription$=email]+form{width:173px}}.maskimage ul.subscription{position:relative;top:.2em}.maskimage ul.subscription li,.maskimage ul.subscription a{border:0;padding:0}.maskimage a[rel=subscribe-rss]{position:relative;top:0px;text-indent:-999999em;background-color:#2e475a;border:0;padding:0}.maskimage a[rel=subscribe-rss],.maskimage a[rel=subscribe-rss]:after{-webkit-mask-image:url('/images/rss.png?1357266755');-moz-mask-image:url('/images/rss.png?1357266755');-ms-mask-image:url('/images/rss.png?1357266755');-o-mask-image:url('/images/rss.png?1357266755');mask-image:url('/images/rss.png?1357266755');-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;width:22px;height:22px}.maskimage a[rel=subscribe-rss]:after{content:"";position:absolute;top:-1px;left:0;background-color:#fff}.maskimage a[rel=subscribe-rss]:hover:after{background-color:#fff}.maskimage a[rel=subscribe-email]{position:relative;top:0px;text-indent:-999999em;background-color:#2e475a;border:0;padding:0}.maskimage a[rel=subscribe-email],.maskimage a[rel=subscribe-email]:after{-webkit-mask-image:url('/images/email.png?1357266755');-moz-mask-image:url('/images/email.png?1357266755');-ms-mask-image:url('/images/email.png?1357266755');-o-mask-image:url('/images/email.png?1357266755');mask-image:url('/images/email.png?1357266755');-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;width:28px;height:22px}.maskimage a[rel=subscribe-email]:after{content:"";position:absolute;top:-1px;left:0;background-color:#fff}.maskimage a[rel=subscribe-email]:hover:after{background-color:#fff}#content .blog-index{padding-top:0;padding-bottom:0}#content .blog-index article{padding-top:2em}article{padding-top:1em}article header{position:relative;padding-top:2em;padding-bottom:1em;margin-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}@media only screen and (min-width: 768px){article header{margin-bottom:1.5em;padding-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}}.blog-index article header{background:none;padding-bottom:0}article header p{font-size:.8em;margin:0;color:#aaa}article header p.meta{position:absolute;top:0}article header time{text-transform:uppercase}article .entry-title{margin:0}article .entry-title a{text-decoration:none}article .entry-title a:hover{text-decoration:underline}.blog-index article .entry-title{font-size:2.2em}.blog-index article .entry-title a{color:inherit}.blog-index article .entry-title a:hover{color:#0181eb}article a[rel=bookmark]{text-decoration:none}article h2{padding-top:0.8em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}article h2:first-child,article header+h2{background:none}.entry-content article h2:first-child,article header+h2{padding-top:0}article.linklog .entry-title{font-size:2.2em}article.linklog .entry-title a{text-decoration:underline}.blog-index article.linklog .entry-title{font-size:1.5em}article .linklog-marker{color:#aaa;font-size:.8em;line-height:1em;position:relative;top:-.15em}article>footer{padding-bottom:2.5em;margin-top:2em}.blog-index article>footer{margin-top:1em}article footer .meta{margin-bottom:.8em;font-size:.85em;clear:both;overflow:hidden}article footer p:last-child{margin-bottom:0}article footer .comments-link{font-size:.8em;color:inherit}article footer .comments-link:hover,article footer .comments-link:focus{color:#0181eb}article a[rel=full-article]{background:#ebebeb;display:inline-block;padding:0.4em 0.8em;margin-right:.5em;text-decoration:none;color:#5d5d5d;-webkit-transition:background-color 0.5s;-moz-transition:background-color 0.5s;-o-transition:background-color 0.5s;transition:background-color 0.5s}article a[rel=full-article]:hover{background:#0181eb;text-shadow:none;color:#f8f8f8}.blog-index article+article{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}article .feature{padding-top:.5em;margin-bottom:1em;padding-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x;font-size:2.0em;font-style:italic;line-height:1.3em}article img,article video,article .flash-video{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.5em solid}article video,article .flash-video{margin:0 auto 1.5em}article video{display:block;width:100%}article .flash-video>div{position:relative;display:block;padding-bottom:56.25%;padding-top:1px;height:0;overflow:hidden}article .flash-video>div iframe,article .flash-video>div object,article .flash-video>div embed{position:absolute;top:0;left:0;width:100%;height:100%}.separator,article footer .byline+time:before,article footer time+time:before,article footer .comments:before,article footer .byline ~ .categories:before{content:"\2022 ";padding:0 0.4em 0 0.2em;display:inline-block}#content div.pagination{text-align:center;font-size:.95em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x;padding-top:1.5em;padding-bottom:1.5em}#content div.pagination a{text-decoration:none;color:#aaa}#content div.pagination a.prev{position:absolute;left:0}#content div.pagination a.next{position:absolute;right:0}#content div.pagination a:hover{color:#0181eb}#content div.pagination a[href*=archive]:before,#content div.pagination a[href*=archive]:after{content:'\2014';padding:0 0.3em}.simple-social-button,.googleplus-share,.facebook-share,.twitter-share,.sidebar a.twitter-follow-button,.sidebar .github-follow{position:relative;overflow:hidden;font-family:"Lucida Grande",Helvetica,Arial,sans;display:inline-block;border:1px solid #ccc;padding:0.2em 0.5em;line-height:1.45em;font-size:11px;font-weight:bold;text-decoration:none;text-shadow:#fff 0 1px;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;background-color:#e5e5e5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(#ffffff,#dddddd);background-image:-moz-linear-gradient(#ffffff,#dddddd);background-image:-o-linear-gradient(#ffffff,#dddddd);background-image:linear-gradient(#ffffff,#dddddd)}.simple-social-button:hover,.googleplus-share:hover,.facebook-share:hover,.twitter-share:hover,.sidebar a.twitter-follow-button:hover,.sidebar .github-follow:hover{background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5f5f5), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(#f5f5f5,#cccccc);background-image:-moz-linear-gradient(#f5f5f5,#cccccc);background-image:-o-linear-gradient(#f5f5f5,#cccccc);background-image:linear-gradient(#f5f5f5,#cccccc);border-color:#b5b5b5;background-color:#ddd}.simple-social-button:before,.googleplus-share:before,.facebook-share:before,.twitter-share:before,.sidebar a.twitter-follow-button:before,.sidebar .github-follow:before{content:"";display:inline-block}p.meta+.sharing{padding-top:1em;padding-left:0;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}#fb-root{display:none}.googleplus-share{color:#db583b;padding-left:17px}.googleplus-share:visited,.googleplus-share:hover,.googleplus-share:visited:hover{color:#db583b}.googleplus-share:before{vertical-align:middle;position:absolute;left:3px}.googleplus-share:before{top:5px}.facebook-share{color:#4e5a9b;padding-left:18px}.facebook-share:visited,.facebook-share:hover,.facebook-share:visited:hover{color:#4e5a9b}.facebook-share:before{vertical-align:middle;position:absolute;left:3px}.facebook-share:before{top:3px}.twitter-share,.sidebar a.twitter-follow-button{color:#333;padding-left:20px}.twitter-share:visited,.twitter-share:hover,.twitter-share:visited:hover,.sidebar a.twitter-follow-button:visited,.sidebar a.twitter-follow-button:hover,.sidebar a.twitter-follow-button:visited:hover{color:#333}.twitter-share:before,.sidebar a.twitter-follow-button:before{vertical-align:middle;position:absolute;left:3px}.sidebar .github-follow{color:#333;padding-left:22px}.sidebar .github-follow:visited,.sidebar .github-follow:hover,.sidebar .github-follow:visited:hover{color:#333}.sidebar .github-follow:before{vertical-align:middle;position:absolute;left:3px}p code,li code{display:inline-block;white-space:no-wrap;background:#fff;font-size:.8em;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;padding:0 0.3em;margin:-1px 0}p pre code,li pre code{font-size:1em;background:none;border:none}pre{background:#fbfbfb url('/images/noise.png?1357266755') top left;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;color:#586e75;overflow:scroll;overflow-y:hidden;overflow-x:auto;border:1px solid #d8d8d8;margin-bottom:2.1em;padding:1em 0.8em;font-size:13px;line-height:1.45em}figure.code{-webkit-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-moz-box-shadow:rgba(0,0,0,0.06) 0 0 10px;box-shadow:rgba(0,0,0,0.06) 0 0 10px;background:none;padding:0;border:0;margin-bottom:1.5em}figure.code pre{-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:none;color:#586e75;border:none;padding:0;margin-bottom:0;overflow:visible;font-style:normal;font-weight:normal}figure.code figcaption{position:relative;text-align:center;font-size:13px;line-height:2em;font-weight:normal;margin-bottom:0;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;font-family:"Helvetica Neue",Arial,"Lucida Grande","Lucida Sans Unicode",Lucida,sans-serif;background-color:#aaaaaa;text-shadow:#fff 0 1px 0;color:#777;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(6%, #f0f0f0), color-stop(90%, #e5e5e5), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);background-image:-moz-linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);background-image:-o-linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);background-image:linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);border:1px solid #c5c5c5;border-top-color:#d5d5d5;border-bottom:0}figure.code figcaption a{position:absolute;right:.8em;text-decoration:none;color:inherit;z-index:1;padding-left:3em}figure.code figcaption a:hover{text-decoration:underline}figure.code .marked{position:relative;display:block}figure.code .marked:after{content:"";position:absolute;background:rgba(0,186,255,0.03);left:-.8em;top:0;bottom:0;right:-.8em;border:0px solid rgba(0,186,255,0.13);border-left-color:rgba(0,186,255,0.5)}figure.code .marked.start:after{border-top-width:1px}figure.code .marked.end:after{border-bottom-width:1px}figure.code .unnumbered .marked:after,figure.code .line-numbers .marked:after{border-left-width:2px}.highlight{border:1px solid #d8d8d8;background:#fbfbfb;overflow-y:hidden;overflow-x:auto}.highlight [data-line]:before{content:attr(data-line);font-size:0;line-height:0;color:transparent}.highlight td{line-height:1.45em;font-size:13px}.highlight td div{padding:.8em}.highlight .main{width:100%;background:#fbfbfb url('/images/noise.png?1357266755') top left}.highlight .line-numbers{text-align:right;background:#fefefe url('/images/noise.png?1357266755') top left;border-right:1px solid #e0e0e0;-webkit-box-shadow:#fff -1px 0 inset;-moz-box-shadow:#fff -1px 0 inset;box-shadow:#fff -1px 0 inset;text-shadow:#eaeaea 0 -1px}.highlight .line-numbers pre{color:#93a1a1}.highlight .c{color:#93a1a1;font-style:italic}.highlight .cm{color:#93a1a1;font-style:italic}.highlight .cp{color:#93a1a1;font-style:italic}.highlight .c1{color:#93a1a1;font-style:italic}.highlight .cs{color:#93a1a1;font-weight:bold;font-style:italic}.highlight .err{color:#dc322f;background:none}.highlight .k{color:#cb4b16}.highlight .o{color:#586e75;font-weight:bold}.highlight .p{color:#586e75}.highlight .ow{color:#2aa198;font-weight:bold}.highlight .gd{color:#586e75;background-color:#f3c8c8;display:inline-block}.highlight .gd .x{color:#586e75;background-color:#f0b4b3;display:inline-block}.highlight .ge{color:#586e75;font-style:italic}.highlight .gh{color:#93a1a1}.highlight .gi{color:#586e75;background-color:#e3e7c8;display:inline-block}.highlight .gi .x{color:#586e75;background-color:#cbd396;display:inline-block}.highlight .gs{color:#586e75;font-weight:bold}.highlight .gu{color:#6c71c4}.highlight .kc{color:#859900;font-weight:bold}.highlight .kd{color:#268bd2}.highlight .kp{color:#cb4b16;font-weight:bold}.highlight .kr{color:#d33682;font-weight:bold}.highlight .kt{color:#2aa198}.highlight .n{color:#268bd2}.highlight .na{color:#268bd2}.highlight .nb{color:#859900}.highlight .nc{color:#d33682}.highlight .no{color:#b58900}.highlight .nl{color:#859900}.highlight .ne{color:#268bd2;font-weight:bold}.highlight .nf{color:#268bd2;font-weight:bold}.highlight .nn{color:#b58900}.highlight .nt{color:#268bd2;font-weight:bold}.highlight .nx{color:#b58900 !important}.highlight .vg{color:#268bd2}.highlight .vi{color:#268bd2}.highlight .nv{color:#268bd2}.highlight .mf{color:#2aa198}.highlight .m{color:#2aa198}.highlight .mh{color:#2aa198}.highlight .mi{color:#2aa198}.highlight .s{color:#2aa198}.highlight .sd{color:#2aa198}.highlight .s2{color:#2aa198}.highlight .se{color:#dc322f}.highlight .si{color:#268bd2}.highlight .sr{color:#2aa198}.highlight .s1{color:#2aa198}.highlight div .gd,.highlight div .gd .x,.highlight div .gi,.highlight div .gi .x{display:inline-block;width:100%}pre::-webkit-scrollbar,.highlight::-webkit-scrollbar{height:.5em;background:rgba(0,0,0,0.15)}pre::-webkit-scrollbar-thumb:horizontal,.highlight::-webkit-scrollbar-thumb:horizontal{background:rgba(0,0,0,0.15);-webkit-border-radius:4px;border-radius:4px}#archive #content>div,#archive #content>div>article{padding-top:0}#blog-archives{color:#aaa}#blog-archives article{padding:1em 0 1em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}#blog-archives article:last-child{background:none}#blog-archives article footer{padding:0;margin:0;font-size:.85em;line-height:1em}#blog-archives h2{display:none}#blog-archives .entry-title{color:#111;margin-bottom:.3em;font-size:1.3em}#blog-archives .entry-title a{text-decoration:none;font-weight:normal;display:inline-block}#blog-archives .entry-title a:hover{text-decoration:underline}#blog-archives .entry-title a:hover{color:#0181eb}#blog-archives article[data-linklog] .entry-title{font-size:1em}#blog-archives article[data-linklog] .entry-title a{text-decoration:underline}#blog-archives a.category,#blog-archives time{color:#aaa}#blog-archives .entry-content{display:none}#blog-archives time{font-size:.9em;line-height:1.2em}#blog-archives time .month,#blog-archives time .day{display:inline-block}#blog-archives time .month{text-transform:uppercase}#blog-archives p{margin-bottom:1em}#blog-archives a:hover{color:#0181eb}@media only screen and (min-width: 550px){#blog-archives article{padding-left:4.5em;padding-bottom:.7em;margin-left:5em}#blog-archives h2{margin-bottom:.3em;font-weight:normal;display:inline-block;position:relative;top:-1px;float:left}#blog-archives h2:first-child{padding-top:.75em}#blog-archives time{position:absolute;text-align:right;left:0em;top:1.8em}#blog-archives .year{display:none}#blog-archives a.category{line-height:1.1em}}#content>.category article{margin-left:0;padding-left:6.8em}#content>.category .year{display:inline}.side-shadow-border,.sidebar section h1,.sidebar li{-webkit-box-shadow:#fff 0 1px;-moz-box-shadow:#fff 0 1px;box-shadow:#fff 0 1px}.sidebar{overflow:hidden;color:#3d3d3d;text-shadow:#fff 0 1px}.sidebar section{font-size:.8em;line-height:1.4em;margin-bottom:1.5em}.sidebar section h1{margin:1.5em 0 0;padding-bottom:.2em;border-bottom:1px solid #e0e0e0}.sidebar section h1+p{padding-top:.4em}.sidebar img{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.3em solid}.sidebar ul{margin-bottom:0.5em;margin-left:0}.sidebar li{list-style:none;padding:0.5em 0;margin:0;border-bottom:1px solid #e0e0e0}.sidebar li p:last-child{margin-bottom:0}.sidebar a{color:inherit;-webkit-transition:color 0.5s;-moz-transition:color 0.5s;-o-transition:color 0.5s;transition:color 0.5s}.sidebar:hover p a,.sidebar:hover li a{color:#1863a1}.sidebar:hover p a:hover,.sidebar:hover li a:hover{color:#0181eb}.aside-alt-link,#tweets a[href*='twitter.com/search'],#pinboard_linkroll .pin-tag{color:#707070}.aside-alt-link:hover,#tweets a[href*='twitter.com/search']:hover,#pinboard_linkroll .pin-tag:hover{color:#0181eb}@media only screen and (min-width: 768px){.toggle-sidebar{outline:none;position:absolute;right:-10px;top:0;bottom:0;display:inline-block;text-decoration:none;color:#cecece;width:9px;cursor:pointer}.toggle-sidebar:hover{background:#e9e9e9;background:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, rgba(224,224,224,0.5)), color-stop(100%, rgba(224,224,224,0)));background:-webkit-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:-moz-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:-o-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0))}.toggle-sidebar:after{position:absolute;right:-11px;top:0;width:20px;font-size:1.2em;line-height:1.1em;padding-bottom:.15em;-moz-border-radius-bottomright:0.3em;-webkit-border-bottom-right-radius:0.3em;border-bottom-right-radius:0.3em;text-align:center;background:#f8f8f8 url('/images/noise.png?1357266755') top left;border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0;content:"\00BB";text-indent:-1px}.collapse-sidebar .toggle-sidebar{text-indent:0px;right:-20px;width:19px}.collapse-sidebar .toggle-sidebar:hover{background:#e9e9e9}.collapse-sidebar .toggle-sidebar:after{border-left:1px solid #e0e0e0;text-shadow:#fff 0 1px;content:"\00AB";left:0px;right:0;text-align:center;text-indent:0;border:0;border-right-width:0;background:none}}#tweets .loading{color:#c4c4c4;text-shadow:#f8f8f8 0 1px;text-align:center;padding:0.5em 0}#tweets .loading:before{content:"";display:block;margin:0 auto}.transform #tweets .loading.error{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);-webkit-box-shadow:#fff 0 -1px;-moz-box-shadow:#fff 0 -1px;box-shadow:#fff 0 -1px;border-bottom:0;border-top:1px solid #e0e0e0}#tweets p{position:relative;padding-right:1em}#tweets a[href*=status]:first-child{color:#969696;float:right;padding:0 0 0.1em 1em;position:relative;right:-1.3em;text-shadow:#fff 0 1px;font-size:.7em;text-decoration:none}#tweets a[href*=status]:first-child span{font-size:1.5em}#tweets a[href*=status]:first-child:hover{color:#0181eb;text-decoration:none}#tweets a[href*='twitter.com/search']{text-decoration:none}#tweets a[href*='twitter.com/search']:hover{text-decoration:underline}.googleplus h1{-moz-box-shadow:none !important;-webkit-box-shadow:none !important;-o-box-shadow:none !important;box-shadow:none !important;border-bottom:0px none !important}.googleplus a{text-decoration:none;white-space:normal !important;line-height:32px}.googleplus a img{float:left;margin-right:0.5em;border:0 none}.googleplus-hidden{position:absolute;top:-1000em;left:-1000em}#pinboard_linkroll .pin-title,#pinboard_linkroll .pin-description{display:block;margin-bottom:.5em}#pinboard_linkroll .pin-tag{text-decoration:none}#pinboard_linkroll .pin-tag:hover{text-decoration:underline}#pinboard_linkroll .pin-tag:after{content:','}#pinboard_linkroll .pin-tag:last-child:after{content:''}.delicious-posts a.delicious-link{margin-bottom:.5em;display:block}.delicious-posts p{font-size:1em}body>footer{font-size:.8em;color:#888;text-shadow:#d9d9d9 0 1px;background-color:#ccc;background:url('/images/noise.png?1357266755'),-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0), color-stop(50%, #cccccc), color-stop(100%, #b0b0b0));background:url('/images/noise.png?1357266755'),-webkit-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1357266755'),-moz-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1357266755'),-o-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1357266755'),linear-gradient(#e0e0e0,#cccccc,#b0b0b0);border-top:1px solid #f2f2f2;position:relative;padding-top:1em;padding-bottom:1em;margin-bottom:3em;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;z-index:1}body>footer a{color:#6b6b6b}body>footer a:visited{color:#6b6b6b}body>footer a:hover{color:#484848}body>footer p:last-child{margin-bottom:0}#blog-archives{color:#aaa}#blog-archives article{padding:1em 0 1em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}#blog-archives article:last-child{background:none}#blog-archives article footer{padding:0;margin:0;font-size:.85em;line-height:1em}#blog-archives h2{display:none}#blog-archives .entry-title{color:#111;margin-bottom:.3em;font-size:1.3em}#blog-archives .entry-title a{text-decoration:none;font-weight:bold;display:inline-block}#blog-archives .entry-title a:hover{text-decoration:underline}#blog-archives .entry-title a:hover{color:#0181eb}#blog-archives article[data-linklog] .entry-title{font-size:1em}#blog-archives article[data-linklog] .entry-title a{text-decoration:underline}#blog-archives a.category,#blog-archives time{color:#aaa}#blog-archives .entry-content{display:none}#blog-archives time{font-size:.9em;line-height:1.2em}#blog-archives time .month,#blog-archives time .day{display:inline-block}#blog-archives time .month{text-transform:uppercase}#blog-archives p{margin-bottom:1em}#blog-archives a:hover{color:#0181eb}@media only screen and (min-width: 550px){#blog-archives article{padding-left:4.5em;padding-bottom:.7em;margin-left:5em}#blog-archives h2{margin-bottom:.3em;font-weight:normal;display:inline-block;position:relative;top:-1px;float:left}#blog-archives h2:first-child{padding-top:.75em}#blog-archives time{position:absolute;text-align:right;left:0em;top:1.8em}#blog-archives .year{display:none}#blog-archives a.category{line-height:1.1em}}figure.code{overflow-x:auto}a[rel=bookmark]{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;text-decoration:none}@font-face{font-family:'MJX_Main';src:url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot");src:url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot?iefix") format("eot"),url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff") format("woff"),url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf") format("opentype"),url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/svg/MathJax_Main-Regular.svg#MathJax_Main-Regular") format("svg")}header[role="banner"]{background-image:url(/images/Terrace2.jpg);background-repeat:no-repeat}#publications q:before{content:"\201C"}#publications q:after{content:"\201D"}#publications q{font-style:normal}#publications i{font-style:italic}#publications a:before{content:"("}#publications a:after{content:")"}#publications a{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;font-size:80%}.theorem{display:block;margin:12px 0;font-style:italic}.theorem:before{content:"Theorem.";font-weight:bold;font-style:normal}.lemma{display:block;margin:12px 0;font-style:italic}.lemma:before{content:"Lemma.";font-weight:bold;font-style:normal}.proof{display:block;margin:12px 0;font-style:normal}.proof:before{content:"Proof.";font-style:italic}.proof:after{content:"\25FC";float:right}.definition{display:block;margin:12px 0;font-style:normal}.definition:before{content:"Definition.";font-weight:bold;font-style:normal}*+table{border-style:solid;border-width:1px;border-color:#e7e3e7}*+table th,*+table td{border-style:dashed;border-width:1px;border-color:#e7e3e7;padding-left:3px;padding-right:3px}*+table th{border-style:solid;font-weight:bold;background:url("/images/noise.png?1330434582") repeat scroll left top #f7f3f7}*+table th[align="left"],*+table td[align="left"]{text-align:left}*+table th[align="right"],*+table td[align="right"]{text-align:right}*+table th[align="center"],*+table td[align="center"]{text-align:center}*+table img{max-width:none !important}
diff --git a/sponsors/index.html b/sponsors/index.html
new file mode 100644
index 00000000..d31d79b3
--- /dev/null
+++ b/sponsors/index.html
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+ sponsors - SALT Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Software AnaLysis and Testing (SALT) Lab
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SALT lab is supported by:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/stylesheets/screen.css b/stylesheets/screen.css
new file mode 100644
index 00000000..f40b0106
--- /dev/null
+++ b/stylesheets/screen.css
@@ -0,0 +1 @@
+html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}a{color:#1863a1}a:visited{color:#751590}a:focus{color:#0181eb}a:hover{color:#0181eb}a:active{color:#01579f}aside.sidebar a{color:#1863a1}aside.sidebar a:focus{color:#0181eb}aside.sidebar a:hover{color:#0181eb}aside.sidebar a:active{color:#01579f}a{-webkit-transition:color 0.3s;-moz-transition:color 0.3s;-o-transition:color 0.3s;transition:color 0.3s}html{background:#252525 url('/images/line-tile.png?1369764182') top left}body>div{background:#f2f2f2 url('/images/noise.png?1369764182') top left;border-bottom:1px solid #bfbfbf}body>div>div{background:#f8f8f8 url('/images/noise.png?1369764182') top left;border-right:1px solid #e0e0e0}.heading,body>header h1,h1,h2,h3,h4,h5,h6{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}.sans,body>header h2,article header p.meta,article>footer,#content .blog-index footer,html .gist .gist-file .gist-meta,#blog-archives a.category,#blog-archives time,aside.sidebar section,body>footer{font-family:"PT Sans","Helvetica Neue",Arial,sans-serif}.serif,body,#content .blog-index a[rel=full-article]{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}.mono,pre,code,tt,p code,li code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace}body>header h1{font-size:2em;font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;font-weight:normal;line-height:1.2em;margin-bottom:0.6667em}body>header h2{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}body{line-height:1.5em;color:#222}h1{font-size:2em;line-height:1.2em}@media only screen and (min-width: 992px){body{font-size:1em}h1{font-size:2em;line-height:1.2em}}h1,h2,h3,h4,h5,h6{text-rendering:optimizelegibility;margin-bottom:1em;font-weight:bold}h2,section h1{font-size:1.5em}h3,section h2,section section h1{font-size:1.3em}h4,section h3,section section h2,section section section h1{font-size:1em}h5,section h4,section section h3{font-size:.9em}h6,section h5,section section h4,section section section h3{font-size:.8em}p,article blockquote,ul,ol{margin-bottom:1.5em}ul{list-style-type:disc}ul ul{list-style-type:circle;margin-bottom:0px}ul ul ul{list-style-type:square;margin-bottom:0px}ol{list-style-type:decimal}ol ol{list-style-type:lower-alpha;margin-bottom:0px}ol ol ol{list-style-type:lower-roman;margin-bottom:0px}ul,ul ul,ul ol,ol,ol ul,ol ol{margin-left:1.3em}ul ul,ul ol,ol ul,ol ol{margin-bottom:0em}strong{font-weight:bold}em{font-style:italic}sup,sub{font-size:0.75em;position:relative;display:inline-block;padding:0 .2em;line-height:.8em}sup{top:-.5em}sub{bottom:-.5em}a[rev='footnote']{font-size:.75em;padding:0 .3em;line-height:1}q{font-style:italic}q:before{content:"\201C"}q:after{content:"\201D"}em,dfn{font-style:italic}strong,dfn{font-weight:bold}del,s{text-decoration:line-through}abbr,acronym{border-bottom:1px dotted;cursor:help}hr{margin-bottom:0.2em}small{font-size:.8em}big{font-size:1.2em}article blockquote{font-style:italic;position:relative;font-size:1em;line-height:1.5em;padding-left:1em;border-left:4px solid rgba(170,170,170,0.5)}article blockquote cite{font-style:italic}article blockquote cite a{color:#aaa !important;word-wrap:break-word}article blockquote cite:before{content:'\2014';padding-right:.3em;padding-left:.3em;color:#aaa}@media only screen and (min-width: 992px){article blockquote{padding-left:1.5em;border-left-width:4px}}.pullquote-right:before,.pullquote-left:before{padding:0;border:none;content:attr(data-pullquote);float:right;width:45%;margin:.5em 0 1em 1.5em;position:relative;top:7px;font-size:1.4em;line-height:1.45em}.pullquote-left:before{float:left;margin:.5em 1.5em 1em 0}.force-wrap,article a,aside.sidebar a{white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word}.group,body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section,body div.pagination,aside.sidebar,#main,#content,.sidebar{*zoom:1}.group:after,body>header:after,body>nav:after,body>footer:after,body #content>article:after,body #content>div>section:after,body div.pagination:after,#main:after,#content:after,.sidebar:after{content:"";display:table;clear:both}body{-webkit-text-size-adjust:none;max-width:1200px;position:relative;margin:0 auto}body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:18px;padding-right:18px}@media only screen and (min-width: 480px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:25px;padding-right:25px}}@media only screen and (min-width: 768px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:35px;padding-right:35px}}@media only screen and (min-width: 992px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:55px;padding-right:55px}}body div.pagination{margin-left:18px;margin-right:18px}@media only screen and (min-width: 480px){body div.pagination{margin-left:25px;margin-right:25px}}@media only screen and (min-width: 768px){body div.pagination{margin-left:35px;margin-right:35px}}@media only screen and (min-width: 992px){body div.pagination{margin-left:55px;margin-right:55px}}body>header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em}#content{overflow:hidden}#content>div,#content>article{width:100%}aside.sidebar{float:none;padding:0 18px 1px;background-color:#f7f7f7;border-top:1px solid #e0e0e0}.flex-content,article img,article video,article .flash-video,aside.sidebar img{max-width:100%;height:auto}.basic-alignment.left,article img.left,article video.left,article .left.flash-video,aside.sidebar img.left{float:left;margin-right:1.5em}.basic-alignment.right,article img.right,article video.right,article .right.flash-video,aside.sidebar img.right{float:right;margin-left:1.5em}.basic-alignment.center,article img.center,article video.center,article .center.flash-video,aside.sidebar img.center{display:block;margin:0 auto 1.5em}.basic-alignment.left,article img.left,article video.left,article .left.flash-video,aside.sidebar img.left,.basic-alignment.right,article img.right,article video.right,article .right.flash-video,aside.sidebar img.right{margin-bottom:.8em}.toggle-sidebar,.no-sidebar .toggle-sidebar{display:none}@media only screen and (min-width: 750px){body.sidebar-footer aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}body.sidebar-footer aside.sidebar section.odd,body.sidebar-footer aside.sidebar section.even{float:left;width:48%}body.sidebar-footer aside.sidebar section.odd{margin-left:0}body.sidebar-footer aside.sidebar section.even{margin-left:4%}body.sidebar-footer aside.sidebar.thirds section{width:30%;margin-left:5%}body.sidebar-footer aside.sidebar.thirds section.first{margin-left:0;clear:both}}body.sidebar-footer #content{margin-right:0px}body.sidebar-footer .toggle-sidebar{display:none}@media only screen and (min-width: 550px){body>header{font-size:1em}}@media only screen and (min-width: 750px){aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}aside.sidebar section.odd,aside.sidebar section.even{float:left;width:48%}aside.sidebar section.odd{margin-left:0}aside.sidebar section.even{margin-left:4%}aside.sidebar.thirds section{width:30%;margin-left:5%}aside.sidebar.thirds section.first{margin-left:0;clear:both}}@media only screen and (min-width: 768px){body{-webkit-text-size-adjust:auto}body>header{font-size:1.2em}#main{padding:0;margin:0 auto}#content{overflow:visible;margin-right:240px;position:relative}.no-sidebar #content{margin-right:0;border-right:0}.collapse-sidebar #content{margin-right:20px}#content>div,#content>article{padding-top:17.5px;padding-bottom:17.5px;float:left}aside.sidebar{width:210px;padding:0 15px 15px;background:none;clear:none;float:left;margin:0 -100% 0 0}aside.sidebar section{width:auto;margin-left:0}aside.sidebar section.odd,aside.sidebar section.even{float:none;width:auto;margin-left:0}.collapse-sidebar aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}.collapse-sidebar aside.sidebar section.odd,.collapse-sidebar aside.sidebar section.even{float:left;width:48%}.collapse-sidebar aside.sidebar section.odd{margin-left:0}.collapse-sidebar aside.sidebar section.even{margin-left:4%}.collapse-sidebar aside.sidebar.thirds section{width:30%;margin-left:5%}.collapse-sidebar aside.sidebar.thirds section.first{margin-left:0;clear:both}}@media only screen and (min-width: 992px){body>header{font-size:1.3em}#content{margin-right:300px}#content>div,#content>article{padding-top:27.5px;padding-bottom:27.5px}aside.sidebar{width:260px;padding:1.2em 20px 20px}.collapse-sidebar aside.sidebar{padding-left:55px;padding-right:55px}}@media only screen and (min-width: 768px){ul,ol{margin-left:0}}body>header{background:#333}body>header h1{display:inline-block;margin:0}body>header h1 a,body>header h1 a:visited,body>header h1 a:hover{color:#f2f2f2;text-decoration:none}body>header h2{margin:.2em 0 0;font-size:1em;color:#aaa;font-weight:normal}body>nav{position:relative;background-color:#ccc;background:url('/images/noise.png?1369764182'),-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0), color-stop(50%, #cccccc), color-stop(100%, #b0b0b0));background:url('/images/noise.png?1369764182'),-webkit-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1369764182'),-moz-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1369764182'),-o-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1369764182'),linear-gradient(#e0e0e0,#cccccc,#b0b0b0);border-top:1px solid #f2f2f2;border-bottom:1px solid #8c8c8c;padding-top:.35em;padding-bottom:.35em}body>nav form{-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;margin:0;padding:0}body>nav form .search{padding:.3em .5em 0;font-size:.85em;font-family:"PT Sans","Helvetica Neue",Arial,sans-serif;line-height:1.1em;width:95%;-webkit-border-radius:0.5em;-moz-border-radius:0.5em;-ms-border-radius:0.5em;-o-border-radius:0.5em;border-radius:0.5em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-box-shadow:#d1d1d1 0 1px;-moz-box-shadow:#d1d1d1 0 1px;box-shadow:#d1d1d1 0 1px;background-color:#f2f2f2;border:1px solid #b3b3b3;color:#888}body>nav form .search:focus{color:#444;border-color:#80b1df;-webkit-box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;-moz-box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;background-color:#fff;outline:none}body>nav fieldset[role=search]{float:right;width:48%}body>nav fieldset.mobile-nav{float:left;width:48%}body>nav fieldset.mobile-nav select{width:100%;font-size:.8em;border:1px solid #888}body>nav ul{display:none}@media only screen and (min-width: 550px){body>nav{font-size:.9em}body>nav ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;float:left;display:block;padding-top:.15em}body>nav ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;display:inline;float:left;padding-left:0;padding-right:0}body>nav ul li:first-child,body>nav ul li.first{padding-left:0}body>nav ul li:last-child{padding-right:0}body>nav ul li.last{padding-right:0}body>nav ul.subscription{margin-left:.8em;float:right}body>nav ul.subscription li:last-child a{padding-right:0}body>nav ul li{margin:0}body>nav a{color:#6b6b6b;font-family:"PT Sans","Helvetica Neue",Arial,sans-serif;text-shadow:#ebebeb 0 1px;float:left;text-decoration:none;font-size:1.1em;padding:.1em 0;line-height:1.5em}body>nav a:visited{color:#6b6b6b}body>nav a:hover{color:#2b2b2b}body>nav li+li{border-left:1px solid #b0b0b0;margin-left:.8em}body>nav li+li a{padding-left:.8em;border-left:1px solid #dedede}body>nav form{float:right;text-align:left;padding-left:.8em;width:175px}body>nav form .search{width:93%;font-size:.95em;line-height:1.2em}body>nav ul[data-subscription$=email]+form{width:97px}body>nav ul[data-subscription$=email]+form .search{width:91%}body>nav fieldset.mobile-nav{display:none}body>nav fieldset[role=search]{width:99%}}@media only screen and (min-width: 992px){body>nav form{width:215px}body>nav ul[data-subscription$=email]+form{width:147px}}.no-placeholder body>nav .search{background:#f2f2f2 url('/images/search.png?1369764182') 0.3em 0.25em no-repeat;text-indent:1.3em}@media only screen and (min-width: 550px){.maskImage body>nav ul[data-subscription$=email]+form{width:123px}}@media only screen and (min-width: 992px){.maskImage body>nav ul[data-subscription$=email]+form{width:173px}}.maskImage ul.subscription{position:relative;top:.2em}.maskImage ul.subscription li,.maskImage ul.subscription a{border:0;padding:0}.maskImage a[rel=subscribe-rss]{position:relative;top:0px;text-indent:-999999em;background-color:#dedede;border:0;padding:0}.maskImage a[rel=subscribe-rss],.maskImage a[rel=subscribe-rss]:after{-webkit-mask-image:url('/images/rss.png?1369764182');-moz-mask-image:url('/images/rss.png?1369764182');-ms-mask-image:url('/images/rss.png?1369764182');-o-mask-image:url('/images/rss.png?1369764182');mask-image:url('/images/rss.png?1369764182');-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;width:22px;height:22px}.maskImage a[rel=subscribe-rss]:after{content:"";position:absolute;top:-1px;left:0;background-color:#ababab}.maskImage a[rel=subscribe-rss]:hover:after{background-color:#9e9e9e}.maskImage a[rel=subscribe-email]{position:relative;top:0px;text-indent:-999999em;background-color:#dedede;border:0;padding:0}.maskImage a[rel=subscribe-email],.maskImage a[rel=subscribe-email]:after{-webkit-mask-image:url('/images/email.png?1369764182');-moz-mask-image:url('/images/email.png?1369764182');-ms-mask-image:url('/images/email.png?1369764182');-o-mask-image:url('/images/email.png?1369764182');mask-image:url('/images/email.png?1369764182');-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;width:28px;height:22px}.maskImage a[rel=subscribe-email]:after{content:"";position:absolute;top:-1px;left:0;background-color:#ababab}.maskImage a[rel=subscribe-email]:hover:after{background-color:#9e9e9e}article{padding-top:1em}article header{position:relative;padding-top:2em;padding-bottom:1em;margin-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}article header h1{margin:0}article header h1 a{text-decoration:none}article header h1 a:hover{text-decoration:underline}article header p{font-size:.9em;color:#aaa;margin:0}article header p.meta{text-transform:uppercase;position:absolute;top:0}@media only screen and (min-width: 768px){article header{margin-bottom:1.5em;padding-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}}article h2{padding-top:0.8em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}.entry-content article h2:first-child,article header+h2{padding-top:0}article h2:first-child,article header+h2{background:none}article .feature{padding-top:.5em;margin-bottom:1em;padding-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x;font-size:2.0em;font-style:italic;line-height:1.3em}article img,article video,article .flash-video{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.5em solid}article video,article .flash-video{margin:0 auto 1.5em}article video{display:block;width:100%}article .flash-video>div{position:relative;display:block;padding-bottom:56.25%;padding-top:1px;height:0;overflow:hidden}article .flash-video>div iframe,article .flash-video>div object,article .flash-video>div embed{position:absolute;top:0;left:0;width:100%;height:100%}article>footer{padding-bottom:2.5em;margin-top:2em}article>footer p.meta{margin-bottom:.8em;font-size:.85em;clear:both;overflow:hidden}.blog-index article+article{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}#content .blog-index{padding-top:0;padding-bottom:0}#content .blog-index article{padding-top:2em}#content .blog-index article header{background:none;padding-bottom:0}#content .blog-index article h1{font-size:1.6em}#content .blog-index article h1 a{color:inherit}#content .blog-index article h1 a:hover{color:#0181eb}#content .blog-index a[rel=full-article]{background:#ebebeb;display:inline-block;padding:.4em .8em;margin-right:.5em;text-decoration:none;color:#666;-webkit-transition:background-color 0.5s;-moz-transition:background-color 0.5s;-o-transition:background-color 0.5s;transition:background-color 0.5s}#content .blog-index a[rel=full-article]:hover{background:#0181eb;text-shadow:none;color:#f8f8f8}#content .blog-index footer{margin-top:1em}.separator,article>footer .byline+time:before,article>footer time+time:before,article>footer .comments:before,article>footer .byline ~ .categories:before{content:"\2022 ";padding:0 .4em 0 .2em;display:inline-block}#content div.pagination{text-align:center;font-size:.95em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x;padding-top:1.5em;padding-bottom:1.5em}#content div.pagination a{text-decoration:none;color:#aaa}#content div.pagination a.prev{position:absolute;left:0}#content div.pagination a.next{position:absolute;right:0}#content div.pagination a:hover{color:#0181eb}#content div.pagination a[href*=archive]:before,#content div.pagination a[href*=archive]:after{content:'\2014';padding:0 .3em}p.meta+.sharing{padding-top:1em;padding-left:0;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}#fb-root{display:none}.highlight,html .gist .gist-file .gist-syntax .gist-highlight{border:1px solid #05232b !important}.highlight table td.code,html .gist .gist-file .gist-syntax .gist-highlight table td.code{width:100%}.highlight .line-numbers,html .gist .gist-file .gist-syntax .highlight .line_numbers{text-align:right;font-size:13px;line-height:1.45em;background:#073642 url('/images/noise.png?1369764182') top left !important;border-right:1px solid #00232c !important;-webkit-box-shadow:#083e4b -1px 0 inset;-moz-box-shadow:#083e4b -1px 0 inset;box-shadow:#083e4b -1px 0 inset;text-shadow:#021014 0 -1px;padding:.8em !important;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}.highlight .line-numbers span,html .gist .gist-file .gist-syntax .highlight .line_numbers span{color:#586e75 !important}figure.code,.gist-file,pre{-webkit-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-moz-box-shadow:rgba(0,0,0,0.06) 0 0 10px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}figure.code .highlight pre,.gist-file .highlight pre,pre .highlight pre{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.gist .highlight *::-moz-selection,figure.code .highlight *::-moz-selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}.gist .highlight *::-webkit-selection,figure.code .highlight *::-webkit-selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}.gist .highlight *::selection,figure.code .highlight *::selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}html .gist .gist-file{margin-bottom:1.8em;position:relative;border:none;padding-top:26px !important}html .gist .gist-file .highlight{margin-bottom:0}html .gist .gist-file .gist-syntax{border-bottom:0 !important;background:none !important}html .gist .gist-file .gist-syntax .gist-highlight{background:#002b36 !important}html .gist .gist-file .gist-syntax .highlight pre{padding:0}html .gist .gist-file .gist-meta{padding:.6em 0.8em;border:1px solid #083e4b !important;color:#586e75;font-size:.7em !important;background:#073642 url('/images/noise.png?1369764182') top left;line-height:1.5em}html .gist .gist-file .gist-meta a{color:#75878b !important;text-decoration:none}html .gist .gist-file .gist-meta a:hover{text-decoration:underline}html .gist .gist-file .gist-meta a:hover{color:#93a1a1 !important}html .gist .gist-file .gist-meta a[href*='#file']{position:absolute;top:0;left:0;right:-10px;color:#474747 !important}html .gist .gist-file .gist-meta a[href*='#file']:hover{color:#1863a1 !important}html .gist .gist-file .gist-meta a[href*=raw]{top:.4em}pre{background:#002b36 url('/images/noise.png?1369764182') top left;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;border:1px solid #05232b;line-height:1.45em;font-size:13px;margin-bottom:2.1em;padding:.8em 1em;color:#93a1a1;overflow:auto}h3.filename+pre{-moz-border-radius-topleft:0px;-webkit-border-top-left-radius:0px;border-top-left-radius:0px;-moz-border-radius-topright:0px;-webkit-border-top-right-radius:0px;border-top-right-radius:0px}p code,li code{display:inline-block;white-space:no-wrap;background:#fff;font-size:.8em;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;padding:0 .3em;margin:-1px 0}p pre code,li pre code{font-size:1em !important;background:none;border:none}.pre-code,html .gist .gist-file .gist-syntax .highlight pre,.highlight code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace !important;overflow:scroll;overflow-y:hidden;display:block;padding:.8em;overflow-x:auto;line-height:1.45em;background:#002b36 url('/images/noise.png?1369764182') top left !important;color:#93a1a1 !important}.pre-code span,html .gist .gist-file .gist-syntax .highlight pre span,.highlight code span{color:#93a1a1 !important}.pre-code span,html .gist .gist-file .gist-syntax .highlight pre span,.highlight code span{font-style:normal !important;font-weight:normal !important}.pre-code .c,html .gist .gist-file .gist-syntax .highlight pre .c,.highlight code .c{color:#586e75 !important;font-style:italic !important}.pre-code .cm,html .gist .gist-file .gist-syntax .highlight pre .cm,.highlight code .cm{color:#586e75 !important;font-style:italic !important}.pre-code .cp,html .gist .gist-file .gist-syntax .highlight pre .cp,.highlight code .cp{color:#586e75 !important;font-style:italic !important}.pre-code .c1,html .gist .gist-file .gist-syntax .highlight pre .c1,.highlight code .c1{color:#586e75 !important;font-style:italic !important}.pre-code .cs,html .gist .gist-file .gist-syntax .highlight pre .cs,.highlight code .cs{color:#586e75 !important;font-weight:bold !important;font-style:italic !important}.pre-code .err,html .gist .gist-file .gist-syntax .highlight pre .err,.highlight code .err{color:#dc322f !important;background:none !important}.pre-code .k,html .gist .gist-file .gist-syntax .highlight pre .k,.highlight code .k{color:#cb4b16 !important}.pre-code .o,html .gist .gist-file .gist-syntax .highlight pre .o,.highlight code .o{color:#93a1a1 !important;font-weight:bold !important}.pre-code .p,html .gist .gist-file .gist-syntax .highlight pre .p,.highlight code .p{color:#93a1a1 !important}.pre-code .ow,html .gist .gist-file .gist-syntax .highlight pre .ow,.highlight code .ow{color:#2aa198 !important;font-weight:bold !important}.pre-code .gd,html .gist .gist-file .gist-syntax .highlight pre .gd,.highlight code .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block}.pre-code .gd .x,html .gist .gist-file .gist-syntax .highlight pre .gd .x,.highlight code .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block}.pre-code .ge,html .gist .gist-file .gist-syntax .highlight pre .ge,.highlight code .ge{color:#93a1a1 !important;font-style:italic !important}.pre-code .gh,html .gist .gist-file .gist-syntax .highlight pre .gh,.highlight code .gh{color:#586e75 !important}.pre-code .gi,html .gist .gist-file .gist-syntax .highlight pre .gi,.highlight code .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block}.pre-code .gi .x,html .gist .gist-file .gist-syntax .highlight pre .gi .x,.highlight code .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block}.pre-code .gs,html .gist .gist-file .gist-syntax .highlight pre .gs,.highlight code .gs{color:#93a1a1 !important;font-weight:bold !important}.pre-code .gu,html .gist .gist-file .gist-syntax .highlight pre .gu,.highlight code .gu{color:#6c71c4 !important}.pre-code .kc,html .gist .gist-file .gist-syntax .highlight pre .kc,.highlight code .kc{color:#859900 !important;font-weight:bold !important}.pre-code .kd,html .gist .gist-file .gist-syntax .highlight pre .kd,.highlight code .kd{color:#268bd2 !important}.pre-code .kp,html .gist .gist-file .gist-syntax .highlight pre .kp,.highlight code .kp{color:#cb4b16 !important;font-weight:bold !important}.pre-code .kr,html .gist .gist-file .gist-syntax .highlight pre .kr,.highlight code .kr{color:#d33682 !important;font-weight:bold !important}.pre-code .kt,html .gist .gist-file .gist-syntax .highlight pre .kt,.highlight code .kt{color:#2aa198 !important}.pre-code .n,html .gist .gist-file .gist-syntax .highlight pre .n,.highlight code .n{color:#268bd2 !important}.pre-code .na,html .gist .gist-file .gist-syntax .highlight pre .na,.highlight code .na{color:#268bd2 !important}.pre-code .nb,html .gist .gist-file .gist-syntax .highlight pre .nb,.highlight code .nb{color:#859900 !important}.pre-code .nc,html .gist .gist-file .gist-syntax .highlight pre .nc,.highlight code .nc{color:#d33682 !important}.pre-code .no,html .gist .gist-file .gist-syntax .highlight pre .no,.highlight code .no{color:#b58900 !important}.pre-code .nl,html .gist .gist-file .gist-syntax .highlight pre .nl,.highlight code .nl{color:#859900 !important}.pre-code .ne,html .gist .gist-file .gist-syntax .highlight pre .ne,.highlight code .ne{color:#268bd2 !important;font-weight:bold !important}.pre-code .nf,html .gist .gist-file .gist-syntax .highlight pre .nf,.highlight code .nf{color:#268bd2 !important;font-weight:bold !important}.pre-code .nn,html .gist .gist-file .gist-syntax .highlight pre .nn,.highlight code .nn{color:#b58900 !important}.pre-code .nt,html .gist .gist-file .gist-syntax .highlight pre .nt,.highlight code .nt{color:#268bd2 !important;font-weight:bold !important}.pre-code .nx,html .gist .gist-file .gist-syntax .highlight pre .nx,.highlight code .nx{color:#b58900 !important}.pre-code .vg,html .gist .gist-file .gist-syntax .highlight pre .vg,.highlight code .vg{color:#268bd2 !important}.pre-code .vi,html .gist .gist-file .gist-syntax .highlight pre .vi,.highlight code .vi{color:#268bd2 !important}.pre-code .nv,html .gist .gist-file .gist-syntax .highlight pre .nv,.highlight code .nv{color:#268bd2 !important}.pre-code .mf,html .gist .gist-file .gist-syntax .highlight pre .mf,.highlight code .mf{color:#2aa198 !important}.pre-code .m,html .gist .gist-file .gist-syntax .highlight pre .m,.highlight code .m{color:#2aa198 !important}.pre-code .mh,html .gist .gist-file .gist-syntax .highlight pre .mh,.highlight code .mh{color:#2aa198 !important}.pre-code .mi,html .gist .gist-file .gist-syntax .highlight pre .mi,.highlight code .mi{color:#2aa198 !important}.pre-code .s,html .gist .gist-file .gist-syntax .highlight pre .s,.highlight code .s{color:#2aa198 !important}.pre-code .sd,html .gist .gist-file .gist-syntax .highlight pre .sd,.highlight code .sd{color:#2aa198 !important}.pre-code .s2,html .gist .gist-file .gist-syntax .highlight pre .s2,.highlight code .s2{color:#2aa198 !important}.pre-code .se,html .gist .gist-file .gist-syntax .highlight pre .se,.highlight code .se{color:#dc322f !important}.pre-code .si,html .gist .gist-file .gist-syntax .highlight pre .si,.highlight code .si{color:#268bd2 !important}.pre-code .sr,html .gist .gist-file .gist-syntax .highlight pre .sr,.highlight code .sr{color:#2aa198 !important}.pre-code .s1,html .gist .gist-file .gist-syntax .highlight pre .s1,.highlight code .s1{color:#2aa198 !important}.pre-code div .gd,html .gist .gist-file .gist-syntax .highlight pre div .gd,.highlight code div .gd,.pre-code div .gd .x,html .gist .gist-file .gist-syntax .highlight pre div .gd .x,.highlight code div .gd .x,.pre-code div .gi,html .gist .gist-file .gist-syntax .highlight pre div .gi,.highlight code div .gi,.pre-code div .gi .x,html .gist .gist-file .gist-syntax .highlight pre div .gi .x,.highlight code div .gi .x{display:inline-block;width:100%}.highlight,.gist-highlight{margin-bottom:1.8em;background:#002b36;overflow-y:hidden;overflow-x:auto}.highlight pre,.gist-highlight pre{background:none;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;border:none;padding:0;margin-bottom:0}pre::-webkit-scrollbar,.highlight::-webkit-scrollbar,.gist-highlight::-webkit-scrollbar{height:.5em;background:rgba(255,255,255,0.15)}pre::-webkit-scrollbar-thumb:horizontal,.highlight::-webkit-scrollbar-thumb:horizontal,.gist-highlight::-webkit-scrollbar-thumb:horizontal{background:rgba(255,255,255,0.2);-webkit-border-radius:4px;border-radius:4px}.highlight code{background:#000}figure.code{background:none;padding:0;border:0;margin-bottom:1.5em}figure.code pre{margin-bottom:0}figure.code figcaption{position:relative}figure.code .highlight{margin-bottom:0}.code-title,html .gist .gist-file .gist-meta a[href*='#file'],h3.filename,figure.code figcaption{text-align:center;font-size:13px;line-height:2em;text-shadow:#cbcccc 0 1px 0;color:#474747;font-weight:normal;margin-bottom:0;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;font-family:"Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif;background:#aaa url('/images/code_bg.png?1369764182') top repeat-x;border:1px solid #565656;border-top-color:#cbcbcb;border-left-color:#a5a5a5;border-right-color:#a5a5a5;border-bottom:0}.download-source,html .gist .gist-file .gist-meta a[href*=raw],figure.code figcaption a{position:absolute;right:.8em;text-decoration:none;color:#666 !important;z-index:1;font-size:13px;text-shadow:#cbcccc 0 1px 0;padding-left:3em}.download-source:hover,html .gist .gist-file .gist-meta a[href*=raw]:hover,figure.code figcaption a:hover{text-decoration:underline}#archive #content>div,#archive #content>div>article{padding-top:0}#blog-archives{color:#aaa}#blog-archives article{padding:1em 0 1em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}#blog-archives article:last-child{background:none}#blog-archives article footer{padding:0;margin:0}#blog-archives h1{color:#222;margin-bottom:.3em}#blog-archives h2{display:none}#blog-archives h1{font-size:1.5em}#blog-archives h1 a{text-decoration:none;color:inherit;font-weight:normal;display:inline-block}#blog-archives h1 a:hover{text-decoration:underline}#blog-archives h1 a:hover{color:#0181eb}#blog-archives a.category,#blog-archives time{color:#aaa}#blog-archives .entry-content{display:none}#blog-archives time{font-size:.9em;line-height:1.2em}#blog-archives time .month,#blog-archives time .day{display:inline-block}#blog-archives time .month{text-transform:uppercase}#blog-archives p{margin-bottom:1em}#blog-archives a,#blog-archives .entry-content a{color:inherit}#blog-archives a:hover,#blog-archives .entry-content a:hover{color:#0181eb}#blog-archives a:hover{color:#0181eb}@media only screen and (min-width: 550px){#blog-archives article{margin-left:5em}#blog-archives h2{margin-bottom:.3em;font-weight:normal;display:inline-block;position:relative;top:-1px;float:left}#blog-archives h2:first-child{padding-top:.75em}#blog-archives time{position:absolute;text-align:right;left:0em;top:1.8em}#blog-archives .year{display:none}#blog-archives article{padding-left:4.5em;padding-bottom:.7em}#blog-archives a.category{line-height:1.1em}}#content>.category article{margin-left:0;padding-left:6.8em}#content>.category .year{display:inline}.side-shadow-border,aside.sidebar section h1,aside.sidebar li{-webkit-box-shadow:#fff 0 1px;-moz-box-shadow:#fff 0 1px;box-shadow:#fff 0 1px}aside.sidebar{overflow:hidden;color:#4b4b4b;text-shadow:#fff 0 1px}aside.sidebar section{font-size:.8em;line-height:1.4em;margin-bottom:1.5em}aside.sidebar section h1{margin:1.5em 0 0;padding-bottom:.2em;border-bottom:1px solid #e0e0e0}aside.sidebar section h1+p{padding-top:.4em}aside.sidebar img{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.3em solid}aside.sidebar ul{margin-bottom:0.5em;margin-left:0}aside.sidebar li{list-style:none;padding:.5em 0;margin:0;border-bottom:1px solid #e0e0e0}aside.sidebar li p:last-child{margin-bottom:0}aside.sidebar a{color:inherit;-webkit-transition:color 0.5s;-moz-transition:color 0.5s;-o-transition:color 0.5s;transition:color 0.5s}aside.sidebar:hover a{color:#1863a1}aside.sidebar:hover a:hover{color:#0181eb}.aside-alt-link,#pinboard_linkroll .pin-tag{color:#7e7e7e}.aside-alt-link:hover,#pinboard_linkroll .pin-tag:hover{color:#0181eb}@media only screen and (min-width: 768px){.toggle-sidebar{outline:none;position:absolute;right:-10px;top:0;bottom:0;display:inline-block;text-decoration:none;color:#cecece;width:9px;cursor:pointer}.toggle-sidebar:hover{background:#e9e9e9;background:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, rgba(224,224,224,0.5)), color-stop(100%, rgba(224,224,224,0)));background:-webkit-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:-moz-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:-o-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0))}.toggle-sidebar:after{position:absolute;right:-11px;top:0;width:20px;font-size:1.2em;line-height:1.1em;padding-bottom:.15em;-moz-border-radius-bottomright:0.3em;-webkit-border-bottom-right-radius:0.3em;border-bottom-right-radius:0.3em;text-align:center;background:#f8f8f8 url('/images/noise.png?1369764182') top left;border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0;content:"\00BB";text-indent:-1px}.collapse-sidebar .toggle-sidebar{text-indent:0px;right:-20px;width:19px}.collapse-sidebar .toggle-sidebar:hover{background:#e9e9e9}.collapse-sidebar .toggle-sidebar:after{border-left:1px solid #e0e0e0;text-shadow:#fff 0 1px;content:"\00AB";left:0px;right:0;text-align:center;text-indent:0;border:0;border-right-width:0;background:none}}.googleplus h1{-moz-box-shadow:none !important;-webkit-box-shadow:none !important;-o-box-shadow:none !important;box-shadow:none !important;border-bottom:0px none !important}.googleplus a{text-decoration:none;white-space:normal !important;line-height:32px}.googleplus a img{float:left;margin-right:0.5em;border:0 none}.googleplus-hidden{position:absolute;top:-1000em;left:-1000em}#pinboard_linkroll .pin-title,#pinboard_linkroll .pin-description{display:block;margin-bottom:.5em}#pinboard_linkroll .pin-tag{text-decoration:none}#pinboard_linkroll .pin-tag:hover{text-decoration:underline}#pinboard_linkroll .pin-tag:after{content:','}#pinboard_linkroll .pin-tag:last-child:after{content:''}.delicious-posts a.delicious-link{margin-bottom:.5em;display:block}.delicious-posts p{font-size:1em}body>footer{font-size:.8em;color:#888;text-shadow:#d9d9d9 0 1px;background-color:#ccc;background:url('/images/noise.png?1369764182'),-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0), color-stop(50%, #cccccc), color-stop(100%, #b0b0b0));background:url('/images/noise.png?1369764182'),-webkit-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1369764182'),-moz-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1369764182'),-o-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1369764182'),linear-gradient(#e0e0e0,#cccccc,#b0b0b0);border-top:1px solid #f2f2f2;position:relative;padding-top:1em;padding-bottom:1em;margin-bottom:3em;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;z-index:1}body>footer a{color:#6b6b6b}body>footer a:visited{color:#6b6b6b}body>footer a:hover{color:#484848}body>footer p:last-child{margin-bottom:0}.year{font-weight:bold}ul{margin:18px}.pub{font-size:11pt}#publications q:before{content:"\201C"}#publications q:after{content:"\201D"}#publications q{font-style:normal;font-weight:bold;text-decoration:underline}#publications i{font-style:italic}#publications a:before{content:"("}#publications a:after{content:")"}#publications a{font-family:"PT Sans","Helvetica Neue",Arial,sans-serif;font-size:80%}.theorem{display:block;margin:12px 0;font-style:italic}.theorem:before{content:"Theorem.";font-weight:bold;font-style:normal}.lemma{display:block;margin:12px 0;font-style:italic}.lemma:before{content:"Lemma.";font-weight:bold;font-style:normal}.proof{display:block;margin:12px 0;font-style:normal}.proof:before{content:"Proof.";font-style:italic}.proof:after{content:"\25FC";float:right}.definition{display:block;margin:12px 0;font-style:normal}.definition:before{content:"Definition.";font-weight:bold;font-style:normal}*+table{border-style:solid;border-width:1px;border-color:#e7e3e7}*+table th,*+table td{border-style:dashed;border-width:1px;border-color:#e7e3e7;padding-left:3px;padding-right:3px}*+table th{border-style:solid;font-weight:bold;background:url("/images/noise.png?1330434582") repeat scroll left top #f7f3f7}*+table th[align="left"],*+table td[align="left"]{text-align:left}*+table th[align="right"],*+table td[align="right"]{text-align:right}*+table th[align="center"],*+table td[align="center"]{text-align:center}*+table img{max-width:none !important}
diff --git a/stylesheets/screen.css.notused b/stylesheets/screen.css.notused
new file mode 100644
index 00000000..5040bb96
--- /dev/null
+++ b/stylesheets/screen.css.notused
@@ -0,0 +1 @@
+html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary{display:block}.icon-sprite,.icon-facebook,.facebook-share:before,.icon-github,.sidebar .github-follow:before,.icon-googleplus,.googleplus-share:before,.icon-twitter-bird,#tweets .loading:before,.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background:url('/images/icon-sdc231d6676.png') no-repeat}.icon-facebook,.facebook-share:before{background-position:0 -80px;height:16px;width:12px}.icon-github,.sidebar .github-follow:before{background-position:0 -48px;height:16px;width:16px}.icon-googleplus,.googleplus-share:before{background-position:0 -64px;height:16px;width:11px}.icon-twitter-bird,#tweets .loading:before{background-position:0 0;height:32px;width:32px}.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background-position:0 -32px;height:16px;width:14px}a{color:#1863a1;color:#1863a1}a:visited{color:#751590}a:focus{color:#0181eb}a:hover{color:#0181eb}a:active{color:#01579f}.sidebar a{color:#1863a1}.sidebar a:focus{color:#0181eb}.sidebar a:hover{color:#0181eb}.sidebar a:active{color:#01579f}a{-webkit-transition:color 0.3s;-moz-transition:color 0.3s;-o-transition:color 0.3s;transition:color 0.3s}html{background:#12212b url('/images/line-tile.png?1357438739') top left}body>div{background:#f2f2f2 url('/images/noise.png?1357266755') top left;border-bottom:1px solid #bfbfbf}body>div>div{background:#f8f8f8 url('/images/noise.png?1357266755') top left;border-right:1px solid #e0e0e0}.icon-sprite,.icon-facebook,.facebook-share:before,.icon-github,.sidebar .github-follow:before,.icon-googleplus,.googleplus-share:before,.icon-twitter-bird,#tweets .loading:before,.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background:url('/images/icon-sdc231d6676.png') no-repeat}.icon-facebook,.facebook-share:before{background-position:0 -80px;height:16px;width:12px}.icon-github,.sidebar .github-follow:before{background-position:0 -48px;height:16px;width:16px}.icon-googleplus,.googleplus-share:before{background-position:0 -64px;height:16px;width:11px}.icon-twitter-bird,#tweets .loading:before{background-position:0 0;height:32px;width:32px}.icon-twitter,.twitter-share:before,.sidebar a.twitter-follow-button:before{background-position:0 -32px;height:16px;width:14px}a{color:#1863a1;color:#1863a1}a:visited{color:#751590}a:focus{color:#0181eb}a:hover{color:#0181eb}a:active{color:#01579f}.sidebar a{color:#1863a1}.sidebar a:focus{color:#0181eb}.sidebar a:hover{color:#0181eb}.sidebar a:active{color:#01579f}a{-webkit-transition:color 0.3s;-moz-transition:color 0.3s;-o-transition:color 0.3s;transition:color 0.3s}html{background:#12212b url('/images/line-tile.png?1357438739') top left}body>div{background:#f2f2f2 url('/images/noise.png?1357266755') top left;border-bottom:1px solid #bfbfbf}body>div>div{background:#f8f8f8 url('/images/noise.png?1357266755') top left;border-right:1px solid #e0e0e0}.heading,body>header h1,h1,h2,h3,h4,h5,h6{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}.sans,body>header h2,article header p.meta,article>footer,#blog-archives a.category,#blog-archives time,.sidebar section,body>footer{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif}.serif,body,article a[rel=full-article]{font-family:"MJX_Main",Georgia,Times,"Times New Roman",serif}.mono,pre,code,tt,p code,li code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace}body>header h1{font-size:2.2em;font-family:"Varela","Helvetica Neue",Arial,sans-serif;font-weight:normal;line-height:1.2em;margin-bottom:0.6667em}body>header h2{font-family:"Varela","Helvetica Neue",Arial,sans-serif}body{line-height:1.5em;color:#111}h1,h2,h3,h4,h5,h6{text-rendering:optimizelegibility;margin-bottom:1em;font-weight:bold}h1{font-size:2.2em;line-height:1.2em}h2,section h1{font-size:1.5em}h3,section h2,section section h1{font-size:1.3em}h4,section h3,section section h2,section section section h1{font-size:1em}h5,section h4,section section h3{font-size:0.9em}h6,section h5,section section h4,section section section h3{font-size:0.8em}@media only screen and (min-width: 992px){body{font-size:1.15em}}p,blockquote,ul,ol{margin-bottom:1.5em}ul{list-style-type:disc}ul ul{list-style-type:circle;margin-bottom:0px}ul ul ul{list-style-type:square;margin-bottom:0px}ol{list-style-type:decimal}ol ol{list-style-type:lower-alpha;margin-bottom:0px}ol ol ol{list-style-type:lower-roman;margin-bottom:0px}ul,ul ul,ul ol,ol,ol ul,ol ol{margin-left:1.3em}strong{font-weight:bold}em{font-style:italic}sup,sub{vertical-align:baseline;font-size:0.8em;position:relative}sup{top:-.5em}sub{bottom:-.5em}q{font-style:italic}q:before{content:"\201C"}q:after{content:"\201D"}em,dfn{font-style:italic}strong,dfn{font-weight:bold}del,s{text-decoration:line-through}abbr,acronym{border-bottom:1px dotted;cursor:help}sub,sup{line-height:0}hr{margin-bottom:0.2em}small{font-size:.8em}big{font-size:1.2em}blockquote{font-style:italic;position:relative;font-size:1.2em;line-height:1.5em;padding-left:1em;border-left:4px solid rgba(170,170,170,0.5)}blockquote cite{font-style:italic}blockquote cite a{color:#aaa !important;word-wrap:break-word}blockquote cite:before{content:'\2014';padding-right:.3em;padding-left:.3em;color:#aaa}@media only screen and (min-width: 992px){blockquote{padding-left:1.5em;border-left-width:4px}}.pullquote-right:before,.pullquote-left:before{padding:0;border:none;content:attr(data-pullquote);float:right;width:45%;margin:0.5em 0 1em 1.5em;position:relative;top:7px;font-size:1.4em;line-height:1.45em}.pullquote-left:before{float:left;margin:0.5em 1.5em 1em 0}.force-wrap,article a,.sidebar a{white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word}.group,body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section,body div.pagination,aside.sidebar,#main,#content,.sidebar{*zoom:1}.group:after,body>header:after,body>nav:after,body>footer:after,body #content>article:after,body #content>div>article:after,body #content>div>section:after,body div.pagination:after,#main:after,#content:after,.sidebar:after{content:"";display:table;clear:both}body{-webkit-text-size-adjust:none;max-width:1200px;position:relative;margin:0 auto}body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:18px;padding-right:18px}@media only screen and (min-width: 480px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:25px;padding-right:25px}}@media only screen and (min-width: 768px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:35px;padding-right:35px}}@media only screen and (min-width: 992px){body>header,body>nav,body>footer,body #content>article,body #content>div>article,body #content>div>section{padding-left:55px;padding-right:55px}}body div.pagination{margin-left:18px;margin-right:18px}@media only screen and (min-width: 480px){body div.pagination{margin-left:25px;margin-right:25px}}@media only screen and (min-width: 768px){body div.pagination{margin-left:35px;margin-right:35px}}@media only screen and (min-width: 992px){body div.pagination{margin-left:55px;margin-right:55px}}body>header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em}#content{overflow:hidden}#content>div,#content>article{width:100%}aside.sidebar{float:none;padding:0 18px 1px;background-color:#f7f7f7;border-top:1px solid #e0e0e0}.flex-content,article img,article video,article .flash-video,.sidebar img{max-width:100%;height:auto}.basic-alignment.left,article img.left,article video.left,article .left.flash-video,.sidebar img.left{float:left;margin-right:1.5em}.basic-alignment.right,article img.right,article video.right,article .right.flash-video,.sidebar img.right{float:right;margin-left:1.5em}.basic-alignment.center,article img.center,article video.center,article .center.flash-video,.sidebar img.center{display:block;margin:0 auto 1.5em}.basic-alignment.left,article img.left,article video.left,article .left.flash-video,.sidebar img.left,.basic-alignment.right,article img.right,article video.right,article .right.flash-video,.sidebar img.right{margin-bottom:.8em}.toggle-sidebar,.no-sidebar .toggle-sidebar{display:none}@media only screen and (min-width: 750px){body.sidebar-footer aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}body.sidebar-footer aside.sidebar section.odd,body.sidebar-footer aside.sidebar section.even{float:left;width:48%}body.sidebar-footer aside.sidebar section.odd{margin-left:0}body.sidebar-footer aside.sidebar section.even{margin-left:4%}body.sidebar-footer aside.sidebar.thirds section{width:30%;margin-left:5%}body.sidebar-footer aside.sidebar.thirds section.first{margin-left:0;clear:both}}body.sidebar-footer #content{margin-right:0px}body.sidebar-footer .toggle-sidebar{display:none}@media only screen and (min-width: 550px){body>header{font-size:1em}}@media only screen and (min-width: 750px){aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}aside.sidebar section.odd,aside.sidebar section.even{float:left;width:48%}aside.sidebar section.odd{margin-left:0}aside.sidebar section.even{margin-left:4%}aside.sidebar.thirds section{width:30%;margin-left:5%}aside.sidebar.thirds section.first{margin-left:0;clear:both}}@media only screen and (min-width: 768px){body{-webkit-text-size-adjust:auto}body>header{font-size:1.2em}#main{padding:0;margin:0 auto}#content{overflow:visible;margin-right:240px;position:relative}.no-sidebar #content{margin-right:0;border-right:0}.collapse-sidebar #content{margin-right:20px}#content>div,#content>article{padding-top:17.5px;padding-bottom:17.5px;float:left}aside.sidebar{width:210px;padding:0 15px 15px;background:none;clear:none;float:left;margin:0 -100% 0 0}aside.sidebar section{width:auto;margin-left:0}aside.sidebar section.odd,aside.sidebar section.even{float:none;width:auto;margin-left:0}.collapse-sidebar aside.sidebar{float:none;width:auto;clear:left;margin:0;padding:0 35px 1px;background-color:#f7f7f7;border-top:1px solid #eaeaea}.collapse-sidebar aside.sidebar section.odd,.collapse-sidebar aside.sidebar section.even{float:left;width:48%}.collapse-sidebar aside.sidebar section.odd{margin-left:0}.collapse-sidebar aside.sidebar section.even{margin-left:4%}.collapse-sidebar aside.sidebar.thirds section{width:30%;margin-left:5%}.collapse-sidebar aside.sidebar.thirds section.first{margin-left:0;clear:both}}@media only screen and (min-width: 992px){body>header{font-size:1.3em}#content{margin-right:300px}#content>div,#content>article{padding-top:27.5px;padding-bottom:27.5px}aside.sidebar{width:260px;padding:1.2em 20px 20px}.collapse-sidebar aside.sidebar{padding-left:55px;padding-right:55px}}@media only screen and (min-width: 768px){ul,ol{margin-left:0}}body>header{background:#333}body>header h1{display:inline-block;margin:0}body>header h1 a,body>header h1 a:visited,body>header h1 a:hover{color:#f2f2f2;text-decoration:none}body>header h2{margin:0.2em 0 0;font-size:1em;color:#f2f2f2;font-weight:normal}body>nav{position:relative;background-color:#223442;background:url('/images/noise.png?1357266755'),-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #30495d), color-stop(50%, #223442), color-stop(100%, #0f171d));background:url('/images/noise.png?1357266755'),-webkit-linear-gradient(#30495d,#223442,#0f171d);background:url('/images/noise.png?1357266755'),-moz-linear-gradient(#30495d,#223442,#0f171d);background:url('/images/noise.png?1357266755'),-o-linear-gradient(#30495d,#223442,#0f171d);background:url('/images/noise.png?1357266755'),linear-gradient(#30495d,#223442,#0f171d);border-top:1px solid #3c5c74;border-bottom:1px solid #000;padding-top:.35em;padding-bottom:.35em}body>nav form{-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;margin:0;padding:0}body>nav form .search{padding:0.3em 0.5em 0;font-size:.85em;font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;line-height:1.1em;width:95%;-webkit-border-radius:0.5em;-moz-border-radius:0.5em;-ms-border-radius:0.5em;-o-border-radius:0.5em;border-radius:0.5em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-box-shadow:#253949 0 1px;-moz-box-shadow:#253949 0 1px;box-shadow:#253949 0 1px;background-color:#3c5c74;border:1px solid #111920;color:#888}body>nav form .search:focus{color:#444;border-color:#80b1df;-webkit-box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;-moz-box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;box-shadow:#80b1df 0 0 4px,#80b1df 0 0 3px inset;background-color:#fff;outline:none}body>nav fieldset[role=search]{float:right;width:48%}body>nav fieldset.mobile-nav{float:left;width:48%}body>nav fieldset.mobile-nav select{width:100%;font-size:.8em;border:1px solid #888}body>nav ul{display:none}@media only screen and (min-width: 550px){body>nav{font-size:.9em}body>nav ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;float:left;display:block;padding-top:.15em}body>nav ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;display:inline;float:left;padding-left:0;padding-right:0}body>nav ul li:first-child,body>nav ul li.first{padding-left:0}body>nav ul li:last-child{padding-right:0}body>nav ul li.last{padding-right:0}body>nav ul.subscription{margin-left:.8em;float:right}body>nav ul.subscription li:last-child a{padding-right:0}body>nav ul li{margin:0}body>nav a{color:#dce6ed;font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;text-shadow:#37546a 0 1px;float:left;text-decoration:none;font-size:1.1em;padding:0.1em 0;line-height:1.5em}body>nav a:visited{color:#dce6ed}body>nav a:hover{color:#88a8c2}body>nav li+li{border-left:1px solid #0f171d;margin-left:.8em}body>nav li+li a{padding-left:.8em;border-left:1px solid #2e475a}body>nav form{float:right;text-align:left;padding-left:.8em;width:175px}body>nav form .search{width:93%;font-size:.95em;line-height:1.2em}body>nav ul[data-subscription$=email]+form{width:97px}body>nav ul[data-subscription$=email]+form .search{width:91%}body>nav fieldset.mobile-nav{display:none}body>nav fieldset[role=search]{width:99%}}@media only screen and (min-width: 992px){body>nav form{width:215px}body>nav ul[data-subscription$=email]+form{width:147px}}.no-placeholder body>nav .search{background:#3c5c74 url('/images/search.png?1357266755') 0.3em 0.25em no-repeat;text-indent:1.3em}@media only screen and (min-width: 550px){.maskimage body>nav ul[data-subscription$=email]+form{width:123px}}@media only screen and (min-width: 992px){.maskimage body>nav ul[data-subscription$=email]+form{width:173px}}.maskimage ul.subscription{position:relative;top:.2em}.maskimage ul.subscription li,.maskimage ul.subscription a{border:0;padding:0}.maskimage a[rel=subscribe-rss]{position:relative;top:0px;text-indent:-999999em;background-color:#2e475a;border:0;padding:0}.maskimage a[rel=subscribe-rss],.maskimage a[rel=subscribe-rss]:after{-webkit-mask-image:url('/images/rss.png?1357266755');-moz-mask-image:url('/images/rss.png?1357266755');-ms-mask-image:url('/images/rss.png?1357266755');-o-mask-image:url('/images/rss.png?1357266755');mask-image:url('/images/rss.png?1357266755');-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;width:22px;height:22px}.maskimage a[rel=subscribe-rss]:after{content:"";position:absolute;top:-1px;left:0;background-color:#fff}.maskimage a[rel=subscribe-rss]:hover:after{background-color:#fff}.maskimage a[rel=subscribe-email]{position:relative;top:0px;text-indent:-999999em;background-color:#2e475a;border:0;padding:0}.maskimage a[rel=subscribe-email],.maskimage a[rel=subscribe-email]:after{-webkit-mask-image:url('/images/email.png?1357266755');-moz-mask-image:url('/images/email.png?1357266755');-ms-mask-image:url('/images/email.png?1357266755');-o-mask-image:url('/images/email.png?1357266755');mask-image:url('/images/email.png?1357266755');-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;width:28px;height:22px}.maskimage a[rel=subscribe-email]:after{content:"";position:absolute;top:-1px;left:0;background-color:#fff}.maskimage a[rel=subscribe-email]:hover:after{background-color:#fff}#content .blog-index{padding-top:0;padding-bottom:0}#content .blog-index article{padding-top:2em}article{padding-top:1em}article header{position:relative;padding-top:2em;padding-bottom:1em;margin-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}@media only screen and (min-width: 768px){article header{margin-bottom:1.5em;padding-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}}.blog-index article header{background:none;padding-bottom:0}article header p{font-size:.8em;margin:0;color:#aaa}article header p.meta{position:absolute;top:0}article header time{text-transform:uppercase}article .entry-title{margin:0}article .entry-title a{text-decoration:none}article .entry-title a:hover{text-decoration:underline}.blog-index article .entry-title{font-size:2.2em}.blog-index article .entry-title a{color:inherit}.blog-index article .entry-title a:hover{color:#0181eb}article a[rel=bookmark]{text-decoration:none}article h2{padding-top:0.8em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}article h2:first-child,article header+h2{background:none}.entry-content article h2:first-child,article header+h2{padding-top:0}article.linklog .entry-title{font-size:2.2em}article.linklog .entry-title a{text-decoration:underline}.blog-index article.linklog .entry-title{font-size:1.5em}article .linklog-marker{color:#aaa;font-size:.8em;line-height:1em;position:relative;top:-.15em}article>footer{padding-bottom:2.5em;margin-top:2em}.blog-index article>footer{margin-top:1em}article footer .meta{margin-bottom:.8em;font-size:.85em;clear:both;overflow:hidden}article footer p:last-child{margin-bottom:0}article footer .comments-link{font-size:.8em;color:inherit}article footer .comments-link:hover,article footer .comments-link:focus{color:#0181eb}article a[rel=full-article]{background:#ebebeb;display:inline-block;padding:0.4em 0.8em;margin-right:.5em;text-decoration:none;color:#5d5d5d;-webkit-transition:background-color 0.5s;-moz-transition:background-color 0.5s;-o-transition:background-color 0.5s;transition:background-color 0.5s}article a[rel=full-article]:hover{background:#0181eb;text-shadow:none;color:#f8f8f8}.blog-index article+article{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}article .feature{padding-top:.5em;margin-bottom:1em;padding-bottom:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x;font-size:2.0em;font-style:italic;line-height:1.3em}article img,article video,article .flash-video{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.5em solid}article video,article .flash-video{margin:0 auto 1.5em}article video{display:block;width:100%}article .flash-video>div{position:relative;display:block;padding-bottom:56.25%;padding-top:1px;height:0;overflow:hidden}article .flash-video>div iframe,article .flash-video>div object,article .flash-video>div embed{position:absolute;top:0;left:0;width:100%;height:100%}.separator,article footer .byline+time:before,article footer time+time:before,article footer .comments:before,article footer .byline ~ .categories:before{content:"\2022 ";padding:0 0.4em 0 0.2em;display:inline-block}#content div.pagination{text-align:center;font-size:.95em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x;padding-top:1.5em;padding-bottom:1.5em}#content div.pagination a{text-decoration:none;color:#aaa}#content div.pagination a.prev{position:absolute;left:0}#content div.pagination a.next{position:absolute;right:0}#content div.pagination a:hover{color:#0181eb}#content div.pagination a[href*=archive]:before,#content div.pagination a[href*=archive]:after{content:'\2014';padding:0 0.3em}.simple-social-button,.googleplus-share,.facebook-share,.twitter-share,.sidebar a.twitter-follow-button,.sidebar .github-follow{position:relative;overflow:hidden;font-family:"Lucida Grande",Helvetica,Arial,sans;display:inline-block;border:1px solid #ccc;padding:0.2em 0.5em;line-height:1.45em;font-size:11px;font-weight:bold;text-decoration:none;text-shadow:#fff 0 1px;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;background-color:#e5e5e5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(#ffffff,#dddddd);background-image:-moz-linear-gradient(#ffffff,#dddddd);background-image:-o-linear-gradient(#ffffff,#dddddd);background-image:linear-gradient(#ffffff,#dddddd)}.simple-social-button:hover,.googleplus-share:hover,.facebook-share:hover,.twitter-share:hover,.sidebar a.twitter-follow-button:hover,.sidebar .github-follow:hover{background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5f5f5), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(#f5f5f5,#cccccc);background-image:-moz-linear-gradient(#f5f5f5,#cccccc);background-image:-o-linear-gradient(#f5f5f5,#cccccc);background-image:linear-gradient(#f5f5f5,#cccccc);border-color:#b5b5b5;background-color:#ddd}.simple-social-button:before,.googleplus-share:before,.facebook-share:before,.twitter-share:before,.sidebar a.twitter-follow-button:before,.sidebar .github-follow:before{content:"";display:inline-block}p.meta+.sharing{padding-top:1em;padding-left:0;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') top left repeat-x}#fb-root{display:none}.googleplus-share{color:#db583b;padding-left:17px}.googleplus-share:visited,.googleplus-share:hover,.googleplus-share:visited:hover{color:#db583b}.googleplus-share:before{vertical-align:middle;position:absolute;left:3px}.googleplus-share:before{top:5px}.facebook-share{color:#4e5a9b;padding-left:18px}.facebook-share:visited,.facebook-share:hover,.facebook-share:visited:hover{color:#4e5a9b}.facebook-share:before{vertical-align:middle;position:absolute;left:3px}.facebook-share:before{top:3px}.twitter-share,.sidebar a.twitter-follow-button{color:#333;padding-left:20px}.twitter-share:visited,.twitter-share:hover,.twitter-share:visited:hover,.sidebar a.twitter-follow-button:visited,.sidebar a.twitter-follow-button:hover,.sidebar a.twitter-follow-button:visited:hover{color:#333}.twitter-share:before,.sidebar a.twitter-follow-button:before{vertical-align:middle;position:absolute;left:3px}.sidebar .github-follow{color:#333;padding-left:22px}.sidebar .github-follow:visited,.sidebar .github-follow:hover,.sidebar .github-follow:visited:hover{color:#333}.sidebar .github-follow:before{vertical-align:middle;position:absolute;left:3px}p code,li code{display:inline-block;white-space:no-wrap;background:#fff;font-size:.8em;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;padding:0 0.3em;margin:-1px 0}p pre code,li pre code{font-size:1em;background:none;border:none}pre{background:#fbfbfb url('/images/noise.png?1357266755') top left;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;color:#586e75;overflow:scroll;overflow-y:hidden;overflow-x:auto;border:1px solid #d8d8d8;margin-bottom:2.1em;padding:1em 0.8em;font-size:13px;line-height:1.45em}figure.code{-webkit-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-moz-box-shadow:rgba(0,0,0,0.06) 0 0 10px;box-shadow:rgba(0,0,0,0.06) 0 0 10px;background:none;padding:0;border:0;margin-bottom:1.5em}figure.code pre{-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:none;color:#586e75;border:none;padding:0;margin-bottom:0;overflow:visible;font-style:normal;font-weight:normal}figure.code figcaption{position:relative;text-align:center;font-size:13px;line-height:2em;font-weight:normal;margin-bottom:0;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;font-family:"Helvetica Neue",Arial,"Lucida Grande","Lucida Sans Unicode",Lucida,sans-serif;background-color:#aaaaaa;text-shadow:#fff 0 1px 0;color:#777;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(6%, #f0f0f0), color-stop(90%, #e5e5e5), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);background-image:-moz-linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);background-image:-o-linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);background-image:linear-gradient(#ffffff,#f0f0f0 6%,#e5e5e5 90%,#dddddd);border:1px solid #c5c5c5;border-top-color:#d5d5d5;border-bottom:0}figure.code figcaption a{position:absolute;right:.8em;text-decoration:none;color:inherit;z-index:1;padding-left:3em}figure.code figcaption a:hover{text-decoration:underline}figure.code .marked{position:relative;display:block}figure.code .marked:after{content:"";position:absolute;background:rgba(0,186,255,0.03);left:-.8em;top:0;bottom:0;right:-.8em;border:0px solid rgba(0,186,255,0.13);border-left-color:rgba(0,186,255,0.5)}figure.code .marked.start:after{border-top-width:1px}figure.code .marked.end:after{border-bottom-width:1px}figure.code .unnumbered .marked:after,figure.code .line-numbers .marked:after{border-left-width:2px}.highlight{border:1px solid #d8d8d8;background:#fbfbfb;overflow-y:hidden;overflow-x:auto}.highlight [data-line]:before{content:attr(data-line);font-size:0;line-height:0;color:transparent}.highlight td{line-height:1.45em;font-size:13px}.highlight td div{padding:.8em}.highlight .main{width:100%;background:#fbfbfb url('/images/noise.png?1357266755') top left}.highlight .line-numbers{text-align:right;background:#fefefe url('/images/noise.png?1357266755') top left;border-right:1px solid #e0e0e0;-webkit-box-shadow:#fff -1px 0 inset;-moz-box-shadow:#fff -1px 0 inset;box-shadow:#fff -1px 0 inset;text-shadow:#eaeaea 0 -1px}.highlight .line-numbers pre{color:#93a1a1}.highlight .c{color:#93a1a1;font-style:italic}.highlight .cm{color:#93a1a1;font-style:italic}.highlight .cp{color:#93a1a1;font-style:italic}.highlight .c1{color:#93a1a1;font-style:italic}.highlight .cs{color:#93a1a1;font-weight:bold;font-style:italic}.highlight .err{color:#dc322f;background:none}.highlight .k{color:#cb4b16}.highlight .o{color:#586e75;font-weight:bold}.highlight .p{color:#586e75}.highlight .ow{color:#2aa198;font-weight:bold}.highlight .gd{color:#586e75;background-color:#f3c8c8;display:inline-block}.highlight .gd .x{color:#586e75;background-color:#f0b4b3;display:inline-block}.highlight .ge{color:#586e75;font-style:italic}.highlight .gh{color:#93a1a1}.highlight .gi{color:#586e75;background-color:#e3e7c8;display:inline-block}.highlight .gi .x{color:#586e75;background-color:#cbd396;display:inline-block}.highlight .gs{color:#586e75;font-weight:bold}.highlight .gu{color:#6c71c4}.highlight .kc{color:#859900;font-weight:bold}.highlight .kd{color:#268bd2}.highlight .kp{color:#cb4b16;font-weight:bold}.highlight .kr{color:#d33682;font-weight:bold}.highlight .kt{color:#2aa198}.highlight .n{color:#268bd2}.highlight .na{color:#268bd2}.highlight .nb{color:#859900}.highlight .nc{color:#d33682}.highlight .no{color:#b58900}.highlight .nl{color:#859900}.highlight .ne{color:#268bd2;font-weight:bold}.highlight .nf{color:#268bd2;font-weight:bold}.highlight .nn{color:#b58900}.highlight .nt{color:#268bd2;font-weight:bold}.highlight .nx{color:#b58900 !important}.highlight .vg{color:#268bd2}.highlight .vi{color:#268bd2}.highlight .nv{color:#268bd2}.highlight .mf{color:#2aa198}.highlight .m{color:#2aa198}.highlight .mh{color:#2aa198}.highlight .mi{color:#2aa198}.highlight .s{color:#2aa198}.highlight .sd{color:#2aa198}.highlight .s2{color:#2aa198}.highlight .se{color:#dc322f}.highlight .si{color:#268bd2}.highlight .sr{color:#2aa198}.highlight .s1{color:#2aa198}.highlight div .gd,.highlight div .gd .x,.highlight div .gi,.highlight div .gi .x{display:inline-block;width:100%}pre::-webkit-scrollbar,.highlight::-webkit-scrollbar{height:.5em;background:rgba(0,0,0,0.15)}pre::-webkit-scrollbar-thumb:horizontal,.highlight::-webkit-scrollbar-thumb:horizontal{background:rgba(0,0,0,0.15);-webkit-border-radius:4px;border-radius:4px}#archive #content>div,#archive #content>div>article{padding-top:0}#blog-archives{color:#aaa}#blog-archives article{padding:1em 0 1em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}#blog-archives article:last-child{background:none}#blog-archives article footer{padding:0;margin:0;font-size:.85em;line-height:1em}#blog-archives h2{display:none}#blog-archives .entry-title{color:#111;margin-bottom:.3em;font-size:1.3em}#blog-archives .entry-title a{text-decoration:none;font-weight:normal;display:inline-block}#blog-archives .entry-title a:hover{text-decoration:underline}#blog-archives .entry-title a:hover{color:#0181eb}#blog-archives article[data-linklog] .entry-title{font-size:1em}#blog-archives article[data-linklog] .entry-title a{text-decoration:underline}#blog-archives a.category,#blog-archives time{color:#aaa}#blog-archives .entry-content{display:none}#blog-archives time{font-size:.9em;line-height:1.2em}#blog-archives time .month,#blog-archives time .day{display:inline-block}#blog-archives time .month{text-transform:uppercase}#blog-archives p{margin-bottom:1em}#blog-archives a:hover{color:#0181eb}@media only screen and (min-width: 550px){#blog-archives article{padding-left:4.5em;padding-bottom:.7em;margin-left:5em}#blog-archives h2{margin-bottom:.3em;font-weight:normal;display:inline-block;position:relative;top:-1px;float:left}#blog-archives h2:first-child{padding-top:.75em}#blog-archives time{position:absolute;text-align:right;left:0em;top:1.8em}#blog-archives .year{display:none}#blog-archives a.category{line-height:1.1em}}#content>.category article{margin-left:0;padding-left:6.8em}#content>.category .year{display:inline}.side-shadow-border,.sidebar section h1,.sidebar li{-webkit-box-shadow:#fff 0 1px;-moz-box-shadow:#fff 0 1px;box-shadow:#fff 0 1px}.sidebar{overflow:hidden;color:#3d3d3d;text-shadow:#fff 0 1px}.sidebar section{font-size:.8em;line-height:1.4em;margin-bottom:1.5em}.sidebar section h1{margin:1.5em 0 0;padding-bottom:.2em;border-bottom:1px solid #e0e0e0}.sidebar section h1+p{padding-top:.4em}.sidebar img{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 4px;box-shadow:rgba(0,0,0,0.15) 0 1px 4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:#fff 0.3em solid}.sidebar ul{margin-bottom:0.5em;margin-left:0}.sidebar li{list-style:none;padding:0.5em 0;margin:0;border-bottom:1px solid #e0e0e0}.sidebar li p:last-child{margin-bottom:0}.sidebar a{color:inherit;-webkit-transition:color 0.5s;-moz-transition:color 0.5s;-o-transition:color 0.5s;transition:color 0.5s}.sidebar:hover p a,.sidebar:hover li a{color:#1863a1}.sidebar:hover p a:hover,.sidebar:hover li a:hover{color:#0181eb}.aside-alt-link,#tweets a[href*='twitter.com/search'],#pinboard_linkroll .pin-tag{color:#707070}.aside-alt-link:hover,#tweets a[href*='twitter.com/search']:hover,#pinboard_linkroll .pin-tag:hover{color:#0181eb}@media only screen and (min-width: 768px){.toggle-sidebar{outline:none;position:absolute;right:-10px;top:0;bottom:0;display:inline-block;text-decoration:none;color:#cecece;width:9px;cursor:pointer}.toggle-sidebar:hover{background:#e9e9e9;background:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, rgba(224,224,224,0.5)), color-stop(100%, rgba(224,224,224,0)));background:-webkit-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:-moz-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:-o-linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0));background:linear-gradient(left, rgba(224,224,224,0.5),rgba(224,224,224,0))}.toggle-sidebar:after{position:absolute;right:-11px;top:0;width:20px;font-size:1.2em;line-height:1.1em;padding-bottom:.15em;-moz-border-radius-bottomright:0.3em;-webkit-border-bottom-right-radius:0.3em;border-bottom-right-radius:0.3em;text-align:center;background:#f8f8f8 url('/images/noise.png?1357266755') top left;border-bottom:1px solid #e0e0e0;border-right:1px solid #e0e0e0;content:"\00BB";text-indent:-1px}.collapse-sidebar .toggle-sidebar{text-indent:0px;right:-20px;width:19px}.collapse-sidebar .toggle-sidebar:hover{background:#e9e9e9}.collapse-sidebar .toggle-sidebar:after{border-left:1px solid #e0e0e0;text-shadow:#fff 0 1px;content:"\00AB";left:0px;right:0;text-align:center;text-indent:0;border:0;border-right-width:0;background:none}}#tweets .loading{color:#c4c4c4;text-shadow:#f8f8f8 0 1px;text-align:center;padding:0.5em 0}#tweets .loading:before{content:"";display:block;margin:0 auto}.transform #tweets .loading.error{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);-webkit-box-shadow:#fff 0 -1px;-moz-box-shadow:#fff 0 -1px;box-shadow:#fff 0 -1px;border-bottom:0;border-top:1px solid #e0e0e0}#tweets p{position:relative;padding-right:1em}#tweets a[href*=status]:first-child{color:#969696;float:right;padding:0 0 0.1em 1em;position:relative;right:-1.3em;text-shadow:#fff 0 1px;font-size:.7em;text-decoration:none}#tweets a[href*=status]:first-child span{font-size:1.5em}#tweets a[href*=status]:first-child:hover{color:#0181eb;text-decoration:none}#tweets a[href*='twitter.com/search']{text-decoration:none}#tweets a[href*='twitter.com/search']:hover{text-decoration:underline}.googleplus h1{-moz-box-shadow:none !important;-webkit-box-shadow:none !important;-o-box-shadow:none !important;box-shadow:none !important;border-bottom:0px none !important}.googleplus a{text-decoration:none;white-space:normal !important;line-height:32px}.googleplus a img{float:left;margin-right:0.5em;border:0 none}.googleplus-hidden{position:absolute;top:-1000em;left:-1000em}#pinboard_linkroll .pin-title,#pinboard_linkroll .pin-description{display:block;margin-bottom:.5em}#pinboard_linkroll .pin-tag{text-decoration:none}#pinboard_linkroll .pin-tag:hover{text-decoration:underline}#pinboard_linkroll .pin-tag:after{content:','}#pinboard_linkroll .pin-tag:last-child:after{content:''}.delicious-posts a.delicious-link{margin-bottom:.5em;display:block}.delicious-posts p{font-size:1em}body>footer{font-size:.8em;color:#888;text-shadow:#d9d9d9 0 1px;background-color:#ccc;background:url('/images/noise.png?1357266755'),-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0), color-stop(50%, #cccccc), color-stop(100%, #b0b0b0));background:url('/images/noise.png?1357266755'),-webkit-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1357266755'),-moz-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1357266755'),-o-linear-gradient(#e0e0e0,#cccccc,#b0b0b0);background:url('/images/noise.png?1357266755'),linear-gradient(#e0e0e0,#cccccc,#b0b0b0);border-top:1px solid #f2f2f2;position:relative;padding-top:1em;padding-bottom:1em;margin-bottom:3em;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;z-index:1}body>footer a{color:#6b6b6b}body>footer a:visited{color:#6b6b6b}body>footer a:hover{color:#484848}body>footer p:last-child{margin-bottom:0}#blog-archives{color:#aaa}#blog-archives article{padding:1em 0 1em;position:relative;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC') bottom left repeat-x}#blog-archives article:last-child{background:none}#blog-archives article footer{padding:0;margin:0;font-size:.85em;line-height:1em}#blog-archives h2{display:none}#blog-archives .entry-title{color:#111;margin-bottom:.3em;font-size:1.3em}#blog-archives .entry-title a{text-decoration:none;font-weight:bold;display:inline-block}#blog-archives .entry-title a:hover{text-decoration:underline}#blog-archives .entry-title a:hover{color:#0181eb}#blog-archives article[data-linklog] .entry-title{font-size:1em}#blog-archives article[data-linklog] .entry-title a{text-decoration:underline}#blog-archives a.category,#blog-archives time{color:#aaa}#blog-archives .entry-content{display:none}#blog-archives time{font-size:.9em;line-height:1.2em}#blog-archives time .month,#blog-archives time .day{display:inline-block}#blog-archives time .month{text-transform:uppercase}#blog-archives p{margin-bottom:1em}#blog-archives a:hover{color:#0181eb}@media only screen and (min-width: 550px){#blog-archives article{padding-left:4.5em;padding-bottom:.7em;margin-left:5em}#blog-archives h2{margin-bottom:.3em;font-weight:normal;display:inline-block;position:relative;top:-1px;float:left}#blog-archives h2:first-child{padding-top:.75em}#blog-archives time{position:absolute;text-align:right;left:0em;top:1.8em}#blog-archives .year{display:none}#blog-archives a.category{line-height:1.1em}}figure.code{overflow-x:auto}a[rel=bookmark]{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;text-decoration:none}@font-face{font-family:'MJX_Main';src:url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot");src:url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot?iefix") format("eot"),url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff") format("woff"),url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf") format("opentype"),url("http://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/svg/MathJax_Main-Regular.svg#MathJax_Main-Regular") format("svg")}header[role="banner"]{background-image:url(/images/Terrace2.jpg);background-repeat:no-repeat}#publications q:before{content:"\201C"}#publications q:after{content:"\201D"}#publications q{font-style:normal}#publications i{font-style:italic}#publications a:before{content:"("}#publications a:after{content:")"}#publications a{font-family:"Varela Round","Helvetica Neue",Arial,sans-serif;font-size:80%}.theorem{display:block;margin:12px 0;font-style:italic}.theorem:before{content:"Theorem.";font-weight:bold;font-style:normal}.lemma{display:block;margin:12px 0;font-style:italic}.lemma:before{content:"Lemma.";font-weight:bold;font-style:normal}.proof{display:block;margin:12px 0;font-style:normal}.proof:before{content:"Proof.";font-style:italic}.proof:after{content:"\25FC";float:right}.definition{display:block;margin:12px 0;font-style:normal}.definition:before{content:"Definition.";font-weight:bold;font-style:normal}*+table{border-style:solid;border-width:1px;border-color:#e7e3e7}*+table th,*+table td{border-style:dashed;border-width:1px;border-color:#e7e3e7;padding-left:3px;padding-right:3px}*+table th{border-style:solid;font-weight:bold;background:url("/images/noise.png?1330434582") repeat scroll left top #f7f3f7}*+table th[align="left"],*+table td[align="left"]{text-align:left}*+table th[align="right"],*+table td[align="right"]{text-align:right}*+table th[align="center"],*+table td[align="center"]{text-align:center}*+table img{max-width:none !important}