UNPKG

334 kBSource Map (JSON)View Raw
1{"version":3,"sources":["scrolliris-readability-reflector-canvas.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","_interopRequireDefault","obj","__esModule","default","shadeColor","color","percent","parseInt","slice","p","R","G","B","Math","round","toString","collectElements","article","selectors","q","forEach","d","key","querySelectorAll","fetchResultData","endpointURL","csrfToken","resolveCallback","rejectCallback","credentials","getJSON","url","emptyData","Promise","resolve","reject","xhr","XMLHttpRequest","open","setRequestHeader","responseType","onerror","status","onload","response","replace","JSON","parse","console","error","send","then","data","buildHTML","elements","styles","html","Array","from","map","outerHTML","join","colors0","colors","pIndex","document","importNode","nodeName","v","String","undefined","parseFloat","_e","style","background","backgroundColor","makeCanvas","width","height","container","getElementById","canvas","createElement","setAttribute","appendChild","drawCanvas","margin","_rasterizehtml2","drawHTML","zoom","dragging","lastY","marginTop","event","addEventListener","evt","cursor","clientY","preventDefault","window","delta","_typeof","Symbol","iterator","constructor","prototype","_rasterizehtml","doc","ctx","config","settings","options","hasOwnProperty","querySelector","elm","documentElement","docWidth","max","body","clientWidth","scrollWidth","docHeight","clientHeight","scrollHeight","draw","canvasHeight","headerHeight","footerHeiht","frameMargin","scale","parent","ScrollirisReadabilityReflector","Context","rasterizehtml","2","root","factory","define","amd","ayepromise","this","once","wasCalled","wrappedFunction","apply","arguments","getThenableIfExists","aThenHandler","onFulfilled","onRejected","defer","doHandlerCall","func","value","setTimeout","returnValue","promise","TypeError","callFulfilled","callRejected","handle","state","FULFILLED","PENDING","REJECTED","outcome","thenHandlers","doSettle","settledState","doFulfill","doReject","registerThenHandler","thenHandler","push","safelyResolveThenable","thenable","onceWrapper","transparentlyResolveThenablesAndSettle","fail","3","Url","protocol","slashes","auth","host","port","hostname","hash","search","query","pathname","path","href","urlParse","parseQueryString","slashesDenoteHost","util","isObject","urlFormat","isString","format","urlResolve","source","relative","urlResolveObject","resolveObject","punycode","protocolPattern","portPattern","simplePathPattern","delims","unwise","concat","autoEscape","nonHostChars","hostEndingChars","hostnameMaxLen","hostnamePartPattern","hostnamePartStart","unsafeProtocol","javascript","javascript:","hostlessProtocol","slashedProtocol","http","https","ftp","gopher","file","http:","https:","ftp:","gopher:","file:","querystring","queryIndex","indexOf","splitter","uSplit","split","slashRegex","rest","trim","simplePath","exec","substr","proto","lowerProto","toLowerCase","match","hostEnd","hec","atSign","lastIndexOf","decodeURIComponent","parseHost","ipv6Hostname","hostparts","part","newpart","j","k","charCodeAt","validParts","notHost","bit","unshift","toASCII","h","ae","esc","encodeURIComponent","escape","qm","Object","keys","stringify","charAt","rel","result","tkeys","tk","tkey","rkeys","rk","rkey","relPath","shift","isSourceAbs","isRelAbs","mustEndAbs","removeAllDots","srcPath","psychotic","pop","isNullOrUndefined","authInHost","isNull","last","hasTrailingSlash","up","splice","isAbsolute","./util","4","arg","5","peg$subclass","child","ctor","SyntaxError","message","expected","found","offset","line","column","name","input","peg$computePosDetails","pos","advance","details","startPos","endPos","ch","seenCR","peg$cachedPos","peg$cachedPosDetails","peg$fail","peg$currPos","peg$maxFailPos","peg$maxFailExpected","peg$buildException","cleanupExpected","sort","b","description","buildMessage","stringEscape","hex","toUpperCase","expectedDesc","foundDesc","expectedDescs","posDetails","peg$parsestart","s0","s1","peg$parsesourceEntries","peg$FAILED","peg$reportedPos","peg$c1","s2","s3","s4","s5","peg$parsesourceEntry","peg$parsewhitespace","peg$c3","peg$silentFails","peg$c4","peg$c5","peg$c2","peg$c6","peg$parseurlEntry","peg$parselocalEntry","peg$parseurl","peg$parseformat","peg$c7","peg$c8","peg$c9","peg$c10","peg$parsevalue","peg$c11","peg$c12","peg$c13","peg$c14","peg$c15","peg$c16","peg$c17","peg$c18","peg$c19","test","peg$c20","peg$c21","peg$c22","peg$c23","peg$result","peg$startRuleFunctions","start","peg$startRuleFunction","type","x","xs","entry","local","chars","extractValue","startRule","../util","6","grammar","fontFaceSourceValue","serialize","parsedFontFaceSources","sourceItem","itemValue","./grammar","7","trimCSSWhitespace","whitespaceRegex","unquoteString","quotedUrl","doubleQuoteRegex","singleQuoteRegex","8","matchQuery","mediaQuery","values","parseQuery","some","inverse","typeMatch","expressionsMatch","expressions","every","expression","feature","modifier","expValue","toPx","toDpi","toDecimal","captures","RE_MEDIA_QUERY","parsed","RE_MQ_EXPRESSION","RE_MQ_FEATURE","ratio","numbers","decimal","Number","resolution","units","RE_RESOLUTION_UNIT","RE_LENGTH_UNIT","9","CSSOM","CSSRule","MatcherList","CSSDocumentRule","matcher","cssRules","defineProperty","get","cssTexts","cssText","matcherText","./CSSRule","./MatcherList","10","CSSStyleDeclaration","CSSFontFaceRule","parentRule","./CSSStyleDeclaration","11","CSSHostRule","12","CSSStyleSheet","MediaList","CSSImportRule","media","styleSheet","mediaText","set","index","character","buffer","./CSSStyleSheet","./MediaList","13","CSSKeyframeRule","keyText","14","CSSKeyframesRule","_vendorPrefix","15","CSSMediaRule","16","parentStyleSheet","UNKNOWN_RULE","STYLE_RULE","CHARSET_RULE","IMPORT_RULE","MEDIA_RULE","FONT_FACE_RULE","PAGE_RULE","KEYFRAMES_RULE","KEYFRAME_RULE","MARGIN_RULE","NAMESPACE_RULE","COUNTER_STYLE_RULE","SUPPORTS_RULE","DOCUMENT_RULE","FONT_FEATURE_VALUES_RULE","VIEWPORT_RULE","REGION_STYLE_RULE","17","_importants","getPropertyValue","setProperty","priority","removeProperty","prevValue","getPropertyCSSValue","getPropertyPriority","getPropertyShorthand","isPropertyImplicit","properties","text","dummyRule","./parse","18","CSSStyleRule","selectorText","rule","ruleText","SIGNIFICANT_WHITESPACE","selector","styleRule","19","StyleSheet","insertRule","RangeError","cssRule","deleteRule","rules","./CSSStyleRule","./StyleSheet","20","CSSValue","_getConstructorName","c","21","CSSValueExpression","token","idx","_token","_idx","info","paren","_parseJSComment","_parseJSRexExp","_parseJSString","ret","nextChar","endIdx","commentEndChar","startIdx","substring","sep","_findMatchedIdx","before","legalRegx","isLegal","reg","NOT_FOUND","matched","nextNewLineIdx","./CSSValue","22","appendMatcher","deleteMatcher","23","appendMedium","medium","deleteMedium","24","25","clone","stylesheet","cloned","RULE_TYPES","rulesLength","ruleClone","styleClone","styleLength","./CSSKeyframeRule","./CSSKeyframesRule","./CSSMediaRule","26","./CSSImportRule","./clone","27","mediaRule","importRule","fontFaceRule","keyframesRule","documentRule","hostRule","valueParenthesisDepth","value-parenthesis","atRule","importRule-begin","atBlock","documentRule-begin","currentScope","atKeyframesRegExp","parseError","lines","lineCount","charCount","__starts","lastIndex","matchKeyframes","__ends","./CSSDocumentRule","./CSSFontFaceRule","./CSSHostRule","./CSSValueExpression","28","cssSupport","extractCssUrl","cssUrl","urlRegex","sliceBackgroundDeclaration","backgroundDeclarationText","outerRepeatedMatch","functionParamRegexS","valueRegexS","simpleSingularBackgroundRegexS","simpleBackgroundRegexS","simpleSingularBackgroundRegex","RegExp","backgroundLayers","getValues","singularBackgroundDeclaration","repeatedMatch","valueRegex","backgroundValues","findBackgroundImageUrlInValues","backgroundValue","backgroundLayerValues","urlMatch","preUrl","postUrl","parsedBackground","backgroundLayer","./cssSupport","29","cssom","rulesForCssTextFromBrowser","styleContent","implementation","createHTMLDocument","styleElement","textContent","sheet","browserHasBackgroundImageUrlIssue","browserHasFontFaceUrlIssue","browserHasBackgroundImageUrlSetIssue","rulesForCssText","cssRulesToText","reduce","exchangeRule","newRuleText","ruleIdx","changeFontFaceRuleSrc","newSrc","30","inlineImage","inlineScript","inlineCss","getUrlBasePath","joinUrl","parameterHashFunction","params","param","baseUrl","memoizeFunctionOnCaching","cache","cacheBucket","memoize","requestExternalsForStylesheet","alreadyLoadedCssUrls","loadCSSImportsForRules","cssImportResult","loadAndInlineCSSResourcesForRules","cssResourcesResult","errors","hasChanges","content","loadAndInlineCssForStyle","processExternals","childNodes","nodeValue","cloneArray","getCssStyleElements","getElementsByTagName","filter","attributes","loadAndInlineStyles","inlineOptions","allErrors","getDocumentBaseUrl","all","substituteLinkWithInlineStyle","oldLinkNode","styleNode","parentNode","ownerDocument","createTextNode","insertBefore","removeChild","requestStylesheetAndInlineResources","ajax","hasChangesFromPathAdjustment","adjustPathsOfCssResources","loadLinkedCSS","link","cssHref","documentBaseUrl","ajaxOptions","processStylesheet","getCssStylesheetLinks","links","loadAndInlineCssLinks","resourceType","msg","loadAndInlineImages","inline","loadAndInlineScript","inlineReferences","inlineFuncs","inlineScripts","./inlineCss","./inlineImage","./inlineScript","31","backgroundValueParser","fontFaceSrcValueParser","updateCssPropertyValue","property","findBackgroundImageRules","findBackgroundDeclarations","backgroundDeclarations","findFontFaceRules","findCSSImportRules","findExternalBackgroundUrls","matchIndices","isDataUri","findExternalFontFaceUrls","sourceIndices","backgroundRules","change","declaration","externalBackgroundIndices","backgroundLayerIndex","relativeUrl","externalFontFaceUrlIndices","fontFaceSrcDeclaration","fontFaceUrlIndex","substituteRule","newCssRules","position","newRule","fulfilledPromise","loadAndInlineCSSImport","cssHrefRelativeToDoc","externalCssRules","rulesToInline","moreErrors","loadAndInlineBackgroundImages","externalBackgroundLayerIndices","collectAndReportErrors","getDataURIForImageURL","dataURI","iterateOverRulesAndInlineBackgroundImages","cssHasChanges","loadAndInlineFontFace","srcDeclarationValue","urlIndex","fontSrc","binaryAjax","base64Content","btoa","iterateOverRulesAndInlineFontFace","./backgroundValueParser","css-font-face-src","32","encodeImageAsDataURI","image","hasAttribute","getAttribute","hasAttributeNS","getAttributeNS","documentBase","filterExternalImages","images","filterInputsForImageType","inputs","toArray","arrayLike","svgImages","imageInputs","externalImages","src","33","loadLinkedScript","script","escapeClosingTags","substituteExternalScriptWithInline","scriptNode","jsCode","removeNamedItem","getScripts","scripts","34","baseURI","object","theClone","nodeList","relUrl","promises","pendingPromiseCount","resolvedValues","lastCacheDate","getUncachableURL","Date","now","augmentedUrl","ajaxRequest","joinedUrl","overrideMimeType","mimeType","binaryContent","fromCharCode","detectMimeType","startsWith","string","uniqueIdList","constantUniqueIdFor","element","hasher","memo","retValue","args","argumentHash","funcHash","35","global","array","fn","mapDomain","parts","regexSeparators","labels","encoded","ucs2decode","extra","output","counter","ucs2encode","stringFromCharCode","basicToDigit","codePoint","base","digitToBasic","digit","flag","adapt","numPoints","firstTime","floor","damp","baseMinusTMin","tMax","skew","decode","out","basic","oldi","w","baseMinusT","inputLength","initialN","bias","initialBias","delimiter","maxInt","tMin","encode","handledCPCount","basicLength","m","currentValue","handledCPCountPlusOne","qMinusT","toUnicode","regexPunycode","regexNonASCII","freeExports","nodeType","freeModule","freeGlobal","self","overflow","not-basic","invalid-input","version","ucs2","36","prop","qs","eq","regexp","maxKeys","len","kstr","vstr","isArray","37","res","stringifyPrimitive","isFinite","objectKeys","ks","38","./decode","./encode","39","a0","b1","c2","d3","e4","f5","cssMediaQuery","xmlserializer","sanedomparsererror","inlineresources","getConstantUniqueIdFor","isCanvas","parseOptionalParameters","parameters","proxies","monkeyPatchInstanceMethod","methodName","proxyFunc","originalFunc","baseUrlRespectingXhr","XHRObject","xhrConstructor","originalOpen","method","finishNotifyingXhr","totalXhrCount","doneXhrCount","waitingForPendingToClose","checkAllRequestsFinished","pendingXhrCount","totalCount","_","originalSend","waitForRequestsToFinish","documentUtil","asArray","addClassName","className","addClassNameRecursively","changeCssRule","updateRuleSelector","updatedSelector","styleDefinitions","rewriteStyleContent","addSheetPropertyToSvgStyleElement","svgStyleElement","cssStyleElement","matchingSimpleSelectorsRegex","simpleSelectorList","replaceSimpleSelectorsBy","caseInsensitiveReplaceFunc","selectorRegex","matchingRules","newSelector","prefixMatch","selectorMatch","rewriteCssSelectorWith","oldSelector","lowercaseCssTypeSelectors","matchingTagNames","findHtmlOnlyNodeNames","currentTagName","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","htmlNodeNames","nonHtmlNodeNames","currentNode","tagName","namespaceURI","nextNode","documentHelper","cascadingAction","active","hover","focus","target","fakeUserAction","action","elem","pseudoClass","fakeActionClass","persistInputValues","textareas","isCheckable","checked","removeAttribute","textarea","rewriteTagNameSelectorsToLowerCase","mediaQueryHelper","hasEmIssue","svgImgBlueByEmMediaQuery","svg","img","firstPixelHasColor","g","context","getContext","drawImage","getImageData","hasEmMediaQueryIssue","needsEmWorkaround","mediaQueryRule","exchangeRuleWithNewContent","serializeExpression","exp","serializeQueryPart","segments","serializeQuery","queryParts","transformEmIntoPx","em","replaceEmValueWithPx","substituteEmWithPx","parsedQuery","rewrittenValue","replaceEmsWithPx","mediaQueryRules","anyRuleHasChanges","rewrittenMediaQuery","workAroundWebKitEmSizeIssue","browser","theWindow","createHiddenElement","visibility","top","left","executeJavascript","iframe","iframeErrorsMessages","timeout","executeJsTimeout","doResolve","contentDocument","waitForJavaScriptToRun","contentWindow","finishNotifyXhrProxy","baseUrlXhrProxy","write","close","createHiddenSandboxedIFrame","sandbox","scrolling","createIframeWithSizeAtZoomLevel1","scaledViewportWidth","scaledViewportHeight","calculateZoomedContentSizeAndRoundUp","actualViewport","requestedWidth","requestedHeight","selectElementOrDescendant","descendant","calculateContentSize","rootElement","originalWidth","originalHeight","rootFontSize","rect","contentSize","actualViewportWidth","actualViewportHeight","getBoundingClientRect","getComputedStyle","fontSize","viewportWidth","viewportHeight","findCorrelatingElement","documentClone","elementToFullHtmlDocument","calculateDocumentContentSize","size","clip","parseHtmlFragment","htmlFragment","innerHTML","firstChild","addHTMLTagAttributes","htmlTagSubstitute","elementSubstitute","attribute","attributeMatch","helperDoc","parseHTML","failOnInvalidSource","failOnParseError","originalError","validateXHTML","xhtml","DOMParser","parseFromString","doDocumentLoad","responseXML","statusText","loadDocument","svg2image","checkForBlobsResult","urlForSvg","useBlobs","URL","createObjectURL","Blob","cleanUpUrl","revokeObjectURL","simpleForeignObjectSvg","supportsReadingObjectFromCanvas","Image","toDataURL","readingBackFromCanvasBenefitsFromOldSchoolDataUris","blobUrl","supportsReadingFromBlobs","supportsBlobBuilding","err","checkBlobSupport","doesBenefit","checkForBlobs","buildImageUrl","renderSvg","resetEventHandlers","cleanUp","imageUrl","document2svg","svgAttributes","zoomFactor","font-size","foreignObjectAttributes","closestScaledWith","closestScaledHeight","offsetX","offsetY","y","workAroundCollapsingMarginsAcrossSVGElementInWebKitLike","workAroundSafariSometimesNotShowingExternalResources","externalResourcesRequired","workAroundChromeShowingScrollbarsUnderLinuxIfHtmlIsOverflowScroll","serializeAttributes","convertElementToSvg","serializeToString","foreignObjectAttrs","getSvgForDocument","needsWorkaround","drawDocumentAsSvg","rasterize","generalDrawError","drawSvgAsImg","drawImageOnCanvas","doDraw","operateJavaScriptOnDocument","executeJs","drawResult","rasterizeHTML","getViewportSize","defaultWidth","defaultHeight","fallbackWidth","fallbackHeight","constructOptions","viewport","drawDocument","optionalArguments","workAroundFirefoxNotLoadingStylesheetStyles","replaceChild","extendedOptions","drawURL","workaround","css-mediaquery","sane-domparser-error","40","innerXML","node","XMLSerializer","getParseError","errorMessagePatterns","extractParseError","errorNode","errorMessage","41","removeInvalidCharacters","serializeAttributeValue","serializeTextContent","serializeAttribute","attr","getTagName","serializeNamespace","isRootNode","nodeHasXmlnsAttr","attrs","serializeChildren","childNode","nodeTreeToXHTML","serializeTag","serializeText","serializeComment","serializeCDATA","rootNode"],"mappings":"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","file":"scrolliris-readability-reflector-canvas.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _rasterizehtml = require('rasterizehtml');\n\nvar _rasterizehtml2 = _interopRequireDefault(_rasterizehtml);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction shadeColor(color, percent) {\n var f = parseInt(color.slice(1), 16),\n t = percent < 0 ? 0 : 255,\n p = percent < 0 ? percent * -1 : percent;\n var R = f >> 16,\n G = f >> 8 & 0x00FF,\n B = f & 0x0000FF;\n return '#' + (0x1000000 + (Math.round((t - R) * p) + R) * 0x10000 + (Math.round((t - G) * p) + G) * 0x100 + (Math.round((t - B) * p) + B)).toString(16).slice(1);\n}\n\nfunction collectElements(article, selectors) {\n var q = '';\n [// default\n ['heading', 'h1,h2,h3,h4,h5,h6'], ['paragraph', 'p']\n //, ['sentence', ''] FIXME: sentence must be nested in p\n , ['material', 'ul,ol,pre,table,blockquote']].forEach(function (d) {\n var key = d[0];\n q += ',' + (selectors[key] || d[1]);\n });\n return article.querySelectorAll(q.slice(1));\n}\n\nfunction fetchResultData(endpointURL, csrfToken, resolveCallback, rejectCallback) {\n var credentials = { csrfToken: csrfToken };\n if (!credentials.csrfToken) {\n credentials.csrfToken = '';\n }\n var getJSON = function getJSON(url) {\n var emptyData = { 'p': [] };\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n if (credentials.csrfToken !== '') {\n xhr.setRequestHeader('X-CSRF-Token', credentials.csrfToken);\n }\n xhr.responseType = 'text';\n xhr.onerror = function () {\n var status = xhr.status;\n reject(emptyData);\n };\n xhr.onload = function () {\n var status = xhr.status,\n response = xhr.response;\n if (status === 200) {\n response = response.replace(/^\\]\\)\\}while\\(1\\);<\\/x>/, '');\n resolve(JSON.parse(response));\n } else {\n console.error('[ERROR] GET status: ', status);\n reject(emptyData);\n }\n };\n xhr.send();\n });\n };\n return getJSON(endpointURL).then(function (data) {\n return resolveCallback(data);\n }, function (data) {\n return rejectCallback(data);\n });\n}\n\nfunction buildHTML(data, elements, styles) {\n var html = '<html><head>';\n html += Array.from(styles).map(function (s) {\n // apply original style(s)\n return s.outerHTML;\n }).join('');\n html += '</head><body>';\n\n var colors0 = [// heatmap 11\n '#2d96db', '#4aa8a6', '#64b977', '#99c95d', '#c5d062', '#f6d866', '#fab252', '#fd8e3e', '#fe6f43', '#fd515b', '#fb1b2a'];\n\n var colors1 = [// pastel 12\n '#9e0142', '#d0384d', '#ee6445', '#fa9c58', '#fdcd7b', '#fef0a7', '#f3faad', '#d0ec9c', '#98d5a4', '#5cb7a9', '#3582ba', '#5e4fa2'];\n\n var colors = colors0 // heatmap (for now)\n ,\n pIndex = 0;\n html += Array.from(elements).map(function (e) {\n var n = document.importNode(e, true);\n if (n.nodeName !== 'IMG') {\n if (n.nodeName === 'P' && 'p' in data) {\n // BETA only paragraph support\n var v = data['p'][String(pIndex)];\n if (v !== undefined) {\n var color = '#ffffff';\n try {\n var i = Math.round(parseFloat(v) * 10);\n color = shadeColor(colors[i], 0.55);\n } catch (_e) {\n console.error(e);\n }\n n.style.background = color;\n n.style.backgroundColor = 'rgba(' + color + ', 0.9)';\n }\n pIndex += 1;\n }\n }\n return n.outerHTML;\n }).join('');\n html += '</body></html>';\n return html;\n}\n\nfunction makeCanvas(width, height) {\n var container = document.getElementById('scrolliris_canvas_container'),\n canvas = document.createElement('canvas');\n canvas.setAttribute('id', 'scrolliris_canvas');\n canvas.setAttribute('width', width * 0.5);\n canvas.setAttribute('height', height * 0.5);\n container.appendChild(canvas);\n return canvas;\n}\n\nfunction drawCanvas(canvas, html, width, height, margin) {\n _rasterizehtml2.default.drawHTML(html, canvas, {\n zoom: 0.5,\n width: width,\n height: height\n });\n\n var dragging = false,\n lastY = void 0,\n marginTop = 0,\n event = {};\n\n canvas.addEventListener('mousedown', function (e) {\n var evt = e || event;\n canvas.style.cursor = 'grabbing';\n dragging = true;\n lastY = evt.clientY;\n e.preventDefault();\n }, false);\n\n canvas.addEventListener('mouseup', function (e) {\n canvas.style.cursor = 'grab';\n dragging = false;\n }, false);\n\n window.addEventListener('mousemove', function (e) {\n var evt = e || event;\n if (dragging) {\n var delta = evt.clientY - lastY;\n lastY = evt.clientY;\n marginTop += delta;\n if (marginTop > 0) {\n marginTop = 0;\n } else if (marginTop < margin) {\n marginTop = margin;\n }\n canvas.style.marginTop = marginTop + 'px';\n }\n e.preventDefault();\n }, false);\n\n window.addEventListener('mouseout', function (e) {\n canvas.style.cursor = 'grab';\n dragging = false;\n }, false);\n}\n\n(function (doc, ctx) {\n var config = {},\n settings = {},\n options = {};\n\n if (ctx.hasOwnProperty('config') && _typeof(ctx.config) === 'object') {\n config = ctx['config'];\n // pass\n }\n if (ctx.hasOwnProperty('settings') && _typeof(ctx.options) === 'object') {\n settings = ctx['settings'];\n if (!settings.endpointURL) {\n console.error('endpointURL is required');\n return false;\n }\n }\n if (ctx.hasOwnProperty('options') && _typeof(ctx.options) === 'object') {\n options = ctx['options'];\n }\n\n var selectors = options.selectors || {};\n var article = doc.querySelector(selectors.article || 'body article');\n\n // collect elements and styles\n var elements = collectElements(article, selectors),\n styles = doc.querySelectorAll('style') || [];\n\n // NOTE:\n // Use <article>'s clientHeight?\n var elm = doc.documentElement;\n var docWidth = Math.max(doc.body.clientWidth, elm.clientWidth, elm.scrollWidth);\n var docHeight = Math.max(doc.body.clientHeight, elm.clientHeight, elm.scrollHeight);\n\n var draw = function draw(data) {\n var html = buildHTML(data, elements, styles),\n canvas = makeCanvas(docWidth, docHeight);\n // draw minimap\n var canvasHeight = 290 // container main area\n ,\n headerHeight = 22,\n footerHeiht = 22,\n frameMargin = 9 // {left|bottom} 9px\n ,\n scale = 0.5;\n var margin = -1 * (docHeight * scale / canvasHeight * 100) + (headerHeight + footerHeiht + frameMargin);\n drawCanvas(canvas, html, docWidth, docHeight, margin);\n };\n\n fetchResultData(settings.endpointURL, settings.csrfToken, function (data) {\n // resolve\n draw(data);\n }, function (data) {\n // reject\n // FIXME\n draw(data);\n });\n})(window.parent.document, (window.ScrollirisReadabilityReflector || {}).Context);\n\n},{\"rasterizehtml\":39}],2:[function(require,module,exports){\n// UMD header\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.ayepromise = factory();\n }\n}(this, function () {\n 'use strict';\n\n var ayepromise = {};\n\n /* Wrap an arbitrary number of functions and allow only one of them to be\n executed and only once */\n var once = function () {\n var wasCalled = false;\n\n return function wrapper(wrappedFunction) {\n return function () {\n if (wasCalled) {\n return;\n }\n wasCalled = true;\n wrappedFunction.apply(null, arguments);\n };\n };\n };\n\n var getThenableIfExists = function (obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n\n if (typeof obj === \"object\" && typeof then === \"function\") {\n // Bind function back to it's object (so fan's of 'this' don't get sad)\n return function() { return then.apply(obj, arguments); };\n }\n };\n\n var aThenHandler = function (onFulfilled, onRejected) {\n var defer = ayepromise.defer();\n\n var doHandlerCall = function (func, value) {\n setTimeout(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n defer.reject(e);\n return;\n }\n\n if (returnValue === defer.promise) {\n defer.reject(new TypeError('Cannot resolve promise with itself'));\n } else {\n defer.resolve(returnValue);\n }\n }, 1);\n };\n\n var callFulfilled = function (value) {\n if (onFulfilled && onFulfilled.call) {\n doHandlerCall(onFulfilled, value);\n } else {\n defer.resolve(value);\n }\n };\n\n var callRejected = function (value) {\n if (onRejected && onRejected.call) {\n doHandlerCall(onRejected, value);\n } else {\n defer.reject(value);\n }\n };\n\n return {\n promise: defer.promise,\n handle: function (state, value) {\n if (state === FULFILLED) {\n callFulfilled(value);\n } else {\n callRejected(value);\n }\n }\n };\n };\n\n // States\n var PENDING = 0,\n FULFILLED = 1,\n REJECTED = 2;\n\n ayepromise.defer = function () {\n var state = PENDING,\n outcome,\n thenHandlers = [];\n\n var doSettle = function (settledState, value) {\n state = settledState;\n // persist for handlers registered after settling\n outcome = value;\n\n thenHandlers.forEach(function (then) {\n then.handle(state, outcome);\n });\n\n // Discard all references to handlers to be garbage collected\n thenHandlers = null;\n };\n\n var doFulfill = function (value) {\n doSettle(FULFILLED, value);\n };\n\n var doReject = function (error) {\n doSettle(REJECTED, error);\n };\n\n var registerThenHandler = function (onFulfilled, onRejected) {\n var thenHandler = aThenHandler(onFulfilled, onRejected);\n\n if (state === PENDING) {\n thenHandlers.push(thenHandler);\n } else {\n thenHandler.handle(state, outcome);\n }\n\n return thenHandler.promise;\n };\n\n var safelyResolveThenable = function (thenable) {\n // Either fulfill, reject or reject with error\n var onceWrapper = once();\n try {\n thenable(\n onceWrapper(transparentlyResolveThenablesAndSettle),\n onceWrapper(doReject)\n );\n } catch (e) {\n onceWrapper(doReject)(e);\n }\n };\n\n var transparentlyResolveThenablesAndSettle = function (value) {\n var thenable;\n\n try {\n thenable = getThenableIfExists(value);\n } catch (e) {\n doReject(e);\n return;\n }\n\n if (thenable) {\n safelyResolveThenable(thenable);\n } else {\n doFulfill(value);\n }\n };\n\n var onceWrapper = once();\n return {\n resolve: onceWrapper(transparentlyResolveThenablesAndSettle),\n reject: onceWrapper(doReject),\n promise: {\n then: registerThenHandler,\n fail: function (onRejected) {\n return registerThenHandler(null, onRejected);\n }\n }\n };\n };\n\n return ayepromise;\n}));\n\n},{}],3:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n\n var u = new Url;\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter =\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1)\n hostEnd = rest.length;\n\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1)\n continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function() {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ?\n this.hostname :\n '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query &&\n util.isObject(this.query) &&\n Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || (query && ('?' + query)) || '';\n\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes ||\n (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n\n pathname = pathname.replace(/[?#]/g, function(match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol')\n result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] &&\n result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n isRelAbs = (\n relative.host ||\n relative.pathname && relative.pathname.charAt(0) === '/'\n ),\n mustEndAbs = (isRelAbs || isSourceAbs ||\n (result.host && relative.pathname)),\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;\n else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;\n else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = (relative.host || relative.host === '') ?\n relative.host : result.host;\n result.hostname = (relative.hostname || relative.hostname === '') ?\n relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (\n (result.host || relative.host || srcPath.length > 1) &&\n (last === '.' || last === '..') || last === '');\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' &&\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' ||\n (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' :\n srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function() {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\n\n},{\"./util\":4,\"punycode\":35,\"querystring\":38}],4:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n isString: function(arg) {\n return typeof(arg) === 'string';\n },\n isObject: function(arg) {\n return typeof(arg) === 'object' && arg !== null;\n },\n isNull: function(arg) {\n return arg === null;\n },\n isNullOrUndefined: function(arg) {\n return arg == null;\n }\n};\n\n},{}],5:[function(require,module,exports){\nmodule.exports = (function() {\n /*\n * Generated by PEG.js 0.8.0.\n *\n * http://pegjs.majda.cz/\n */\n\n function peg$subclass(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n }\n\n function SyntaxError(message, expected, found, offset, line, column) {\n this.message = message;\n this.expected = expected;\n this.found = found;\n this.offset = offset;\n this.line = line;\n this.column = column;\n\n this.name = \"SyntaxError\";\n }\n\n peg$subclass(SyntaxError, Error);\n\n function parse(input) {\n var options = arguments.length > 1 ? arguments[1] : {},\n\n peg$FAILED = {},\n\n peg$startRuleFunctions = { start: peg$parsestart },\n peg$startRuleFunction = peg$parsestart,\n\n peg$c0 = [],\n peg$c1 = function() { return []},\n peg$c2 = peg$FAILED,\n peg$c3 = \",\",\n peg$c4 = { type: \"literal\", value: \",\", description: \"\\\",\\\"\" },\n peg$c5 = function(x, xs) { return [x].concat(xs); },\n peg$c6 = function(entry) { return [entry]; },\n peg$c7 = function(url, format) { return {url: url, format: format}; },\n peg$c8 = function(url) { return {url: url}; },\n peg$c9 = \"url(\",\n peg$c10 = { type: \"literal\", value: \"url(\", description: \"\\\"url(\\\"\" },\n peg$c11 = \")\",\n peg$c12 = { type: \"literal\", value: \")\", description: \"\\\")\\\"\" },\n peg$c13 = function(value) { return value; },\n peg$c14 = \"format(\",\n peg$c15 = { type: \"literal\", value: \"format(\", description: \"\\\"format(\\\"\" },\n peg$c16 = \"local(\",\n peg$c17 = { type: \"literal\", value: \"local(\", description: \"\\\"local(\\\"\" },\n peg$c18 = function(value) { return {local: value}; },\n peg$c19 = /^[^)]/,\n peg$c20 = { type: \"class\", value: \"[^)]\", description: \"[^)]\" },\n peg$c21 = function(chars) { return util.extractValue(chars.join(\"\")); },\n peg$c22 = /^[ \\t\\r\\n\\f]/,\n peg$c23 = { type: \"class\", value: \"[ \\\\t\\\\r\\\\n\\\\f]\", description: \"[ \\\\t\\\\r\\\\n\\\\f]\" },\n\n peg$currPos = 0,\n peg$reportedPos = 0,\n peg$cachedPos = 0,\n peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },\n peg$maxFailPos = 0,\n peg$maxFailExpected = [],\n peg$silentFails = 0,\n\n peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$reportedPos, peg$currPos);\n }\n\n function offset() {\n return peg$reportedPos;\n }\n\n function line() {\n return peg$computePosDetails(peg$reportedPos).line;\n }\n\n function column() {\n return peg$computePosDetails(peg$reportedPos).column;\n }\n\n function expected(description) {\n throw peg$buildException(\n null,\n [{ type: \"other\", description: description }],\n peg$reportedPos\n );\n }\n\n function error(message) {\n throw peg$buildException(message, null, peg$reportedPos);\n }\n\n function peg$computePosDetails(pos) {\n function advance(details, startPos, endPos) {\n var p, ch;\n\n for (p = startPos; p < endPos; p++) {\n ch = input.charAt(p);\n if (ch === \"\\n\") {\n if (!details.seenCR) { details.line++; }\n details.column = 1;\n details.seenCR = false;\n } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n details.line++;\n details.column = 1;\n details.seenCR = true;\n } else {\n details.column++;\n details.seenCR = false;\n }\n }\n }\n\n if (peg$cachedPos !== pos) {\n if (peg$cachedPos > pos) {\n peg$cachedPos = 0;\n peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };\n }\n advance(peg$cachedPosDetails, peg$cachedPos, pos);\n peg$cachedPos = pos;\n }\n\n return peg$cachedPosDetails;\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildException(message, expected, pos) {\n function cleanupExpected(expected) {\n var i = 1;\n\n expected.sort(function(a, b) {\n if (a.description < b.description) {\n return -1;\n } else if (a.description > b.description) {\n return 1;\n } else {\n return 0;\n }\n });\n\n while (i < expected.length) {\n if (expected[i - 1] === expected[i]) {\n expected.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n\n function buildMessage(expected, found) {\n function stringEscape(s) {\n function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }\n\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\x08/g, '\\\\b')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\f/g, '\\\\f')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x80-\\xFF]/g, function(ch) { return '\\\\x' + hex(ch); })\n .replace(/[\\u0180-\\u0FFF]/g, function(ch) { return '\\\\u0' + hex(ch); })\n .replace(/[\\u1080-\\uFFFF]/g, function(ch) { return '\\\\u' + hex(ch); });\n }\n\n var expectedDescs = new Array(expected.length),\n expectedDesc, foundDesc, i;\n\n for (i = 0; i < expected.length; i++) {\n expectedDescs[i] = expected[i].description;\n }\n\n expectedDesc = expected.length > 1\n ? expectedDescs.slice(0, -1).join(\", \")\n + \" or \"\n + expectedDescs[expected.length - 1]\n : expectedDescs[0];\n\n foundDesc = found ? \"\\\"\" + stringEscape(found) + \"\\\"\" : \"end of input\";\n\n return \"Expected \" + expectedDesc + \" but \" + foundDesc + \" found.\";\n }\n\n var posDetails = peg$computePosDetails(pos),\n found = pos < input.length ? input.charAt(pos) : null;\n\n if (expected !== null) {\n cleanupExpected(expected);\n }\n\n return new SyntaxError(\n message !== null ? message : buildMessage(expected, found),\n expected,\n found,\n pos,\n posDetails.line,\n posDetails.column\n );\n }\n\n function peg$parsestart() {\n var s0, s1;\n\n s0 = peg$parsesourceEntries();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = [];\n if (s1 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c1();\n }\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parsesourceEntries() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n s1 = peg$parsesourceEntry();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parsewhitespace();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsewhitespace();\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s3 = peg$c3;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c4); }\n }\n if (s3 !== peg$FAILED) {\n s4 = [];\n s5 = peg$parsewhitespace();\n while (s5 !== peg$FAILED) {\n s4.push(s5);\n s5 = peg$parsewhitespace();\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parsesourceEntries();\n if (s5 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c5(s1, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parsesourceEntry();\n if (s1 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c6(s1);\n }\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parsesourceEntry() {\n var s0;\n\n s0 = peg$parseurlEntry();\n if (s0 === peg$FAILED) {\n s0 = peg$parselocalEntry();\n }\n\n return s0;\n }\n\n function peg$parseurlEntry() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$parseurl();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parsewhitespace();\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsewhitespace();\n }\n } else {\n s2 = peg$c2;\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseformat();\n if (s3 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c7(s1, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseurl();\n if (s1 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c8(s1);\n }\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseurl() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 4) === peg$c9) {\n s1 = peg$c9;\n peg$currPos += 4;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsevalue();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s3 = peg$c11;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s3 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c13(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n\n return s0;\n }\n\n function peg$parseformat() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 7) === peg$c14) {\n s1 = peg$c14;\n peg$currPos += 7;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c15); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsevalue();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s3 = peg$c11;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s3 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c13(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n\n return s0;\n }\n\n function peg$parselocalEntry() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 6) === peg$c16) {\n s1 = peg$c16;\n peg$currPos += 6;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c17); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsevalue();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s3 = peg$c11;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s3 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c18(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$c2;\n }\n\n return s0;\n }\n\n function peg$parsevalue() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n if (peg$c19.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c20); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c19.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c20); }\n }\n }\n } else {\n s1 = peg$c2;\n }\n if (s1 !== peg$FAILED) {\n peg$reportedPos = s0;\n s1 = peg$c21(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsewhitespace() {\n var s0;\n\n if (peg$c22.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c23); }\n }\n\n return s0;\n }\n\n\n var util = require('../util');\n\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail({ type: \"end\", description: \"end of input\" });\n }\n\n throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos);\n }\n }\n\n return {\n SyntaxError: SyntaxError,\n parse: parse\n };\n})();\n\n},{\"../util\":7}],6:[function(require,module,exports){\nvar grammar = require('./grammar');\n\n\nexports.SyntaxError = function (message, offset) {\n this.message = message;\n this.offset = offset;\n};\n\nexports.parse = function (fontFaceSourceValue) {\n try {\n return grammar.parse(fontFaceSourceValue);\n } catch (e) {\n throw new exports.SyntaxError(e.message, e.offset);\n }\n};\n\nexports.serialize = function (parsedFontFaceSources) {\n return parsedFontFaceSources.map(function (sourceItem) {\n var itemValue;\n\n if (sourceItem.url) {\n itemValue = 'url(\"' + sourceItem.url + '\")';\n if (sourceItem.format) {\n itemValue += ' format(\"' + sourceItem.format + '\")';\n }\n } else {\n itemValue = 'local(\"' + sourceItem.local + '\")';\n }\n return itemValue;\n }).join(', ');\n};\n\n},{\"./grammar\":5}],7:[function(require,module,exports){\nvar trimCSSWhitespace = function (value) {\n var whitespaceRegex = /^[\\t\\r\\f\\n ]*(.+?)[\\t\\r\\f\\n ]*$/;\n\n return value.replace(whitespaceRegex, \"$1\");\n};\n\nvar unquoteString = function (quotedUrl) {\n var doubleQuoteRegex = /^\"(.*)\"$/,\n singleQuoteRegex = /^'(.*)'$/;\n\n if (doubleQuoteRegex.test(quotedUrl)) {\n return quotedUrl.replace(doubleQuoteRegex, \"$1\");\n } else {\n if (singleQuoteRegex.test(quotedUrl)) {\n return quotedUrl.replace(singleQuoteRegex, \"$1\");\n } else {\n return quotedUrl;\n }\n }\n};\n\nexports.extractValue = function (value) {\n return unquoteString(trimCSSWhitespace(value));\n};\n\n},{}],8:[function(require,module,exports){\n/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\n\n'use strict';\n\nexports.match = matchQuery;\nexports.parse = parseQuery;\n\n// -----------------------------------------------------------------------------\n\nvar RE_MEDIA_QUERY = /(?:(only|not)?\\s*([^\\s\\(\\)]+)(?:\\s*and)?\\s*)?(.+)?/i,\n RE_MQ_EXPRESSION = /\\(\\s*([^\\s\\:\\)]+)\\s*(?:\\:\\s*([^\\s\\)]+))?\\s*\\)/,\n RE_MQ_FEATURE = /^(?:(min|max)-)?(.+)/,\n RE_LENGTH_UNIT = /(em|rem|px|cm|mm|in|pt|pc)?$/,\n RE_RESOLUTION_UNIT = /(dpi|dpcm|dppx)?$/;\n\nfunction matchQuery(mediaQuery, values) {\n return parseQuery(mediaQuery).some(function (query) {\n var inverse = query.inverse;\n\n // Either the parsed or specified `type` is \"all\", or the types must be\n // equal for a match.\n var typeMatch = query.type === 'all' || values.type === query.type;\n\n // Quit early when `type` doesn't match, but take \"not\" into account.\n if ((typeMatch && inverse) || !(typeMatch || inverse)) {\n return false;\n }\n\n var expressionsMatch = query.expressions.every(function (expression) {\n var feature = expression.feature,\n modifier = expression.modifier,\n expValue = expression.value,\n value = values[feature];\n\n // Missing or falsy values don't match.\n if (!value) { return false; }\n\n switch (feature) {\n case 'orientation':\n case 'scan':\n return value.toLowerCase() === expValue.toLowerCase();\n\n case 'width':\n case 'height':\n case 'device-width':\n case 'device-height':\n expValue = toPx(expValue);\n value = toPx(value);\n break;\n\n case 'resolution':\n expValue = toDpi(expValue);\n value = toDpi(value);\n break;\n\n case 'aspect-ratio':\n case 'device-aspect-ratio':\n case /* Deprecated */ 'device-pixel-ratio':\n expValue = toDecimal(expValue);\n value = toDecimal(value);\n break;\n\n case 'grid':\n case 'color':\n case 'color-index':\n case 'monochrome':\n expValue = parseInt(expValue, 10) || 1;\n value = parseInt(value, 10) || 0;\n break;\n }\n\n switch (modifier) {\n case 'min': return value >= expValue;\n case 'max': return value <= expValue;\n default : return value === expValue;\n }\n });\n\n return (expressionsMatch && !inverse) || (!expressionsMatch && inverse);\n });\n}\n\nfunction parseQuery(mediaQuery) {\n return mediaQuery.split(',').map(function (query) {\n query = query.trim();\n\n var captures = query.match(RE_MEDIA_QUERY),\n modifier = captures[1],\n type = captures[2],\n expressions = captures[3] || '',\n parsed = {};\n\n parsed.inverse = !!modifier && modifier.toLowerCase() === 'not';\n parsed.type = type ? type.toLowerCase() : 'all';\n\n // Split expressions into a list.\n expressions = expressions.match(/\\([^\\)]+\\)/g) || [];\n\n parsed.expressions = expressions.map(function (expression) {\n var captures = expression.match(RE_MQ_EXPRESSION),\n feature = captures[1].toLowerCase().match(RE_MQ_FEATURE);\n\n return {\n modifier: feature[1],\n feature : feature[2],\n value : captures[2]\n };\n });\n\n return parsed;\n });\n}\n\n// -- Utilities ----------------------------------------------------------------\n\nfunction toDecimal(ratio) {\n var decimal = Number(ratio),\n numbers;\n\n if (!decimal) {\n numbers = ratio.match(/^(\\d+)\\s*\\/\\s*(\\d+)$/);\n decimal = numbers[1] / numbers[2];\n }\n\n return decimal;\n}\n\nfunction toDpi(resolution) {\n var value = parseFloat(resolution),\n units = String(resolution).match(RE_RESOLUTION_UNIT)[1];\n\n switch (units) {\n case 'dpcm': return value / 2.54;\n case 'dppx': return value * 96;\n default : return value;\n }\n}\n\nfunction toPx(length) {\n var value = parseFloat(length),\n units = String(length).match(RE_LENGTH_UNIT)[1];\n\n switch (units) {\n case 'em' : return value * 16;\n case 'rem': return value * 16;\n case 'cm' : return value * 96 / 2.54;\n case 'mm' : return value * 96 / 2.54 / 10;\n case 'in' : return value * 96;\n case 'pt' : return value * 72;\n case 'pc' : return value * 72 / 12;\n default : return value;\n }\n}\n\n},{}],9:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n CSSRule: require(\"./CSSRule\").CSSRule,\n MatcherList: require(\"./MatcherList\").MatcherList\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see https://developer.mozilla.org/en/CSS/@-moz-document\n */\nCSSOM.CSSDocumentRule = function CSSDocumentRule() {\n CSSOM.CSSRule.call(this);\n this.matcher = new CSSOM.MatcherList();\n this.cssRules = [];\n};\n\nCSSOM.CSSDocumentRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSDocumentRule.prototype.constructor = CSSOM.CSSDocumentRule;\nCSSOM.CSSDocumentRule.prototype.type = 10;\n//FIXME\n//CSSOM.CSSDocumentRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;\n//CSSOM.CSSDocumentRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;\n\nObject.defineProperty(CSSOM.CSSDocumentRule.prototype, \"cssText\", {\n get: function() {\n var cssTexts = [];\n for (var i=0, length=this.cssRules.length; i < length; i++) {\n cssTexts.push(this.cssRules[i].cssText);\n }\n return \"@-moz-document \" + this.matcher.matcherText + \" {\" + cssTexts.join(\"\") + \"}\";\n }\n});\n\n\n//.CommonJS\nexports.CSSDocumentRule = CSSOM.CSSDocumentRule;\n///CommonJS\n\n},{\"./CSSRule\":16,\"./MatcherList\":22}],10:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSStyleDeclaration: require(\"./CSSStyleDeclaration\").CSSStyleDeclaration,\n\tCSSRule: require(\"./CSSRule\").CSSRule\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#css-font-face-rule\n */\nCSSOM.CSSFontFaceRule = function CSSFontFaceRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.style = new CSSOM.CSSStyleDeclaration();\n\tthis.style.parentRule = this;\n};\n\nCSSOM.CSSFontFaceRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSFontFaceRule.prototype.constructor = CSSOM.CSSFontFaceRule;\nCSSOM.CSSFontFaceRule.prototype.type = 5;\n//FIXME\n//CSSOM.CSSFontFaceRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;\n//CSSOM.CSSFontFaceRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;\n\n// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSFontFaceRule.cpp\nObject.defineProperty(CSSOM.CSSFontFaceRule.prototype, \"cssText\", {\n get: function() {\n return \"@font-face {\" + this.style.cssText + \"}\";\n }\n});\n\n\n//.CommonJS\nexports.CSSFontFaceRule = CSSOM.CSSFontFaceRule;\n///CommonJS\n\n},{\"./CSSRule\":16,\"./CSSStyleDeclaration\":17}],11:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSRule: require(\"./CSSRule\").CSSRule\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/shadow-dom/#host-at-rule\n */\nCSSOM.CSSHostRule = function CSSHostRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.cssRules = [];\n};\n\nCSSOM.CSSHostRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSHostRule.prototype.constructor = CSSOM.CSSHostRule;\nCSSOM.CSSHostRule.prototype.type = 1001;\n//FIXME\n//CSSOM.CSSHostRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;\n//CSSOM.CSSHostRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;\n\nObject.defineProperty(CSSOM.CSSHostRule.prototype, \"cssText\", {\n\tget: function() {\n\t\tvar cssTexts = [];\n\t\tfor (var i=0, length=this.cssRules.length; i < length; i++) {\n\t\t\tcssTexts.push(this.cssRules[i].cssText);\n\t\t}\n\t\treturn \"@host {\" + cssTexts.join(\"\") + \"}\";\n\t}\n});\n\n\n//.CommonJS\nexports.CSSHostRule = CSSOM.CSSHostRule;\n///CommonJS\n\n},{\"./CSSRule\":16}],12:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSRule: require(\"./CSSRule\").CSSRule,\n\tCSSStyleSheet: require(\"./CSSStyleSheet\").CSSStyleSheet,\n\tMediaList: require(\"./MediaList\").MediaList\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#cssimportrule\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule\n */\nCSSOM.CSSImportRule = function CSSImportRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.href = \"\";\n\tthis.media = new CSSOM.MediaList();\n\tthis.styleSheet = new CSSOM.CSSStyleSheet();\n};\n\nCSSOM.CSSImportRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSImportRule.prototype.constructor = CSSOM.CSSImportRule;\nCSSOM.CSSImportRule.prototype.type = 3;\n\nObject.defineProperty(CSSOM.CSSImportRule.prototype, \"cssText\", {\n get: function() {\n var mediaText = this.media.mediaText;\n return \"@import url(\" + this.href + \")\" + (mediaText ? \" \" + mediaText : \"\") + \";\";\n },\n set: function(cssText) {\n var i = 0;\n\n /**\n * @import url(partial.css) screen, handheld;\n * || |\n * after-import media\n * |\n * url\n */\n var state = '';\n\n var buffer = '';\n var index;\n for (var character; (character = cssText.charAt(i)); i++) {\n\n switch (character) {\n case ' ':\n case '\\t':\n case '\\r':\n case '\\n':\n case '\\f':\n if (state === 'after-import') {\n state = 'url';\n } else {\n buffer += character;\n }\n break;\n\n case '@':\n if (!state && cssText.indexOf('@import', i) === i) {\n state = 'after-import';\n i += 'import'.length;\n buffer = '';\n }\n break;\n\n case 'u':\n if (state === 'url' && cssText.indexOf('url(', i) === i) {\n index = cssText.indexOf(')', i + 1);\n if (index === -1) {\n throw i + ': \")\" not found';\n }\n i += 'url('.length;\n var url = cssText.slice(i, index);\n if (url[0] === url[url.length - 1]) {\n if (url[0] === '\"' || url[0] === \"'\") {\n url = url.slice(1, -1);\n }\n }\n this.href = url;\n i = index;\n state = 'media';\n }\n break;\n\n case '\"':\n if (state === 'url') {\n index = cssText.indexOf('\"', i + 1);\n if (!index) {\n throw i + \": '\\\"' not found\";\n }\n this.href = cssText.slice(i + 1, index);\n i = index;\n state = 'media';\n }\n break;\n\n case \"'\":\n if (state === 'url') {\n index = cssText.indexOf(\"'\", i + 1);\n if (!index) {\n throw i + ': \"\\'\" not found';\n }\n this.href = cssText.slice(i + 1, index);\n i = index;\n state = 'media';\n }\n break;\n\n case ';':\n if (state === 'media') {\n if (buffer) {\n this.media.mediaText = buffer.trim();\n }\n }\n break;\n\n default:\n if (state === 'media') {\n buffer += character;\n }\n break;\n }\n }\n }\n});\n\n\n//.CommonJS\nexports.CSSImportRule = CSSOM.CSSImportRule;\n///CommonJS\n\n},{\"./CSSRule\":16,\"./CSSStyleSheet\":19,\"./MediaList\":23}],13:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSRule: require(\"./CSSRule\").CSSRule,\n\tCSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframeRule\n */\nCSSOM.CSSKeyframeRule = function CSSKeyframeRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.keyText = '';\n\tthis.style = new CSSOM.CSSStyleDeclaration();\n\tthis.style.parentRule = this;\n};\n\nCSSOM.CSSKeyframeRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSKeyframeRule.prototype.constructor = CSSOM.CSSKeyframeRule;\nCSSOM.CSSKeyframeRule.prototype.type = 9;\n//FIXME\n//CSSOM.CSSKeyframeRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;\n//CSSOM.CSSKeyframeRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;\n\n// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframeRule.cpp\nObject.defineProperty(CSSOM.CSSKeyframeRule.prototype, \"cssText\", {\n get: function() {\n return this.keyText + \" {\" + this.style.cssText + \"} \";\n }\n});\n\n\n//.CommonJS\nexports.CSSKeyframeRule = CSSOM.CSSKeyframeRule;\n///CommonJS\n\n},{\"./CSSRule\":16,\"./CSSStyleDeclaration\":17}],14:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSRule: require(\"./CSSRule\").CSSRule\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframesRule\n */\nCSSOM.CSSKeyframesRule = function CSSKeyframesRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.name = '';\n\tthis.cssRules = [];\n};\n\nCSSOM.CSSKeyframesRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSKeyframesRule.prototype.constructor = CSSOM.CSSKeyframesRule;\nCSSOM.CSSKeyframesRule.prototype.type = 8;\n//FIXME\n//CSSOM.CSSKeyframesRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;\n//CSSOM.CSSKeyframesRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;\n\n// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframesRule.cpp\nObject.defineProperty(CSSOM.CSSKeyframesRule.prototype, \"cssText\", {\n get: function() {\n var cssTexts = [];\n for (var i=0, length=this.cssRules.length; i < length; i++) {\n cssTexts.push(\" \" + this.cssRules[i].cssText);\n }\n return \"@\" + (this._vendorPrefix || '') + \"keyframes \" + this.name + \" { \\n\" + cssTexts.join(\"\\n\") + \"\\n}\";\n }\n});\n\n\n//.CommonJS\nexports.CSSKeyframesRule = CSSOM.CSSKeyframesRule;\n///CommonJS\n\n},{\"./CSSRule\":16}],15:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSRule: require(\"./CSSRule\").CSSRule,\n\tMediaList: require(\"./MediaList\").MediaList\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#cssmediarule\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule\n */\nCSSOM.CSSMediaRule = function CSSMediaRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.media = new CSSOM.MediaList();\n\tthis.cssRules = [];\n};\n\nCSSOM.CSSMediaRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSMediaRule.prototype.constructor = CSSOM.CSSMediaRule;\nCSSOM.CSSMediaRule.prototype.type = 4;\n//FIXME\n//CSSOM.CSSMediaRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;\n//CSSOM.CSSMediaRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;\n\n// http://opensource.apple.com/source/WebCore/WebCore-658.28/css/CSSMediaRule.cpp\nObject.defineProperty(CSSOM.CSSMediaRule.prototype, \"cssText\", {\n get: function() {\n var cssTexts = [];\n for (var i=0, length=this.cssRules.length; i < length; i++) {\n cssTexts.push(this.cssRules[i].cssText);\n }\n return \"@media \" + this.media.mediaText + \" {\" + cssTexts.join(\"\") + \"}\";\n }\n});\n\n\n//.CommonJS\nexports.CSSMediaRule = CSSOM.CSSMediaRule;\n///CommonJS\n\n},{\"./CSSRule\":16,\"./MediaList\":23}],16:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#the-cssrule-interface\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule\n */\nCSSOM.CSSRule = function CSSRule() {\n\tthis.parentRule = null;\n\tthis.parentStyleSheet = null;\n};\n\nCSSOM.CSSRule.UNKNOWN_RULE = 0; // obsolete\nCSSOM.CSSRule.STYLE_RULE = 1;\nCSSOM.CSSRule.CHARSET_RULE = 2; // obsolete\nCSSOM.CSSRule.IMPORT_RULE = 3;\nCSSOM.CSSRule.MEDIA_RULE = 4;\nCSSOM.CSSRule.FONT_FACE_RULE = 5;\nCSSOM.CSSRule.PAGE_RULE = 6;\nCSSOM.CSSRule.KEYFRAMES_RULE = 7;\nCSSOM.CSSRule.KEYFRAME_RULE = 8;\nCSSOM.CSSRule.MARGIN_RULE = 9;\nCSSOM.CSSRule.NAMESPACE_RULE = 10;\nCSSOM.CSSRule.COUNTER_STYLE_RULE = 11;\nCSSOM.CSSRule.SUPPORTS_RULE = 12;\nCSSOM.CSSRule.DOCUMENT_RULE = 13;\nCSSOM.CSSRule.FONT_FEATURE_VALUES_RULE = 14;\nCSSOM.CSSRule.VIEWPORT_RULE = 15;\nCSSOM.CSSRule.REGION_STYLE_RULE = 16;\n\n\nCSSOM.CSSRule.prototype = {\n\tconstructor: CSSOM.CSSRule\n\t//FIXME\n};\n\n\n//.CommonJS\nexports.CSSRule = CSSOM.CSSRule;\n///CommonJS\n\n},{}],17:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration\n */\nCSSOM.CSSStyleDeclaration = function CSSStyleDeclaration(){\n\tthis.length = 0;\n\tthis.parentRule = null;\n\n\t// NON-STANDARD\n\tthis._importants = {};\n};\n\n\nCSSOM.CSSStyleDeclaration.prototype = {\n\n\tconstructor: CSSOM.CSSStyleDeclaration,\n\n\t/**\n\t *\n\t * @param {string} name\n\t * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyValue\n\t * @return {string} the value of the property if it has been explicitly set for this declaration block.\n\t * Returns the empty string if the property has not been set.\n\t */\n\tgetPropertyValue: function(name) {\n\t\treturn this[name] || \"\";\n\t},\n\n\t/**\n\t *\n\t * @param {string} name\n\t * @param {string} value\n\t * @param {string} [priority=null] \"important\" or null\n\t * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-setProperty\n\t */\n\tsetProperty: function(name, value, priority) {\n\t\tif (this[name]) {\n\t\t\t// Property already exist. Overwrite it.\n\t\t\tvar index = Array.prototype.indexOf.call(this, name);\n\t\t\tif (index < 0) {\n\t\t\t\tthis[this.length] = name;\n\t\t\t\tthis.length++;\n\t\t\t}\n\t\t} else {\n\t\t\t// New property.\n\t\t\tthis[this.length] = name;\n\t\t\tthis.length++;\n\t\t}\n\t\tthis[name] = value + \"\";\n\t\tthis._importants[name] = priority;\n\t},\n\n\t/**\n\t *\n\t * @param {string} name\n\t * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-removeProperty\n\t * @return {string} the value of the property if it has been explicitly set for this declaration block.\n\t * Returns the empty string if the property has not been set or the property name does not correspond to a known CSS property.\n\t */\n\tremoveProperty: function(name) {\n\t\tif (!(name in this)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tvar index = Array.prototype.indexOf.call(this, name);\n\t\tif (index < 0) {\n\t\t\treturn \"\";\n\t\t}\n\t\tvar prevValue = this[name];\n\t\tthis[name] = \"\";\n\n\t\t// That's what WebKit and Opera do\n\t\tArray.prototype.splice.call(this, index, 1);\n\n\t\t// That's what Firefox does\n\t\t//this[index] = \"\"\n\n\t\treturn prevValue;\n\t},\n\n\tgetPropertyCSSValue: function() {\n\t\t//FIXME\n\t},\n\n\t/**\n\t *\n\t * @param {String} name\n\t */\n\tgetPropertyPriority: function(name) {\n\t\treturn this._importants[name] || \"\";\n\t},\n\n\n\t/**\n\t * element.style.overflow = \"auto\"\n\t * element.style.getPropertyShorthand(\"overflow-x\")\n\t * -> \"overflow\"\n\t */\n\tgetPropertyShorthand: function() {\n\t\t//FIXME\n\t},\n\n\tisPropertyImplicit: function() {\n\t\t//FIXME\n\t},\n\n\t// Doesn't work in IE < 9\n\tget cssText(){\n\t\tvar properties = [];\n\t\tfor (var i=0, length=this.length; i < length; ++i) {\n\t\t\tvar name = this[i];\n\t\t\tvar value = this.getPropertyValue(name);\n\t\t\tvar priority = this.getPropertyPriority(name);\n\t\t\tif (priority) {\n\t\t\t\tpriority = \" !\" + priority;\n\t\t\t}\n\t\t\tproperties[i] = name + \": \" + value + priority + \";\";\n\t\t}\n\t\treturn properties.join(\" \");\n\t},\n\n\tset cssText(text){\n\t\tvar i, name;\n\t\tfor (i = this.length; i--;) {\n\t\t\tname = this[i];\n\t\t\tthis[name] = \"\";\n\t\t}\n\t\tArray.prototype.splice.call(this, 0, this.length);\n\t\tthis._importants = {};\n\n\t\tvar dummyRule = CSSOM.parse('#bogus{' + text + '}').cssRules[0].style;\n\t\tvar length = dummyRule.length;\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\tname = dummyRule[i];\n\t\t\tthis.setProperty(dummyRule[i], dummyRule.getPropertyValue(name), dummyRule.getPropertyPriority(name));\n\t\t}\n\t}\n};\n\n\n//.CommonJS\nexports.CSSStyleDeclaration = CSSOM.CSSStyleDeclaration;\nCSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleDeclaration.js\n///CommonJS\n\n},{\"./parse\":27}],18:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSStyleDeclaration: require(\"./CSSStyleDeclaration\").CSSStyleDeclaration,\n\tCSSRule: require(\"./CSSRule\").CSSRule\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#cssstylerule\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule\n */\nCSSOM.CSSStyleRule = function CSSStyleRule() {\n\tCSSOM.CSSRule.call(this);\n\tthis.selectorText = \"\";\n\tthis.style = new CSSOM.CSSStyleDeclaration();\n\tthis.style.parentRule = this;\n};\n\nCSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule();\nCSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule;\nCSSOM.CSSStyleRule.prototype.type = 1;\n\nObject.defineProperty(CSSOM.CSSStyleRule.prototype, \"cssText\", {\n\tget: function() {\n\t\tvar text;\n\t\tif (this.selectorText) {\n\t\t\ttext = this.selectorText + \" {\" + this.style.cssText + \"}\";\n\t\t} else {\n\t\t\ttext = \"\";\n\t\t}\n\t\treturn text;\n\t},\n\tset: function(cssText) {\n\t\tvar rule = CSSOM.CSSStyleRule.parse(cssText);\n\t\tthis.style = rule.style;\n\t\tthis.selectorText = rule.selectorText;\n\t}\n});\n\n\n/**\n * NON-STANDARD\n * lightweight version of parse.js.\n * @param {string} ruleText\n * @return CSSStyleRule\n */\nCSSOM.CSSStyleRule.parse = function(ruleText) {\n\tvar i = 0;\n\tvar state = \"selector\";\n\tvar index;\n\tvar j = i;\n\tvar buffer = \"\";\n\n\tvar SIGNIFICANT_WHITESPACE = {\n\t\t\"selector\": true,\n\t\t\"value\": true\n\t};\n\n\tvar styleRule = new CSSOM.CSSStyleRule();\n\tvar name, priority=\"\";\n\n\tfor (var character; (character = ruleText.charAt(i)); i++) {\n\n\t\tswitch (character) {\n\n\t\tcase \" \":\n\t\tcase \"\\t\":\n\t\tcase \"\\r\":\n\t\tcase \"\\n\":\n\t\tcase \"\\f\":\n\t\t\tif (SIGNIFICANT_WHITESPACE[state]) {\n\t\t\t\t// Squash 2 or more white-spaces in the row into 1\n\t\t\t\tswitch (ruleText.charAt(i - 1)) {\n\t\t\t\t\tcase \" \":\n\t\t\t\t\tcase \"\\t\":\n\t\t\t\t\tcase \"\\r\":\n\t\t\t\t\tcase \"\\n\":\n\t\t\t\t\tcase \"\\f\":\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbuffer += \" \";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\t// String\n\t\tcase '\"':\n\t\t\tj = i + 1;\n\t\t\tindex = ruleText.indexOf('\"', j) + 1;\n\t\t\tif (!index) {\n\t\t\t\tthrow '\" is missing';\n\t\t\t}\n\t\t\tbuffer += ruleText.slice(i, index);\n\t\t\ti = index - 1;\n\t\t\tbreak;\n\n\t\tcase \"'\":\n\t\t\tj = i + 1;\n\t\t\tindex = ruleText.indexOf(\"'\", j) + 1;\n\t\t\tif (!index) {\n\t\t\t\tthrow \"' is missing\";\n\t\t\t}\n\t\t\tbuffer += ruleText.slice(i, index);\n\t\t\ti = index - 1;\n\t\t\tbreak;\n\n\t\t// Comment\n\t\tcase \"/\":\n\t\t\tif (ruleText.charAt(i + 1) === \"*\") {\n\t\t\t\ti += 2;\n\t\t\t\tindex = ruleText.indexOf(\"*/\", i);\n\t\t\t\tif (index === -1) {\n\t\t\t\t\tthrow new SyntaxError(\"Missing */\");\n\t\t\t\t} else {\n\t\t\t\t\ti = index + 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"{\":\n\t\t\tif (state === \"selector\") {\n\t\t\t\tstyleRule.selectorText = buffer.trim();\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"name\";\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \":\":\n\t\t\tif (state === \"name\") {\n\t\t\t\tname = buffer.trim();\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"value\";\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"!\":\n\t\t\tif (state === \"value\" && ruleText.indexOf(\"!important\", i) === i) {\n\t\t\t\tpriority = \"important\";\n\t\t\t\ti += \"important\".length;\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \";\":\n\t\t\tif (state === \"value\") {\n\t\t\t\tstyleRule.style.setProperty(name, buffer.trim(), priority);\n\t\t\t\tpriority = \"\";\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"name\";\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"}\":\n\t\t\tif (state === \"value\") {\n\t\t\t\tstyleRule.style.setProperty(name, buffer.trim(), priority);\n\t\t\t\tpriority = \"\";\n\t\t\t\tbuffer = \"\";\n\t\t\t} else if (state === \"name\") {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tstate = \"selector\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbuffer += character;\n\t\t\tbreak;\n\n\t\t}\n\t}\n\n\treturn styleRule;\n\n};\n\n\n//.CommonJS\nexports.CSSStyleRule = CSSOM.CSSStyleRule;\n///CommonJS\n\n},{\"./CSSRule\":16,\"./CSSStyleDeclaration\":17}],19:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tStyleSheet: require(\"./StyleSheet\").StyleSheet,\n\tCSSStyleRule: require(\"./CSSStyleRule\").CSSStyleRule\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet\n */\nCSSOM.CSSStyleSheet = function CSSStyleSheet() {\n\tCSSOM.StyleSheet.call(this);\n\tthis.cssRules = [];\n};\n\n\nCSSOM.CSSStyleSheet.prototype = new CSSOM.StyleSheet();\nCSSOM.CSSStyleSheet.prototype.constructor = CSSOM.CSSStyleSheet;\n\n\n/**\n * Used to insert a new rule into the style sheet. The new rule now becomes part of the cascade.\n *\n * sheet = new Sheet(\"body {margin: 0}\")\n * sheet.toString()\n * -> \"body{margin:0;}\"\n * sheet.insertRule(\"img {border: none}\", 0)\n * -> 0\n * sheet.toString()\n * -> \"img{border:none;}body{margin:0;}\"\n *\n * @param {string} rule\n * @param {number} index\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-insertRule\n * @return {number} The index within the style sheet's rule collection of the newly inserted rule.\n */\nCSSOM.CSSStyleSheet.prototype.insertRule = function(rule, index) {\n\tif (index < 0 || index > this.cssRules.length) {\n\t\tthrow new RangeError(\"INDEX_SIZE_ERR\");\n\t}\n\tvar cssRule = CSSOM.parse(rule).cssRules[0];\n\tcssRule.parentStyleSheet = this;\n\tthis.cssRules.splice(index, 0, cssRule);\n\treturn index;\n};\n\n\n/**\n * Used to delete a rule from the style sheet.\n *\n * sheet = new Sheet(\"img{border:none} body{margin:0}\")\n * sheet.toString()\n * -> \"img{border:none;}body{margin:0;}\"\n * sheet.deleteRule(0)\n * sheet.toString()\n * -> \"body{margin:0;}\"\n *\n * @param {number} index within the style sheet's rule list of the rule to remove.\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-deleteRule\n */\nCSSOM.CSSStyleSheet.prototype.deleteRule = function(index) {\n\tif (index < 0 || index >= this.cssRules.length) {\n\t\tthrow new RangeError(\"INDEX_SIZE_ERR\");\n\t}\n\tthis.cssRules.splice(index, 1);\n};\n\n\n/**\n * NON-STANDARD\n * @return {string} serialize stylesheet\n */\nCSSOM.CSSStyleSheet.prototype.toString = function() {\n\tvar result = \"\";\n\tvar rules = this.cssRules;\n\tfor (var i=0; i<rules.length; i++) {\n\t\tresult += rules[i].cssText + \"\\n\";\n\t}\n\treturn result;\n};\n\n\n//.CommonJS\nexports.CSSStyleSheet = CSSOM.CSSStyleSheet;\nCSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleSheet.js\n///CommonJS\n\n},{\"./CSSStyleRule\":18,\"./StyleSheet\":24,\"./parse\":27}],20:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue\n *\n * TODO: add if needed\n */\nCSSOM.CSSValue = function CSSValue() {\n};\n\nCSSOM.CSSValue.prototype = {\n\tconstructor: CSSOM.CSSValue,\n\n\t// @see: http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue\n\tset cssText(text) {\n\t\tvar name = this._getConstructorName();\n\n\t\tthrow new Error('DOMException: property \"cssText\" of \"' + name + '\" is readonly and can not be replaced with \"' + text + '\"!');\n\t},\n\n\tget cssText() {\n\t\tvar name = this._getConstructorName();\n\n\t\tthrow new Error('getter \"cssText\" of \"' + name + '\" is not implemented!');\n\t},\n\n\t_getConstructorName: function() {\n\t\tvar s = this.constructor.toString(),\n\t\t\t\tc = s.match(/function\\s([^\\(]+)/),\n\t\t\t\tname = c[1];\n\n\t\treturn name;\n\t}\n};\n\n\n//.CommonJS\nexports.CSSValue = CSSOM.CSSValue;\n///CommonJS\n\n},{}],21:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSValue: require('./CSSValue').CSSValue\n};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/ms537634(v=vs.85).aspx\n *\n */\nCSSOM.CSSValueExpression = function CSSValueExpression(token, idx) {\n\tthis._token = token;\n\tthis._idx = idx;\n};\n\nCSSOM.CSSValueExpression.prototype = new CSSOM.CSSValue();\nCSSOM.CSSValueExpression.prototype.constructor = CSSOM.CSSValueExpression;\n\n/**\n * parse css expression() value\n *\n * @return {Object}\n * - error:\n * or\n * - idx:\n * - expression:\n *\n * Example:\n *\n * .selector {\n *\t\tzoom: expression(documentElement.clientWidth > 1000 ? '1000px' : 'auto');\n * }\n */\nCSSOM.CSSValueExpression.prototype.parse = function() {\n\tvar token = this._token,\n\t\t\tidx = this._idx;\n\n\tvar character = '',\n\t\t\texpression = '',\n\t\t\terror = '',\n\t\t\tinfo,\n\t\t\tparen = [];\n\n\n\tfor (; ; ++idx) {\n\t\tcharacter = token.charAt(idx);\n\n\t\t// end of token\n\t\tif (character === '') {\n\t\t\terror = 'css expression error: unfinished expression!';\n\t\t\tbreak;\n\t\t}\n\n\t\tswitch(character) {\n\t\t\tcase '(':\n\t\t\t\tparen.push(character);\n\t\t\t\texpression += character;\n\t\t\t\tbreak;\n\n\t\t\tcase ')':\n\t\t\t\tparen.pop(character);\n\t\t\t\texpression += character;\n\t\t\t\tbreak;\n\n\t\t\tcase '/':\n\t\t\t\tif ((info = this._parseJSComment(token, idx))) { // comment?\n\t\t\t\t\tif (info.error) {\n\t\t\t\t\t\terror = 'css expression error: unfinished comment in expression!';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tidx = info.idx;\n\t\t\t\t\t\t// ignore the comment\n\t\t\t\t\t}\n\t\t\t\t} else if ((info = this._parseJSRexExp(token, idx))) { // regexp\n\t\t\t\t\tidx = info.idx;\n\t\t\t\t\texpression += info.text;\n\t\t\t\t} else { // other\n\t\t\t\t\texpression += character;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"'\":\n\t\t\tcase '\"':\n\t\t\t\tinfo = this._parseJSString(token, idx, character);\n\t\t\t\tif (info) { // string\n\t\t\t\t\tidx = info.idx;\n\t\t\t\t\texpression += info.text;\n\t\t\t\t} else {\n\t\t\t\t\texpression += character;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\texpression += character;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (error) {\n\t\t\tbreak;\n\t\t}\n\n\t\t// end of expression\n\t\tif (paren.length === 0) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvar ret;\n\tif (error) {\n\t\tret = {\n\t\t\terror: error\n\t\t};\n\t} else {\n\t\tret = {\n\t\t\tidx: idx,\n\t\t\texpression: expression\n\t\t};\n\t}\n\n\treturn ret;\n};\n\n\n/**\n *\n * @return {Object|false}\n * - idx:\n * - text:\n * or\n * - error:\n * or\n * false\n *\n */\nCSSOM.CSSValueExpression.prototype._parseJSComment = function(token, idx) {\n\tvar nextChar = token.charAt(idx + 1),\n\t\t\ttext;\n\n\tif (nextChar === '/' || nextChar === '*') {\n\t\tvar startIdx = idx,\n\t\t\t\tendIdx,\n\t\t\t\tcommentEndChar;\n\n\t\tif (nextChar === '/') { // line comment\n\t\t\tcommentEndChar = '\\n';\n\t\t} else if (nextChar === '*') { // block comment\n\t\t\tcommentEndChar = '*/';\n\t\t}\n\n\t\tendIdx = token.indexOf(commentEndChar, startIdx + 1 + 1);\n\t\tif (endIdx !== -1) {\n\t\t\tendIdx = endIdx + commentEndChar.length - 1;\n\t\t\ttext = token.substring(idx, endIdx + 1);\n\t\t\treturn {\n\t\t\t\tidx: endIdx,\n\t\t\t\ttext: text\n\t\t\t};\n\t\t} else {\n\t\t\tvar error = 'css expression error: unfinished comment in expression!';\n\t\t\treturn {\n\t\t\t\terror: error\n\t\t\t};\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n};\n\n\n/**\n *\n * @return {Object|false}\n *\t\t\t\t\t- idx:\n *\t\t\t\t\t- text:\n *\t\t\t\t\tor \n *\t\t\t\t\tfalse\n *\n */\nCSSOM.CSSValueExpression.prototype._parseJSString = function(token, idx, sep) {\n\tvar endIdx = this._findMatchedIdx(token, idx, sep),\n\t\t\ttext;\n\n\tif (endIdx === -1) {\n\t\treturn false;\n\t} else {\n\t\ttext = token.substring(idx, endIdx + sep.length);\n\n\t\treturn {\n\t\t\tidx: endIdx,\n\t\t\ttext: text\n\t\t};\n\t}\n};\n\n\n/**\n * parse regexp in css expression\n *\n * @return {Object|false}\n *\t\t\t\t- idx:\n *\t\t\t\t- regExp:\n *\t\t\t\tor \n *\t\t\t\tfalse\n */\n\n/*\n\nall legal RegExp\n \n/a/\n(/a/)\n[/a/]\n[12, /a/]\n\n!/a/\n\n+/a/\n-/a/\n* /a/\n/ /a/\n%/a/\n\n===/a/\n!==/a/\n==/a/\n!=/a/\n>/a/\n>=/a/\n</a/\n<=/a/\n\n&/a/\n|/a/\n^/a/\n~/a/\n<</a/\n>>/a/\n>>>/a/\n\n&&/a/\n||/a/\n?/a/\n=/a/\n,/a/\n\n\t\tdelete /a/\n\t\t\t\tin /a/\ninstanceof /a/\n\t\t\t\tnew /a/\n\t\ttypeof /a/\n\t\t\tvoid /a/\n\n*/\nCSSOM.CSSValueExpression.prototype._parseJSRexExp = function(token, idx) {\n\tvar before = token.substring(0, idx).replace(/\\s+$/, \"\"),\n\t\t\tlegalRegx = [\n\t\t\t\t/^$/,\n\t\t\t\t/\\($/,\n\t\t\t\t/\\[$/,\n\t\t\t\t/\\!$/,\n\t\t\t\t/\\+$/,\n\t\t\t\t/\\-$/,\n\t\t\t\t/\\*$/,\n\t\t\t\t/\\/\\s+/,\n\t\t\t\t/\\%$/,\n\t\t\t\t/\\=$/,\n\t\t\t\t/\\>$/,\n\t\t\t\t/<$/,\n\t\t\t\t/\\&$/,\n\t\t\t\t/\\|$/,\n\t\t\t\t/\\^$/,\n\t\t\t\t/\\~$/,\n\t\t\t\t/\\?$/,\n\t\t\t\t/\\,$/,\n\t\t\t\t/delete$/,\n\t\t\t\t/in$/,\n\t\t\t\t/instanceof$/,\n\t\t\t\t/new$/,\n\t\t\t\t/typeof$/,\n\t\t\t\t/void$/\n\t\t\t];\n\n\tvar isLegal = legalRegx.some(function(reg) {\n\t\treturn reg.test(before);\n\t});\n\n\tif (!isLegal) {\n\t\treturn false;\n\t} else {\n\t\tvar sep = '/';\n\n\t\t// same logic as string\n\t\treturn this._parseJSString(token, idx, sep);\n\t}\n};\n\n\n/**\n *\n * find next sep(same line) index in `token`\n *\n * @return {Number}\n *\n */\nCSSOM.CSSValueExpression.prototype._findMatchedIdx = function(token, idx, sep) {\n\tvar startIdx = idx,\n\t\t\tendIdx;\n\n\tvar NOT_FOUND = -1;\n\n\twhile(true) {\n\t\tendIdx = token.indexOf(sep, startIdx + 1);\n\n\t\tif (endIdx === -1) { // not found\n\t\t\tendIdx = NOT_FOUND;\n\t\t\tbreak;\n\t\t} else {\n\t\t\tvar text = token.substring(idx + 1, endIdx),\n\t\t\t\t\tmatched = text.match(/\\\\+$/);\n\t\t\tif (!matched || matched[0] % 2 === 0) { // not escaped\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tstartIdx = endIdx;\n\t\t\t}\n\t\t}\n\t}\n\n\t// boundary must be in the same line(js sting or regexp)\n\tvar nextNewLineIdx = token.indexOf('\\n', idx + 1);\n\tif (nextNewLineIdx < endIdx) {\n\t\tendIdx = NOT_FOUND;\n\t}\n\n\n\treturn endIdx;\n};\n\n\n\n\n//.CommonJS\nexports.CSSValueExpression = CSSOM.CSSValueExpression;\n///CommonJS\n\n},{\"./CSSValue\":20}],22:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @constructor\n * @see https://developer.mozilla.org/en/CSS/@-moz-document\n */\nCSSOM.MatcherList = function MatcherList(){\n this.length = 0;\n};\n\nCSSOM.MatcherList.prototype = {\n\n constructor: CSSOM.MatcherList,\n\n /**\n * @return {string}\n */\n get matcherText() {\n return Array.prototype.join.call(this, \", \");\n },\n\n /**\n * @param {string} value\n */\n set matcherText(value) {\n // just a temporary solution, actually it may be wrong by just split the value with ',', because a url can include ','.\n var values = value.split(\",\");\n var length = this.length = values.length;\n for (var i=0; i<length; i++) {\n this[i] = values[i].trim();\n }\n },\n\n /**\n * @param {string} matcher\n */\n appendMatcher: function(matcher) {\n if (Array.prototype.indexOf.call(this, matcher) === -1) {\n this[this.length] = matcher;\n this.length++;\n }\n },\n\n /**\n * @param {string} matcher\n */\n deleteMatcher: function(matcher) {\n var index = Array.prototype.indexOf.call(this, matcher);\n if (index !== -1) {\n Array.prototype.splice.call(this, index, 1);\n }\n }\n\n};\n\n\n//.CommonJS\nexports.MatcherList = CSSOM.MatcherList;\n///CommonJS\n\n},{}],23:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#the-medialist-interface\n */\nCSSOM.MediaList = function MediaList(){\n\tthis.length = 0;\n};\n\nCSSOM.MediaList.prototype = {\n\n\tconstructor: CSSOM.MediaList,\n\n\t/**\n\t * @return {string}\n\t */\n\tget mediaText() {\n\t\treturn Array.prototype.join.call(this, \", \");\n\t},\n\n\t/**\n\t * @param {string} value\n\t */\n\tset mediaText(value) {\n\t\tvar values = value.split(\",\");\n\t\tvar length = this.length = values.length;\n\t\tfor (var i=0; i<length; i++) {\n\t\t\tthis[i] = values[i].trim();\n\t\t}\n\t},\n\n\t/**\n\t * @param {string} medium\n\t */\n\tappendMedium: function(medium) {\n\t\tif (Array.prototype.indexOf.call(this, medium) === -1) {\n\t\t\tthis[this.length] = medium;\n\t\t\tthis.length++;\n\t\t}\n\t},\n\n\t/**\n\t * @param {string} medium\n\t */\n\tdeleteMedium: function(medium) {\n\t\tvar index = Array.prototype.indexOf.call(this, medium);\n\t\tif (index !== -1) {\n\t\t\tArray.prototype.splice.call(this, index, 1);\n\t\t}\n\t}\n\n};\n\n\n//.CommonJS\nexports.MediaList = CSSOM.MediaList;\n///CommonJS\n\n},{}],24:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @constructor\n * @see http://dev.w3.org/csswg/cssom/#the-stylesheet-interface\n */\nCSSOM.StyleSheet = function StyleSheet() {\n\tthis.parentStyleSheet = null;\n};\n\n\n//.CommonJS\nexports.StyleSheet = CSSOM.StyleSheet;\n///CommonJS\n\n},{}],25:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {\n\tCSSStyleSheet: require(\"./CSSStyleSheet\").CSSStyleSheet,\n\tCSSStyleRule: require(\"./CSSStyleRule\").CSSStyleRule,\n\tCSSMediaRule: require(\"./CSSMediaRule\").CSSMediaRule,\n\tCSSStyleDeclaration: require(\"./CSSStyleDeclaration\").CSSStyleDeclaration,\n\tCSSKeyframeRule: require('./CSSKeyframeRule').CSSKeyframeRule,\n\tCSSKeyframesRule: require('./CSSKeyframesRule').CSSKeyframesRule\n};\n///CommonJS\n\n\n/**\n * Produces a deep copy of stylesheet — the instance variables of stylesheet are copied recursively.\n * @param {CSSStyleSheet|CSSOM.CSSStyleSheet} stylesheet\n * @nosideeffects\n * @return {CSSOM.CSSStyleSheet}\n */\nCSSOM.clone = function clone(stylesheet) {\n\n\tvar cloned = new CSSOM.CSSStyleSheet();\n\n\tvar rules = stylesheet.cssRules;\n\tif (!rules) {\n\t\treturn cloned;\n\t}\n\n\tvar RULE_TYPES = {\n\t\t1: CSSOM.CSSStyleRule,\n\t\t4: CSSOM.CSSMediaRule,\n\t\t//3: CSSOM.CSSImportRule,\n\t\t//5: CSSOM.CSSFontFaceRule,\n\t\t//6: CSSOM.CSSPageRule,\n\t\t8: CSSOM.CSSKeyframesRule,\n\t\t9: CSSOM.CSSKeyframeRule\n\t};\n\n\tfor (var i=0, rulesLength=rules.length; i < rulesLength; i++) {\n\t\tvar rule = rules[i];\n\t\tvar ruleClone = cloned.cssRules[i] = new RULE_TYPES[rule.type]();\n\n\t\tvar style = rule.style;\n\t\tif (style) {\n\t\t\tvar styleClone = ruleClone.style = new CSSOM.CSSStyleDeclaration();\n\t\t\tfor (var j=0, styleLength=style.length; j < styleLength; j++) {\n\t\t\t\tvar name = styleClone[j] = style[j];\n\t\t\t\tstyleClone[name] = style[name];\n\t\t\t\tstyleClone._importants[name] = style.getPropertyPriority(name);\n\t\t\t}\n\t\t\tstyleClone.length = style.length;\n\t\t}\n\n\t\tif (rule.hasOwnProperty('keyText')) {\n\t\t\truleClone.keyText = rule.keyText;\n\t\t}\n\n\t\tif (rule.hasOwnProperty('selectorText')) {\n\t\t\truleClone.selectorText = rule.selectorText;\n\t\t}\n\n\t\tif (rule.hasOwnProperty('mediaText')) {\n\t\t\truleClone.mediaText = rule.mediaText;\n\t\t}\n\n\t\tif (rule.hasOwnProperty('cssRules')) {\n\t\t\truleClone.cssRules = clone(rule).cssRules;\n\t\t}\n\t}\n\n\treturn cloned;\n\n};\n\n//.CommonJS\nexports.clone = CSSOM.clone;\n///CommonJS\n\n},{\"./CSSKeyframeRule\":13,\"./CSSKeyframesRule\":14,\"./CSSMediaRule\":15,\"./CSSStyleDeclaration\":17,\"./CSSStyleRule\":18,\"./CSSStyleSheet\":19}],26:[function(require,module,exports){\nexports.CSSStyleDeclaration = require(\"./CSSStyleDeclaration\").CSSStyleDeclaration;\nexports.CSSRule = require(\"./CSSRule\").CSSRule;\nexports.CSSStyleRule = require(\"./CSSStyleRule\").CSSStyleRule;\nexports.CSSImportRule = require(\"./CSSImportRule\").CSSImportRule;\nexports.MediaList = require(\"./MediaList\").MediaList;\nexports.CSSMediaRule = require(\"./CSSMediaRule\").CSSMediaRule;\nexports.StyleSheet = require(\"./StyleSheet\").StyleSheet;\nexports.CSSStyleSheet = require(\"./CSSStyleSheet\").CSSStyleSheet;\nexports.parse = require(\"./parse\").parse;\nexports.clone = require(\"./clone\").clone;\n\n},{\"./CSSImportRule\":12,\"./CSSMediaRule\":15,\"./CSSRule\":16,\"./CSSStyleDeclaration\":17,\"./CSSStyleRule\":18,\"./CSSStyleSheet\":19,\"./MediaList\":23,\"./StyleSheet\":24,\"./clone\":25,\"./parse\":27}],27:[function(require,module,exports){\n//.CommonJS\nvar CSSOM = {};\n///CommonJS\n\n\n/**\n * @param {string} token\n */\nCSSOM.parse = function parse(token) {\n\n\tvar i = 0;\n\n\t/**\n\t\t\"before-selector\" or\n\t\t\"selector\" or\n\t\t\"atRule\" or\n\t\t\"atBlock\" or\n\t\t\"before-name\" or\n\t\t\"name\" or\n\t\t\"before-value\" or\n\t\t\"value\"\n\t*/\n\tvar state = \"before-selector\";\n\n\tvar index;\n\tvar buffer = \"\";\n\tvar valueParenthesisDepth = 0;\n\n\tvar SIGNIFICANT_WHITESPACE = {\n\t\t\"selector\": true,\n\t\t\"value\": true,\n\t\t\"value-parenthesis\": true,\n\t\t\"atRule\": true,\n\t\t\"importRule-begin\": true,\n\t\t\"importRule\": true,\n\t\t\"atBlock\": true,\n\t\t'documentRule-begin': true\n\t};\n\n\tvar styleSheet = new CSSOM.CSSStyleSheet();\n\n\t// @type CSSStyleSheet|CSSMediaRule|CSSFontFaceRule|CSSKeyframesRule|CSSDocumentRule\n\tvar currentScope = styleSheet;\n\n\t// @type CSSMediaRule|CSSKeyframesRule|CSSDocumentRule\n\tvar parentRule;\n\n\tvar name, priority=\"\", styleRule, mediaRule, importRule, fontFaceRule, keyframesRule, documentRule, hostRule;\n\n\tvar atKeyframesRegExp = /@(-(?:\\w+-)+)?keyframes/g;\n\n\tvar parseError = function(message) {\n\t\tvar lines = token.substring(0, i).split('\\n');\n\t\tvar lineCount = lines.length;\n\t\tvar charCount = lines.pop().length + 1;\n\t\tvar error = new Error(message + ' (line ' + lineCount + ', char ' + charCount + ')');\n\t\terror.line = lineCount;\n\t\t/* jshint sub : true */\n\t\terror['char'] = charCount;\n\t\terror.styleSheet = styleSheet;\n\t\tthrow error;\n\t};\n\n\tfor (var character; (character = token.charAt(i)); i++) {\n\n\t\tswitch (character) {\n\n\t\tcase \" \":\n\t\tcase \"\\t\":\n\t\tcase \"\\r\":\n\t\tcase \"\\n\":\n\t\tcase \"\\f\":\n\t\t\tif (SIGNIFICANT_WHITESPACE[state]) {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t// String\n\t\tcase '\"':\n\t\t\tindex = i + 1;\n\t\t\tdo {\n\t\t\t\tindex = token.indexOf('\"', index) + 1;\n\t\t\t\tif (!index) {\n\t\t\t\t\tparseError('Unmatched \"');\n\t\t\t\t}\n\t\t\t} while (token[index - 2] === '\\\\');\n\t\t\tbuffer += token.slice(i, index);\n\t\t\ti = index - 1;\n\t\t\tswitch (state) {\n\t\t\t\tcase 'before-value':\n\t\t\t\t\tstate = 'value';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'importRule-begin':\n\t\t\t\t\tstate = 'importRule';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"'\":\n\t\t\tindex = i + 1;\n\t\t\tdo {\n\t\t\t\tindex = token.indexOf(\"'\", index) + 1;\n\t\t\t\tif (!index) {\n\t\t\t\t\tparseError(\"Unmatched '\");\n\t\t\t\t}\n\t\t\t} while (token[index - 2] === '\\\\');\n\t\t\tbuffer += token.slice(i, index);\n\t\t\ti = index - 1;\n\t\t\tswitch (state) {\n\t\t\t\tcase 'before-value':\n\t\t\t\t\tstate = 'value';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'importRule-begin':\n\t\t\t\t\tstate = 'importRule';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t// Comment\n\t\tcase \"/\":\n\t\t\tif (token.charAt(i + 1) === \"*\") {\n\t\t\t\ti += 2;\n\t\t\t\tindex = token.indexOf(\"*/\", i);\n\t\t\t\tif (index === -1) {\n\t\t\t\t\tparseError(\"Missing */\");\n\t\t\t\t} else {\n\t\t\t\t\ti = index + 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tif (state === \"importRule-begin\") {\n\t\t\t\tbuffer += \" \";\n\t\t\t\tstate = \"importRule\";\n\t\t\t}\n\t\t\tbreak;\n\n\t\t// At-rule\n\t\tcase \"@\":\n\t\t\tif (token.indexOf(\"@-moz-document\", i) === i) {\n\t\t\t\tstate = \"documentRule-begin\";\n\t\t\t\tdocumentRule = new CSSOM.CSSDocumentRule();\n\t\t\t\tdocumentRule.__starts = i;\n\t\t\t\ti += \"-moz-document\".length;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tbreak;\n\t\t\t} else if (token.indexOf(\"@media\", i) === i) {\n\t\t\t\tstate = \"atBlock\";\n\t\t\t\tmediaRule = new CSSOM.CSSMediaRule();\n\t\t\t\tmediaRule.__starts = i;\n\t\t\t\ti += \"media\".length;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tbreak;\n\t\t\t} else if (token.indexOf(\"@host\", i) === i) {\n\t\t\t\tstate = \"hostRule-begin\";\n\t\t\t\ti += \"host\".length;\n\t\t\t\thostRule = new CSSOM.CSSHostRule();\n\t\t\t\thostRule.__starts = i;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tbreak;\n\t\t\t} else if (token.indexOf(\"@import\", i) === i) {\n\t\t\t\tstate = \"importRule-begin\";\n\t\t\t\ti += \"import\".length;\n\t\t\t\tbuffer += \"@import\";\n\t\t\t\tbreak;\n\t\t\t} else if (token.indexOf(\"@font-face\", i) === i) {\n\t\t\t\tstate = \"fontFaceRule-begin\";\n\t\t\t\ti += \"font-face\".length;\n\t\t\t\tfontFaceRule = new CSSOM.CSSFontFaceRule();\n\t\t\t\tfontFaceRule.__starts = i;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tatKeyframesRegExp.lastIndex = i;\n\t\t\t\tvar matchKeyframes = atKeyframesRegExp.exec(token);\n\t\t\t\tif (matchKeyframes && matchKeyframes.index === i) {\n\t\t\t\t\tstate = \"keyframesRule-begin\";\n\t\t\t\t\tkeyframesRule = new CSSOM.CSSKeyframesRule();\n\t\t\t\t\tkeyframesRule.__starts = i;\n\t\t\t\t\tkeyframesRule._vendorPrefix = matchKeyframes[1]; // Will come out as undefined if no prefix was found\n\t\t\t\t\ti += matchKeyframes[0].length - 1;\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (state === \"selector\") {\n\t\t\t\t\tstate = \"atRule\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuffer += character;\n\t\t\tbreak;\n\n\t\tcase \"{\":\n\t\t\tif (state === \"selector\" || state === \"atRule\") {\n\t\t\t\tstyleRule.selectorText = buffer.trim();\n\t\t\t\tstyleRule.style.__starts = i;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-name\";\n\t\t\t} else if (state === \"atBlock\") {\n\t\t\t\tmediaRule.media.mediaText = buffer.trim();\n\t\t\t\tcurrentScope = parentRule = mediaRule;\n\t\t\t\tmediaRule.parentStyleSheet = styleSheet;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-selector\";\n\t\t\t} else if (state === \"hostRule-begin\") {\n\t\t\t\tcurrentScope = parentRule = hostRule;\n\t\t\t\thostRule.parentStyleSheet = styleSheet;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-selector\";\n\t\t\t} else if (state === \"fontFaceRule-begin\") {\n\t\t\t\tif (parentRule) {\n\t\t\t\t\tfontFaceRule.parentRule = parentRule;\n\t\t\t\t}\n\t\t\t\tfontFaceRule.parentStyleSheet = styleSheet;\n\t\t\t\tstyleRule = fontFaceRule;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-name\";\n\t\t\t} else if (state === \"keyframesRule-begin\") {\n\t\t\t\tkeyframesRule.name = buffer.trim();\n\t\t\t\tif (parentRule) {\n\t\t\t\t\tkeyframesRule.parentRule = parentRule;\n\t\t\t\t}\n\t\t\t\tkeyframesRule.parentStyleSheet = styleSheet;\n\t\t\t\tcurrentScope = parentRule = keyframesRule;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"keyframeRule-begin\";\n\t\t\t} else if (state === \"keyframeRule-begin\") {\n\t\t\t\tstyleRule = new CSSOM.CSSKeyframeRule();\n\t\t\t\tstyleRule.keyText = buffer.trim();\n\t\t\t\tstyleRule.__starts = i;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-name\";\n\t\t\t} else if (state === \"documentRule-begin\") {\n\t\t\t\t// FIXME: what if this '{' is in the url text of the match function?\n\t\t\t\tdocumentRule.matcher.matcherText = buffer.trim();\n\t\t\t\tif (parentRule) {\n\t\t\t\t\tdocumentRule.parentRule = parentRule;\n\t\t\t\t}\n\t\t\t\tcurrentScope = parentRule = documentRule;\n\t\t\t\tdocumentRule.parentStyleSheet = styleSheet;\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-selector\";\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \":\":\n\t\t\tif (state === \"name\") {\n\t\t\t\tname = buffer.trim();\n\t\t\t\tbuffer = \"\";\n\t\t\t\tstate = \"before-value\";\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"(\":\n\t\t\tif (state === 'value') {\n\t\t\t\t// ie css expression mode\n\t\t\t\tif (buffer.trim() === 'expression') {\n\t\t\t\t\tvar info = (new CSSOM.CSSValueExpression(token, i)).parse();\n\n\t\t\t\t\tif (info.error) {\n\t\t\t\t\t\tparseError(info.error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuffer += info.expression;\n\t\t\t\t\t\ti = info.idx;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tstate = 'value-parenthesis';\n\t\t\t\t\t//always ensure this is reset to 1 on transition\n\t\t\t\t\t//from value to value-parenthesis\n\t\t\t\t\tvalueParenthesisDepth = 1;\n\t\t\t\t\tbuffer += character;\n\t\t\t\t}\n\t\t\t} else if (state === 'value-parenthesis') {\n\t\t\t\tvalueParenthesisDepth++;\n\t\t\t\tbuffer += character;\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \")\":\n\t\t\tif (state === 'value-parenthesis') {\n\t\t\t\tvalueParenthesisDepth--;\n\t\t\t\tif (valueParenthesisDepth === 0) state = 'value';\n\t\t\t}\n\t\t\tbuffer += character;\n\t\t\tbreak;\n\n\t\tcase \"!\":\n\t\t\tif (state === \"value\" && token.indexOf(\"!important\", i) === i) {\n\t\t\t\tpriority = \"important\";\n\t\t\t\ti += \"important\".length;\n\t\t\t} else {\n\t\t\t\tbuffer += character;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \";\":\n\t\t\tswitch (state) {\n\t\t\t\tcase \"value\":\n\t\t\t\t\tstyleRule.style.setProperty(name, buffer.trim(), priority);\n\t\t\t\t\tpriority = \"\";\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tstate = \"before-name\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"atRule\":\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tstate = \"before-selector\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"importRule\":\n\t\t\t\t\timportRule = new CSSOM.CSSImportRule();\n\t\t\t\t\timportRule.parentStyleSheet = importRule.styleSheet.parentStyleSheet = styleSheet;\n\t\t\t\t\timportRule.cssText = buffer + character;\n\t\t\t\t\tstyleSheet.cssRules.push(importRule);\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tstate = \"before-selector\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbuffer += character;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"}\":\n\t\t\tswitch (state) {\n\t\t\t\tcase \"value\":\n\t\t\t\t\tstyleRule.style.setProperty(name, buffer.trim(), priority);\n\t\t\t\t\tpriority = \"\";\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase \"before-name\":\n\t\t\t\tcase \"name\":\n\t\t\t\t\tstyleRule.__ends = i + 1;\n\t\t\t\t\tif (parentRule) {\n\t\t\t\t\t\tstyleRule.parentRule = parentRule;\n\t\t\t\t\t}\n\t\t\t\t\tstyleRule.parentStyleSheet = styleSheet;\n\t\t\t\t\tcurrentScope.cssRules.push(styleRule);\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tif (currentScope.constructor === CSSOM.CSSKeyframesRule) {\n\t\t\t\t\t\tstate = \"keyframeRule-begin\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = \"before-selector\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"keyframeRule-begin\":\n\t\t\t\tcase \"before-selector\":\n\t\t\t\tcase \"selector\":\n\t\t\t\t\t// End of media/document rule.\n\t\t\t\t\tif (!parentRule) {\n\t\t\t\t\t\tparseError(\"Unexpected }\");\n\t\t\t\t\t}\n\t\t\t\t\tcurrentScope.__ends = i + 1;\n\t\t\t\t\t// Nesting rules aren't supported yet\n\t\t\t\t\tstyleSheet.cssRules.push(currentScope);\n\t\t\t\t\tcurrentScope = styleSheet;\n\t\t\t\t\tparentRule = null;\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tstate = \"before-selector\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tswitch (state) {\n\t\t\t\tcase \"before-selector\":\n\t\t\t\t\tstate = \"selector\";\n\t\t\t\t\tstyleRule = new CSSOM.CSSStyleRule();\n\t\t\t\t\tstyleRule.__starts = i;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"before-name\":\n\t\t\t\t\tstate = \"name\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"before-value\":\n\t\t\t\t\tstate = \"value\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"importRule-begin\":\n\t\t\t\t\tstate = \"importRule\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbuffer += character;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn styleSheet;\n};\n\n\n//.CommonJS\nexports.parse = CSSOM.parse;\n// The following modules cannot be included sooner due to the mutual dependency with parse.js\nCSSOM.CSSStyleSheet = require(\"./CSSStyleSheet\").CSSStyleSheet;\nCSSOM.CSSStyleRule = require(\"./CSSStyleRule\").CSSStyleRule;\nCSSOM.CSSImportRule = require(\"./CSSImportRule\").CSSImportRule;\nCSSOM.CSSMediaRule = require(\"./CSSMediaRule\").CSSMediaRule;\nCSSOM.CSSFontFaceRule = require(\"./CSSFontFaceRule\").CSSFontFaceRule;\nCSSOM.CSSHostRule = require(\"./CSSHostRule\").CSSHostRule;\nCSSOM.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;\nCSSOM.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule;\nCSSOM.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule;\nCSSOM.CSSValueExpression = require('./CSSValueExpression').CSSValueExpression;\nCSSOM.CSSDocumentRule = require('./CSSDocumentRule').CSSDocumentRule;\n///CommonJS\n\n},{\"./CSSDocumentRule\":9,\"./CSSFontFaceRule\":10,\"./CSSHostRule\":11,\"./CSSImportRule\":12,\"./CSSKeyframeRule\":13,\"./CSSKeyframesRule\":14,\"./CSSMediaRule\":15,\"./CSSStyleDeclaration\":17,\"./CSSStyleRule\":18,\"./CSSStyleSheet\":19,\"./CSSValueExpression\":21}],28:[function(require,module,exports){\n// Simple, stupid \"background\"/\"background-image\" value parser that just aims at exposing the image URLs\n\"use strict\";\n\nvar cssSupport = require('./cssSupport');\n\n\nvar trimCSSWhitespace = function (url) {\n var whitespaceRegex = /^[\\t\\r\\f\\n ]*(.+?)[\\t\\r\\f\\n ]*$/;\n\n return url.replace(whitespaceRegex, \"$1\");\n};\n\n// TODO exporting this for the sake of unit testing. Should rather test the background value parser explicitly.\nexports.extractCssUrl = function (cssUrl) {\n var urlRegex = /^url\\(([^\\)]+)\\)/,\n quotedUrl;\n\n if (!urlRegex.test(cssUrl)) {\n throw new Error(\"Invalid url\");\n }\n\n quotedUrl = urlRegex.exec(cssUrl)[1];\n return cssSupport.unquoteString(trimCSSWhitespace(quotedUrl));\n};\n\nvar sliceBackgroundDeclaration = function (backgroundDeclarationText) {\n var functionParamRegexS = \"\\\\s*(?:\\\"[^\\\"]*\\\"|'[^']*'|[^\\\\(]+)\\\\s*\",\n valueRegexS = \"(\" + \"url\\\\(\" + functionParamRegexS + \"\\\\)\" + \"|\" + \"[^,\\\\s]+\" + \")\",\n simpleSingularBackgroundRegexS = \"(?:\\\\s*\" + valueRegexS + \")+\",\n simpleBackgroundRegexS = \"^\\\\s*(\" + simpleSingularBackgroundRegexS + \")\" +\n \"(?:\\\\s*,\\\\s*(\" + simpleSingularBackgroundRegexS + \"))*\" +\n \"\\\\s*$\",\n simpleSingularBackgroundRegex = new RegExp(simpleSingularBackgroundRegexS, \"g\"),\n outerRepeatedMatch,\n backgroundLayers = [],\n getValues = function (singularBackgroundDeclaration) {\n var valueRegex = new RegExp(valueRegexS, \"g\"),\n backgroundValues = [],\n repeatedMatch;\n\n repeatedMatch = valueRegex.exec(singularBackgroundDeclaration);\n while (repeatedMatch) {\n backgroundValues.push(repeatedMatch[1]);\n repeatedMatch = valueRegex.exec(singularBackgroundDeclaration);\n }\n return backgroundValues;\n };\n\n if (backgroundDeclarationText.match(new RegExp(simpleBackgroundRegexS))) {\n outerRepeatedMatch = simpleSingularBackgroundRegex.exec(backgroundDeclarationText);\n while (outerRepeatedMatch) {\n backgroundLayers.push(getValues(outerRepeatedMatch[0]));\n outerRepeatedMatch = simpleSingularBackgroundRegex.exec(backgroundDeclarationText);\n }\n\n return backgroundLayers;\n }\n return [];\n};\n\nvar findBackgroundImageUrlInValues = function (values) {\n var i, url;\n\n for(i = 0; i < values.length; i++) {\n try {\n url = exports.extractCssUrl(values[i]);\n return {\n url: url,\n idx: i\n };\n } catch (e) {}\n }\n};\n\nexports.parse = function (backgroundValue) {\n var backgroundLayers = sliceBackgroundDeclaration(backgroundValue);\n\n return backgroundLayers.map(function (backgroundLayerValues) {\n var urlMatch = findBackgroundImageUrlInValues(backgroundLayerValues);\n\n if (urlMatch) {\n return {\n preUrl: backgroundLayerValues.slice(0, urlMatch.idx),\n url: urlMatch.url,\n postUrl: backgroundLayerValues.slice(urlMatch.idx+1),\n };\n } else {\n return {\n preUrl: backgroundLayerValues\n };\n }\n });\n};\n\nexports.serialize = function (parsedBackground) {\n var backgroundLayers = parsedBackground.map(function (backgroundLayer) {\n var values = [].concat(backgroundLayer.preUrl);\n\n if (backgroundLayer.url) {\n values.push('url(\"' + backgroundLayer.url + '\")');\n }\n if (backgroundLayer.postUrl) {\n values = values.concat(backgroundLayer.postUrl);\n }\n\n return values.join(' ');\n });\n\n return backgroundLayers.join(', ');\n};\n\n},{\"./cssSupport\":29}],29:[function(require,module,exports){\n\"use strict\";\n\nvar cssom;\n\ntry {\n cssom = require('cssom');\n} catch (e) {\n}\n\n\nexports.unquoteString = function (quotedUrl) {\n var doubleQuoteRegex = /^\"(.*)\"$/,\n singleQuoteRegex = /^'(.*)'$/;\n\n if (doubleQuoteRegex.test(quotedUrl)) {\n return quotedUrl.replace(doubleQuoteRegex, \"$1\");\n } else {\n if (singleQuoteRegex.test(quotedUrl)) {\n return quotedUrl.replace(singleQuoteRegex, \"$1\");\n } else {\n return quotedUrl;\n }\n }\n};\n\nvar rulesForCssTextFromBrowser = function (styleContent) {\n var doc = document.implementation.createHTMLDocument(\"\"),\n styleElement = document.createElement(\"style\"),\n rules;\n\n styleElement.textContent = styleContent;\n // the style will only be parsed once it is added to a document\n doc.body.appendChild(styleElement);\n rules = styleElement.sheet.cssRules;\n\n return Array.prototype.slice.call(rules);\n};\n\nvar browserHasBackgroundImageUrlIssue = (function () {\n // Checks for http://code.google.com/p/chromium/issues/detail?id=161644\n var rules = rulesForCssTextFromBrowser('a{background:url(i)}');\n return !rules.length || rules[0].cssText.indexOf('url()') >= 0;\n}());\n\nvar browserHasFontFaceUrlIssue = (function () {\n // Checks for https://bugs.chromium.org/p/chromium/issues/detail?id=588129\n var rules = rulesForCssTextFromBrowser('@font-face { font-family: \"f\"; src: url(\"f\"); }');\n return !rules.length || /url\\(['\"]*\\)/.test(rules[0].cssText);\n}());\n\nvar browserHasBackgroundImageUrlSetIssue = (function () {\n // Checks for https://bugs.chromium.org/p/chromium/issues/detail?id=660663\n var rules = rulesForCssTextFromBrowser('a{background:url(old)}');\n rules[0].style.setProperty('background', 'url(new)', '');\n return rules[0].style.getPropertyValue('background').indexOf('old') >= 0;\n}());\n\nexports.rulesForCssText = function (styleContent) {\n if ((browserHasBackgroundImageUrlIssue || browserHasFontFaceUrlIssue || browserHasBackgroundImageUrlSetIssue) && cssom && cssom.parse) {\n return cssom.parse(styleContent).cssRules;\n } else {\n return rulesForCssTextFromBrowser(styleContent);\n }\n};\n\nexports.cssRulesToText = function (cssRules) {\n return cssRules.reduce(function (cssText, rule) {\n return cssText + rule.cssText;\n }, '');\n};\n\nexports.exchangeRule = function (cssRules, rule, newRuleText) {\n var ruleIdx = cssRules.indexOf(rule);\n\n // We create a new document and stylesheet to parse the rule,\n // instead of relying on rule.parentStyleSheet, because\n // rule.parentStyleSheet may be null\n // (https://github.com/cburgmer/inlineresources/issues/3)\n cssRules[ruleIdx] = exports.rulesForCssText(newRuleText)[0];\n};\n\n// Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=443978\nexports.changeFontFaceRuleSrc = function (cssRules, rule, newSrc) {\n var newRuleText = '@font-face { font-family: ' + rule.style.getPropertyValue(\"font-family\") + '; ';\n\n if (rule.style.getPropertyValue(\"font-style\")) {\n newRuleText += 'font-style: ' + rule.style.getPropertyValue(\"font-style\") + '; ';\n }\n\n if (rule.style.getPropertyValue(\"font-weight\")) {\n newRuleText += 'font-weight: ' + rule.style.getPropertyValue(\"font-weight\") + '; ';\n }\n\n newRuleText += 'src: ' + newSrc + '}';\n exports.exchangeRule(cssRules, rule, newRuleText);\n};\n\n},{\"cssom\":26}],30:[function(require,module,exports){\n\"use strict\";\n\nvar util = require('./util'),\n inlineImage = require('./inlineImage'),\n inlineScript = require('./inlineScript'),\n inlineCss = require('./inlineCss'),\n cssSupport = require('./cssSupport');\n\n\nvar getUrlBasePath = function (url) {\n return util.joinUrl(url, '.');\n};\n\nvar parameterHashFunction = function (params) {\n // HACK JSON.stringify is poor man's hashing;\n // same objects might not receive same result as key order is not guaranteed\n var a = params.map(function (param, idx) {\n // Only include options relevant for method\n if (idx === (params.length - 1)) {\n param = {\n // Two different HTML pages on the same path level have the same base path, but a different URL\n baseUrl: getUrlBasePath(param.baseUrl)\n };\n }\n return JSON.stringify(param);\n });\n return a;\n};\n\nvar memoizeFunctionOnCaching = function (func, options) {\n if ((options.cache !== false && options.cache !== 'none') && options.cacheBucket) {\n return util.memoize(func, parameterHashFunction, options.cacheBucket);\n } else {\n return func;\n }\n};\n\n/* Style inlining */\n\nvar requestExternalsForStylesheet = function (styleContent, alreadyLoadedCssUrls, options) {\n var cssRules = cssSupport.rulesForCssText(styleContent);\n\n return inlineCss.loadCSSImportsForRules(cssRules, alreadyLoadedCssUrls, options).then(function (cssImportResult) {\n return inlineCss.loadAndInlineCSSResourcesForRules(cssRules, options).then(function (cssResourcesResult) {\n var errors = cssImportResult.errors.concat(cssResourcesResult.errors),\n hasChanges = cssImportResult.hasChanges || cssResourcesResult.hasChanges;\n\n if (hasChanges) {\n styleContent = cssSupport.cssRulesToText(cssRules);\n }\n\n return {\n hasChanges: hasChanges,\n content: styleContent,\n errors: errors\n };\n });\n });\n};\n\nvar loadAndInlineCssForStyle = function (style, options, alreadyLoadedCssUrls) {\n var styleContent = style.textContent,\n processExternals = memoizeFunctionOnCaching(requestExternalsForStylesheet, options);\n\n return processExternals(styleContent, alreadyLoadedCssUrls, options).then(function (result) {\n if (result.hasChanges) {\n style.childNodes[0].nodeValue = result.content;\n }\n\n return util.cloneArray(result.errors);\n });\n};\n\nvar getCssStyleElements = function (doc) {\n var styles = doc.getElementsByTagName(\"style\");\n\n return Array.prototype.filter.call(styles, function (style) {\n return !style.attributes.type || style.attributes.type.value === \"text/css\";\n });\n};\n\nexports.loadAndInlineStyles = function (doc, options) {\n var styles = getCssStyleElements(doc),\n allErrors = [],\n alreadyLoadedCssUrls = [],\n inlineOptions;\n\n inlineOptions = util.clone(options);\n inlineOptions.baseUrl = inlineOptions.baseUrl || util.getDocumentBaseUrl(doc);\n\n return util.all(styles.map(function (style) {\n return loadAndInlineCssForStyle(style, inlineOptions, alreadyLoadedCssUrls).then(function (errors) {\n allErrors = allErrors.concat(errors);\n });\n })).then(function () {\n return allErrors;\n });\n};\n\n/* CSS link inlining */\n\nvar substituteLinkWithInlineStyle = function (oldLinkNode, styleContent) {\n var parent = oldLinkNode.parentNode,\n styleNode;\n\n styleContent = styleContent.trim();\n if (styleContent) {\n styleNode = oldLinkNode.ownerDocument.createElement(\"style\");\n styleNode.type = \"text/css\";\n styleNode.appendChild(oldLinkNode.ownerDocument.createTextNode(styleContent));\n\n parent.insertBefore(styleNode, oldLinkNode);\n }\n\n parent.removeChild(oldLinkNode);\n};\n\nvar requestStylesheetAndInlineResources = function (url, options) {\n return util.ajax(url, options)\n .then(function (content) {\n var cssRules = cssSupport.rulesForCssText(content);\n\n return {\n content: content,\n cssRules: cssRules\n };\n })\n .then(function (result) {\n var hasChangesFromPathAdjustment = inlineCss.adjustPathsOfCssResources(url, result.cssRules);\n\n return {\n content: result.content,\n cssRules: result.cssRules,\n hasChanges: hasChangesFromPathAdjustment\n };\n })\n .then(function (result) {\n return inlineCss.loadCSSImportsForRules(result.cssRules, [], options)\n .then(function (cssImportResult) {\n return {\n content: result.content,\n cssRules: result.cssRules,\n hasChanges: result.hasChanges || cssImportResult.hasChanges,\n errors: cssImportResult.errors\n };\n });\n })\n .then(function (result) {\n return inlineCss.loadAndInlineCSSResourcesForRules(result.cssRules, options)\n .then(function (cssResourcesResult) {\n return {\n content: result.content,\n cssRules: result.cssRules,\n hasChanges: result.hasChanges || cssResourcesResult.hasChanges,\n errors: result.errors.concat(cssResourcesResult.errors)\n };\n });\n })\n .then(function (result) {\n var content = result.content;\n if (result.hasChanges) {\n content = cssSupport.cssRulesToText(result.cssRules);\n }\n return {\n content: content,\n errors: result.errors\n };\n });\n};\n\nvar loadLinkedCSS = function (link, options) {\n var cssHref = link.attributes.href.value,\n documentBaseUrl = util.getDocumentBaseUrl(link.ownerDocument),\n ajaxOptions = util.clone(options);\n\n if (!ajaxOptions.baseUrl && documentBaseUrl) {\n ajaxOptions.baseUrl = documentBaseUrl;\n }\n\n var processStylesheet = memoizeFunctionOnCaching(requestStylesheetAndInlineResources, options);\n\n return processStylesheet(cssHref, ajaxOptions).then(function (result) {\n return {\n content: result.content,\n errors: util.cloneArray(result.errors)\n };\n });\n};\n\nvar getCssStylesheetLinks = function (doc) {\n var links = doc.getElementsByTagName(\"link\");\n\n return Array.prototype.filter.call(links, function (link) {\n return link.attributes.rel && link.attributes.rel.value === \"stylesheet\" &&\n (!link.attributes.type || link.attributes.type.value === \"text/css\");\n });\n};\n\nexports.loadAndInlineCssLinks = function (doc, options) {\n var links = getCssStylesheetLinks(doc),\n errors = [];\n\n return util.all(links.map(function (link) {\n return loadLinkedCSS(link, options).then(function(result) {\n substituteLinkWithInlineStyle(link, result.content + \"\\n\");\n\n errors = errors.concat(result.errors);\n }, function (e) {\n errors.push({\n resourceType: \"stylesheet\",\n url: e.url,\n msg: \"Unable to load stylesheet \" + e.url\n });\n });\n })).then(function () {\n return errors;\n });\n};\n\n/* Main */\n\nexports.loadAndInlineImages = inlineImage.inline;\nexports.loadAndInlineScript = inlineScript.inline;\n\nexports.inlineReferences = function (doc, options) {\n var allErrors = [],\n inlineFuncs = [\n exports.loadAndInlineImages,\n exports.loadAndInlineStyles,\n exports.loadAndInlineCssLinks];\n\n if (options.inlineScripts !== false) {\n inlineFuncs.push(exports.loadAndInlineScript);\n }\n\n return util.all(inlineFuncs.map(function (func) {\n return func(doc, options)\n .then(function (errors) {\n allErrors = allErrors.concat(errors);\n });\n })).then(function () {\n return allErrors;\n });\n};\n\n},{\"./cssSupport\":29,\"./inlineCss\":31,\"./inlineImage\":32,\"./inlineScript\":33,\"./util\":34}],31:[function(require,module,exports){\n\"use strict\";\n\nvar ayepromise = require('ayepromise'),\n util = require('./util'),\n cssSupport = require('./cssSupport'),\n backgroundValueParser = require('./backgroundValueParser'),\n fontFaceSrcValueParser = require('css-font-face-src');\n\n\nvar updateCssPropertyValue = function (rule, property, value) {\n rule.style.setProperty(property, value, rule.style.getPropertyPriority(property));\n};\n\nvar findBackgroundImageRules = function (cssRules) {\n return cssRules.filter(function (rule) {\n return rule.type === window.CSSRule.STYLE_RULE && (rule.style.getPropertyValue('background-image') || rule.style.getPropertyValue('background'));\n });\n};\n\nvar findBackgroundDeclarations = function (rules) {\n var backgroundDeclarations = [];\n\n rules.forEach(function (rule) {\n if (rule.style.getPropertyValue('background-image')) {\n backgroundDeclarations.push({\n property: 'background-image',\n value: rule.style.getPropertyValue('background-image'),\n rule: rule\n });\n } else if (rule.style.getPropertyValue('background')) {\n backgroundDeclarations.push({\n property: 'background',\n value: rule.style.getPropertyValue('background'),\n rule: rule\n });\n }\n });\n\n return backgroundDeclarations;\n};\n\nvar findFontFaceRules = function (cssRules) {\n return cssRules.filter(function (rule) {\n return rule.type === window.CSSRule.FONT_FACE_RULE && rule.style.getPropertyValue(\"src\");\n });\n};\n\nvar findCSSImportRules = function (cssRules) {\n return cssRules.filter(function (rule) {\n return rule.type === window.CSSRule.IMPORT_RULE && rule.href;\n });\n};\n\nvar findExternalBackgroundUrls = function (parsedBackground) {\n var matchIndices = [];\n\n parsedBackground.forEach(function (backgroundLayer, i) {\n if (backgroundLayer.url && !util.isDataUri(backgroundLayer.url)) {\n matchIndices.push(i);\n }\n });\n\n return matchIndices;\n};\n\nvar findExternalFontFaceUrls = function (parsedFontFaceSources) {\n var sourceIndices = [];\n parsedFontFaceSources.forEach(function (sourceItem, i) {\n if (sourceItem.url && !util.isDataUri(sourceItem.url)) {\n sourceIndices.push(i);\n }\n });\n return sourceIndices;\n};\n\nexports.adjustPathsOfCssResources = function (baseUrl, cssRules) {\n var backgroundRules = findBackgroundImageRules(cssRules),\n backgroundDeclarations = findBackgroundDeclarations(backgroundRules),\n change = false;\n\n backgroundDeclarations.forEach(function (declaration) {\n var parsedBackground = backgroundValueParser.parse(declaration.value),\n externalBackgroundIndices = findExternalBackgroundUrls(parsedBackground),\n backgroundValue;\n\n if (externalBackgroundIndices.length > 0) {\n externalBackgroundIndices.forEach(function (backgroundLayerIndex) {\n var relativeUrl = parsedBackground[backgroundLayerIndex].url,\n url = util.joinUrl(baseUrl, relativeUrl);\n parsedBackground[backgroundLayerIndex].url = url;\n });\n\n backgroundValue = backgroundValueParser.serialize(parsedBackground);\n\n updateCssPropertyValue(declaration.rule, declaration.property, backgroundValue);\n\n change = true;\n }\n });\n findFontFaceRules(cssRules).forEach(function (rule) {\n var fontFaceSrcDeclaration = rule.style.getPropertyValue(\"src\"),\n parsedFontFaceSources, externalFontFaceUrlIndices;\n\n try {\n parsedFontFaceSources = fontFaceSrcValueParser.parse(fontFaceSrcDeclaration);\n } catch (e) {\n return;\n }\n externalFontFaceUrlIndices = findExternalFontFaceUrls(parsedFontFaceSources);\n\n if (externalFontFaceUrlIndices.length > 0) {\n externalFontFaceUrlIndices.forEach(function (fontFaceUrlIndex) {\n var relativeUrl = parsedFontFaceSources[fontFaceUrlIndex].url,\n url = util.joinUrl(baseUrl, relativeUrl);\n\n parsedFontFaceSources[fontFaceUrlIndex].url = url;\n });\n\n cssSupport.changeFontFaceRuleSrc(cssRules, rule, fontFaceSrcValueParser.serialize(parsedFontFaceSources));\n\n change = true;\n }\n });\n findCSSImportRules(cssRules).forEach(function (rule) {\n var cssUrl = rule.href,\n url = util.joinUrl(baseUrl, cssUrl);\n\n cssSupport.exchangeRule(cssRules, rule, \"@import url(\" + url + \");\");\n\n change = true;\n });\n\n return change;\n};\n\n/* CSS import inlining */\n\nvar substituteRule = function (cssRules, rule, newCssRules) {\n var position = cssRules.indexOf(rule);\n\n cssRules.splice(position, 1);\n\n newCssRules.forEach(function (newRule, i) {\n cssRules.splice(position + i, 0, newRule);\n });\n};\n\nvar fulfilledPromise = function (value) {\n var defer = ayepromise.defer();\n defer.resolve(value);\n return defer.promise;\n};\n\nvar loadAndInlineCSSImport = function (cssRules, rule, alreadyLoadedCssUrls, options) {\n var url = rule.href,\n cssHrefRelativeToDoc;\n\n url = cssSupport.unquoteString(url);\n\n cssHrefRelativeToDoc = util.joinUrl(options.baseUrl, url);\n\n if (alreadyLoadedCssUrls.indexOf(cssHrefRelativeToDoc) >= 0) {\n // Remove URL by adding empty string\n substituteRule(cssRules, rule, []);\n return fulfilledPromise([]);\n } else {\n alreadyLoadedCssUrls.push(cssHrefRelativeToDoc);\n }\n\n return util.ajax(url, options)\n .then(function (cssText) {\n var externalCssRules = cssSupport.rulesForCssText(cssText);\n\n // Recursively follow @import statements\n return exports.loadCSSImportsForRules(externalCssRules, alreadyLoadedCssUrls, options)\n .then(function (result) {\n exports.adjustPathsOfCssResources(url, externalCssRules);\n\n substituteRule(cssRules, rule, externalCssRules);\n\n return result.errors;\n });\n }, function (e) {\n throw {\n resourceType: \"stylesheet\",\n url: e.url,\n msg: \"Unable to load stylesheet \" + e.url\n };\n });\n};\n\nexports.loadCSSImportsForRules = function (cssRules, alreadyLoadedCssUrls, options) {\n var rulesToInline = findCSSImportRules(cssRules),\n errors = [],\n hasChanges = false;\n\n return util.all(rulesToInline.map(function (rule) {\n return loadAndInlineCSSImport(cssRules, rule, alreadyLoadedCssUrls, options).then(function (moreErrors) {\n errors = errors.concat(moreErrors);\n\n hasChanges = true;\n }, function (e) {\n errors.push(e);\n });\n })).then(function () {\n return {\n hasChanges: hasChanges,\n errors: errors\n };\n });\n};\n\n/* CSS linked resource inlining */\n\nvar loadAndInlineBackgroundImages = function (backgroundValue, options) {\n var parsedBackground = backgroundValueParser.parse(backgroundValue),\n externalBackgroundLayerIndices = findExternalBackgroundUrls(parsedBackground),\n hasChanges = false;\n\n return util.collectAndReportErrors(externalBackgroundLayerIndices.map(function (backgroundLayerIndex) {\n var url = parsedBackground[backgroundLayerIndex].url;\n\n return util.getDataURIForImageURL(url, options)\n .then(function (dataURI) {\n parsedBackground[backgroundLayerIndex].url = dataURI;\n\n hasChanges = true;\n }, function (e) {\n throw {\n resourceType: \"backgroundImage\",\n url: e.url,\n msg: \"Unable to load background-image \" + e.url\n };\n });\n })).then(function (errors) {\n return {\n backgroundValue: backgroundValueParser.serialize(parsedBackground),\n hasChanges: hasChanges,\n errors: errors\n };\n });\n};\n\nvar iterateOverRulesAndInlineBackgroundImages = function (cssRules, options) {\n var rulesToInline = findBackgroundImageRules(cssRules),\n backgroundDeclarations = findBackgroundDeclarations(rulesToInline),\n errors = [],\n cssHasChanges = false;\n\n return util.all(backgroundDeclarations.map(function (declaration) {\n return loadAndInlineBackgroundImages(declaration.value, options)\n .then(function (result) {\n if (result.hasChanges) {\n updateCssPropertyValue(declaration.rule, declaration.property, result.backgroundValue);\n\n cssHasChanges = true;\n }\n\n errors = errors.concat(result.errors);\n });\n })).then(function () {\n return {\n hasChanges: cssHasChanges,\n errors: errors\n };\n });\n};\n\nvar loadAndInlineFontFace = function (srcDeclarationValue, options) {\n var hasChanges = false,\n parsedFontFaceSources, externalFontFaceUrlIndices;\n\n try {\n parsedFontFaceSources = fontFaceSrcValueParser.parse(srcDeclarationValue);\n } catch (e) {\n parsedFontFaceSources = [];\n }\n externalFontFaceUrlIndices = findExternalFontFaceUrls(parsedFontFaceSources);\n\n return util.collectAndReportErrors(externalFontFaceUrlIndices.map(function (urlIndex) {\n var fontSrc = parsedFontFaceSources[urlIndex],\n format = fontSrc.format || \"woff\";\n\n return util.binaryAjax(fontSrc.url, options)\n .then(function (content) {\n var base64Content = btoa(content);\n fontSrc.url = 'data:font/' + format + ';base64,' + base64Content;\n\n hasChanges = true;\n }, function (e) {\n throw {\n resourceType: \"fontFace\",\n url: e.url,\n msg: \"Unable to load font-face \" + e.url\n };\n });\n })).then(function (errors) {\n return {\n srcDeclarationValue: fontFaceSrcValueParser.serialize(parsedFontFaceSources),\n hasChanges: hasChanges,\n errors: errors\n };\n });\n};\n\nvar iterateOverRulesAndInlineFontFace = function (cssRules, options) {\n var rulesToInline = findFontFaceRules(cssRules),\n errors = [],\n hasChanges = false;\n\n return util.all(rulesToInline.map(function (rule) {\n var srcDeclarationValue = rule.style.getPropertyValue(\"src\");\n\n return loadAndInlineFontFace(srcDeclarationValue, options).then(function (result) {\n if (result.hasChanges) {\n cssSupport.changeFontFaceRuleSrc(cssRules, rule, result.srcDeclarationValue);\n\n hasChanges = true;\n }\n\n errors = errors.concat(result.errors);\n });\n })).then(function () {\n return {\n hasChanges: hasChanges,\n errors: errors\n };\n });\n};\n\nexports.loadAndInlineCSSResourcesForRules = function (cssRules, options) {\n var hasChanges = false,\n errors = [];\n\n return util.all([iterateOverRulesAndInlineBackgroundImages, iterateOverRulesAndInlineFontFace].map(function (func) {\n return func(cssRules, options)\n .then(function (result) {\n hasChanges = hasChanges || result.hasChanges;\n errors = errors.concat(result.errors);\n });\n })).then(function () {\n return {\n hasChanges: hasChanges,\n errors: errors\n };\n });\n};\n\n},{\"./backgroundValueParser\":28,\"./cssSupport\":29,\"./util\":34,\"ayepromise\":2,\"css-font-face-src\":6}],32:[function(require,module,exports){\n\"use strict\";\n\nvar util = require('./util');\n\n\nvar encodeImageAsDataURI = function (image, options) {\n var url = null;\n if(image.hasAttribute('src')){\n url = image.getAttribute('src');\n }\n else if(image.hasAttributeNS('http://www.w3.org/1999/xlink','href')){\n url = image.getAttributeNS('http://www.w3.org/1999/xlink','href');\n }\n else if(image.hasAttribute('href')){\n url = image.getAttribute('href');\n }\n var documentBase = util.getDocumentBaseUrl(image.ownerDocument),\n ajaxOptions = util.clone(options);\n\n if (!ajaxOptions.baseUrl && documentBase) {\n ajaxOptions.baseUrl = documentBase;\n }\n\n return util.getDataURIForImageURL(url, ajaxOptions)\n .then(function (dataURI) {\n return dataURI;\n }, function (e) {\n throw {\n resourceType: \"image\",\n url: e.url,\n msg: \"Unable to load image \" + e.url\n };\n });\n};\n\nvar filterExternalImages = function (images) {\n return images.filter(function (image) {\n var url = null;\n if(image.hasAttribute('src')){\n url = image.getAttribute('src');\n }\n else if(image.hasAttributeNS('http://www.w3.org/1999/xlink','href')){\n url = image.getAttributeNS('http://www.w3.org/1999/xlink','href');\n }\n else if(image.hasAttribute('href')){\n url = image.getAttribute('href');\n }\n\n return url !== null && !util.isDataUri(url);\n });\n};\n\nvar filterInputsForImageType = function (inputs) {\n return Array.prototype.filter.call(inputs, function (input) {\n return input.type === \"image\";\n });\n};\n\nvar toArray = function (arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n};\n\nexports.inline = function (doc, options) {\n var images = toArray(doc.getElementsByTagName(\"img\")),\n svgImages = toArray(doc.getElementsByTagName(\"image\")),\n imageInputs = filterInputsForImageType(doc.getElementsByTagName(\"input\"));\n\n images = images.concat(svgImages);\n images = images.concat(imageInputs);\n var externalImages = filterExternalImages(images);\n\n return util.collectAndReportErrors(externalImages.map(function (image) {\n return encodeImageAsDataURI(image, options).then(function (dataURI) {\n if(!!image.attributes.src){\n image.attributes.src.value = dataURI;\n }\n else if(!!image.attributes['xlink:href']){\n image.attributes['xlink:href'].value = dataURI;\n }\n else if(!!image.attributes.href){\n image.attributes.href.value = dataURI;\n }\n });\n }));\n};\n\n},{\"./util\":34}],33:[function(require,module,exports){\n\"use strict\";\n\nvar util = require('./util');\n\n\nvar loadLinkedScript = function (script, options) {\n var src = script.attributes.src.value,\n documentBase = util.getDocumentBaseUrl(script.ownerDocument),\n ajaxOptions = util.clone(options);\n\n if (!ajaxOptions.baseUrl && documentBase) {\n ajaxOptions.baseUrl = documentBase;\n }\n\n return util.ajax(src, ajaxOptions)\n .fail(function (e) {\n throw {\n resourceType: \"script\",\n url: e.url,\n msg: \"Unable to load script \" + e.url\n };\n });\n};\n\nvar escapeClosingTags = function (text) {\n // http://stackoverflow.com/questions/9246382/escaping-script-tag-inside-javascript\n return text.replace(/<\\//g, '<\\\\/');\n};\n\nvar substituteExternalScriptWithInline = function (scriptNode, jsCode) {\n scriptNode.attributes.removeNamedItem('src');\n scriptNode.textContent = escapeClosingTags(jsCode);\n};\n\nvar getScripts = function (doc) {\n var scripts = doc.getElementsByTagName(\"script\");\n\n return Array.prototype.filter.call(scripts, function (script) {\n return !!script.attributes.src;\n });\n};\n\nexports.inline = function (doc, options) {\n var scripts = getScripts(doc);\n\n return util.collectAndReportErrors(scripts.map(function (script) {\n return loadLinkedScript(script, options).then(function (jsCode) {\n substituteExternalScriptWithInline(script, jsCode);\n });\n }));\n};\n\n},{\"./util\":34}],34:[function(require,module,exports){\n\"use strict\";\n\nvar url = require('url'),\n ayepromise = require('ayepromise');\n\n\nexports.getDocumentBaseUrl = function (doc) {\n if (doc.baseURI !== 'about:blank') {\n return doc.baseURI;\n }\n\n return null;\n};\n\nexports.clone = function (object) {\n var theClone = {},\n i;\n for (i in object) {\n if (object.hasOwnProperty(i)) {\n theClone[i] = object[i];\n }\n }\n return theClone;\n};\n\nexports.cloneArray = function (nodeList) {\n return Array.prototype.slice.apply(nodeList, [0]);\n};\n\nexports.joinUrl = function (baseUrl, relUrl) {\n if (!baseUrl) {\n return relUrl;\n }\n return url.resolve(baseUrl, relUrl);\n};\n\nexports.isDataUri = function (url) {\n return (/^data:/).test(url);\n};\n\nexports.all = function (promises) {\n var defer = ayepromise.defer(),\n pendingPromiseCount = promises.length,\n resolvedValues = [];\n\n if (promises.length === 0) {\n defer.resolve([]);\n return defer.promise;\n }\n\n promises.forEach(function (promise, idx) {\n promise.then(function (value) {\n pendingPromiseCount -= 1;\n resolvedValues[idx] = value;\n\n if (pendingPromiseCount === 0) {\n defer.resolve(resolvedValues);\n }\n }, function (e) {\n defer.reject(e);\n });\n });\n return defer.promise;\n};\n\nexports.collectAndReportErrors = function (promises) {\n var errors = [];\n\n return exports.all(promises.map(function (promise) {\n return promise.fail(function (e) {\n errors.push(e);\n });\n })).then(function () {\n return errors;\n });\n};\n\nvar lastCacheDate = null;\n\nvar getUncachableURL = function (url, cache) {\n if (cache === false || cache === 'none' || cache === 'repeated') {\n if (lastCacheDate === null || cache !== 'repeated') {\n lastCacheDate = Date.now();\n }\n return url + \"?_=\" + lastCacheDate;\n } else {\n return url;\n }\n};\n\nexports.ajax = function (url, options) {\n var ajaxRequest = new window.XMLHttpRequest(),\n defer = ayepromise.defer(),\n joinedUrl = exports.joinUrl(options.baseUrl, url),\n augmentedUrl;\n\n var doReject = function () {\n defer.reject({\n msg: 'Unable to load url',\n url: joinedUrl\n });\n };\n\n augmentedUrl = getUncachableURL(joinedUrl, options.cache);\n\n ajaxRequest.addEventListener(\"load\", function () {\n if (ajaxRequest.status === 200 || ajaxRequest.status === 0) {\n defer.resolve(ajaxRequest.response);\n } else {\n doReject();\n }\n }, false);\n\n ajaxRequest.addEventListener(\"error\", doReject, false);\n\n try {\n ajaxRequest.open('GET', augmentedUrl, true);\n ajaxRequest.overrideMimeType(options.mimeType);\n ajaxRequest.send(null);\n } catch (e) {\n doReject();\n }\n\n return defer.promise;\n};\n\nexports.binaryAjax = function (url, options) {\n var ajaxOptions = exports.clone(options);\n\n ajaxOptions.mimeType = 'text/plain; charset=x-user-defined';\n\n return exports.ajax(url, ajaxOptions)\n .then(function (content) {\n var binaryContent = \"\";\n\n for (var i = 0; i < content.length; i++) {\n binaryContent += String.fromCharCode(content.charCodeAt(i) & 0xFF);\n }\n\n return binaryContent;\n });\n};\n\nvar detectMimeType = function (content) {\n var startsWith = function (string, substring) {\n return string.substring(0, substring.length) === substring;\n };\n\n if (startsWith(content, '<?xml') || startsWith(content, '<svg')) {\n return 'image/svg+xml';\n }\n return 'image/png';\n};\n\nexports.getDataURIForImageURL = function (url, options) {\n return exports.binaryAjax(url, options)\n .then(function (content) {\n var base64Content = btoa(content),\n mimeType = detectMimeType(content);\n\n return 'data:' + mimeType + ';base64,' + base64Content;\n });\n};\n\nvar uniqueIdList = [];\n\nvar constantUniqueIdFor = function (element) {\n // HACK, using a list results in O(n), but how do we hash a function?\n if (uniqueIdList.indexOf(element) < 0) {\n uniqueIdList.push(element);\n }\n return uniqueIdList.indexOf(element);\n};\n\nexports.memoize = function (func, hasher, memo) {\n if (typeof memo !== \"object\") {\n throw new Error(\"cacheBucket is not an object\");\n }\n\n return function () {\n var args = Array.prototype.slice.call(arguments);\n\n var argumentHash = hasher(args),\n funcHash = constantUniqueIdFor(func),\n retValue;\n\n if (memo[funcHash] && memo[funcHash][argumentHash]) {\n return memo[funcHash][argumentHash];\n } else {\n retValue = func.apply(null, args);\n\n memo[funcHash] = memo[funcHash] || {};\n memo[funcHash][argumentHash] = retValue;\n\n return retValue;\n }\n };\n};\n\n},{\"ayepromise\":2,\"url\":3}],35:[function(require,module,exports){\n(function (global){\n/*! https://mths.be/punycode v1.3.2 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * http://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.3.2',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],36:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n},{}],37:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n\n},{}],38:[function(require,module,exports){\n'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n},{\"./decode\":36,\"./encode\":37}],39:[function(require,module,exports){\n/*! rasterizeHTML.js - v1.2.4 - 2016-10-30\n* http://www.github.com/cburgmer/rasterizeHTML.js\n* Copyright (c) 2016 Christoph Burgmer; Licensed MIT */\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module unless amdModuleId is set\n define([\"url\",\"css-mediaquery\",\"xmlserializer\",\"sane-domparser-error\",\"ayepromise\",\"inlineresources\"], function (a0,b1,c2,d3,e4,f5) {\n return (root['rasterizeHTML'] = factory(a0,b1,c2,d3,e4,f5));\n });\n } else if (typeof exports === 'object') {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(require(\"url\"),require(\"css-mediaquery\"),require(\"xmlserializer\"),require(\"sane-domparser-error\"),require(\"ayepromise\"),require(\"inlineresources\"));\n } else {\n root['rasterizeHTML'] = factory(root[\"url\"],root[\"cssMediaQuery\"],root[\"xmlserializer\"],root[\"sanedomparsererror\"],root[\"ayepromise\"],root[\"inlineresources\"]);\n }\n}(this, function (url, cssMediaQuery, xmlserializer, sanedomparsererror, ayepromise, inlineresources) {\n\nvar util = (function (url) {\n \"use strict\";\n\n var module = {};\n\n var uniqueIdList = [];\n\n module.joinUrl = function (baseUrl, relUrl) {\n if (!baseUrl) {\n return relUrl;\n }\n return url.resolve(baseUrl, relUrl);\n };\n\n module.getConstantUniqueIdFor = function (element) {\n // HACK, using a list results in O(n), but how do we hash e.g. a DOM node?\n if (uniqueIdList.indexOf(element) < 0) {\n uniqueIdList.push(element);\n }\n return uniqueIdList.indexOf(element);\n };\n\n module.clone = function (object) {\n var theClone = {},\n i;\n for (i in object) {\n if (object.hasOwnProperty(i)) {\n theClone[i] = object[i];\n }\n }\n return theClone;\n };\n\n var isObject = function (obj) {\n return typeof obj === \"object\" && obj !== null;\n };\n\n var isCanvas = function (obj) {\n return isObject(obj) &&\n Object.prototype.toString.apply(obj).match(/\\[object (Canvas|HTMLCanvasElement)\\]/i);\n };\n\n // args: canvas, options\n module.parseOptionalParameters = function (args) {\n var parameters = {\n canvas: null,\n options: {}\n };\n\n if (args[0] == null || isCanvas(args[0])) {\n parameters.canvas = args[0] || null;\n\n parameters.options = module.clone(args[1]);\n } else {\n parameters.options = module.clone(args[0]);\n }\n\n return parameters;\n };\n\n return module;\n}(url));\n\n// Proxy objects by monkey patching\nvar proxies = (function (util, ayepromise) {\n \"use strict\";\n\n var module = {};\n\n var monkeyPatchInstanceMethod = function (object, methodName, proxyFunc) {\n var originalFunc = object[methodName];\n\n object[methodName] = function () {\n var args = Array.prototype.slice.call(arguments);\n\n return proxyFunc.apply(this, [args, originalFunc]);\n };\n\n return originalFunc;\n };\n\n // Bases all XHR calls on the given base URL\n module.baseUrlRespectingXhr = function (XHRObject, baseUrl) {\n var xhrConstructor = function () {\n var xhr = new XHRObject();\n\n monkeyPatchInstanceMethod(xhr, 'open', function (args, originalOpen) {\n var method = args.shift(),\n url = args.shift(),\n joinedUrl = util.joinUrl(baseUrl, url);\n\n return originalOpen.apply(this, [method, joinedUrl].concat(args));\n });\n\n return xhr;\n };\n\n return xhrConstructor;\n };\n\n // Provides a convenient way of being notified when all pending XHR calls are finished\n module.finishNotifyingXhr = function (XHRObject) {\n var totalXhrCount = 0,\n doneXhrCount = 0,\n waitingForPendingToClose = false,\n defer = ayepromise.defer();\n\n var checkAllRequestsFinished = function () {\n var pendingXhrCount = totalXhrCount - doneXhrCount;\n\n if (pendingXhrCount <= 0 && waitingForPendingToClose) {\n defer.resolve({totalCount: totalXhrCount});\n }\n };\n\n var xhrConstructor = function () {\n var xhr = new XHRObject();\n\n monkeyPatchInstanceMethod(xhr, 'send', function (_, originalSend) {\n totalXhrCount += 1;\n return originalSend.apply(this, arguments);\n });\n\n xhr.addEventListener('load', function () {\n doneXhrCount += 1;\n\n checkAllRequestsFinished();\n });\n\n return xhr;\n };\n\n xhrConstructor.waitForRequestsToFinish = function () {\n waitingForPendingToClose = true;\n checkAllRequestsFinished();\n return defer.promise;\n };\n\n return xhrConstructor;\n };\n\n return module;\n}(util, ayepromise));\n\nvar documentUtil = (function () {\n \"use strict\";\n\n var module = {};\n\n var asArray = function (arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n };\n\n module.addClassName = function (element, className) {\n element.className += ' ' + className;\n };\n\n module.addClassNameRecursively = function (element, className) {\n module.addClassName(element, className);\n\n if (element.parentNode !== element.ownerDocument) {\n module.addClassNameRecursively(element.parentNode, className);\n }\n };\n\n var changeCssRule = function (rule, newRuleText) {\n var styleSheet = rule.parentStyleSheet,\n ruleIdx = asArray(styleSheet.cssRules).indexOf(rule);\n\n // Exchange rule with the new text\n styleSheet.insertRule(newRuleText, ruleIdx+1);\n styleSheet.deleteRule(ruleIdx);\n };\n\n var updateRuleSelector = function (rule, updatedSelector) {\n var styleDefinitions = rule.cssText.replace(/^[^\\{]+/, ''),\n newRule = updatedSelector + ' ' + styleDefinitions;\n\n changeCssRule(rule, newRule);\n };\n\n var cssRulesToText = function (cssRules) {\n return asArray(cssRules).reduce(function (cssText, rule) {\n return cssText + rule.cssText;\n }, '');\n };\n\n var rewriteStyleContent = function (styleElement) {\n styleElement.textContent = cssRulesToText(styleElement.sheet.cssRules);\n };\n\n var addSheetPropertyToSvgStyleElement = function (svgStyleElement) {\n var doc = document.implementation.createHTMLDocument(''),\n cssStyleElement = document.createElement('style');\n\n cssStyleElement.textContent = svgStyleElement.textContent;\n // the style will only be parsed once it is added to a document\n doc.body.appendChild(cssStyleElement);\n\n svgStyleElement.sheet = cssStyleElement.sheet;\n };\n\n var matchingSimpleSelectorsRegex = function (simpleSelectorList) {\n return '(' +\n '(?:^|[^.#:\\\\w])' + // start of string or not a simple selector character,\n '|' + // ... or ...\n '(?=\\\\W)' + // the next character parsed is not an alphabetic character (and thus a natural boundary)\n ')' +\n '(' +\n simpleSelectorList.join('|') + // one out of the given simple selectors\n ')' +\n '(?=\\\\W|$)'; // followed either by a non-alphabetic character or the end of the string\n };\n\n var replaceSimpleSelectorsBy = function (element, simpleSelectorList, caseInsensitiveReplaceFunc) {\n var selectorRegex = matchingSimpleSelectorsRegex(simpleSelectorList);\n\n asArray(element.querySelectorAll('style')).forEach(function (styleElement) {\n // SVGStyleElement doesn't have a property sheet in Safari, we need some workaround here\n // more details can be found here: https://github.com/cburgmer/rasterizeHTML.js/issues/158\n if (typeof styleElement.sheet === 'undefined') {\n addSheetPropertyToSvgStyleElement(styleElement);\n }\n\n var matchingRules = asArray(styleElement.sheet.cssRules).filter(function (rule) {\n return rule.selectorText && new RegExp(selectorRegex, 'i').test(rule.selectorText);\n });\n\n if (matchingRules.length) {\n matchingRules.forEach(function (rule) {\n var newSelector = rule.selectorText.replace(new RegExp(selectorRegex, 'gi'),\n function (_, prefixMatch, selectorMatch) {\n return prefixMatch + caseInsensitiveReplaceFunc(selectorMatch);\n });\n\n if (newSelector !== rule.selectorText) {\n updateRuleSelector(rule, newSelector);\n }\n });\n\n rewriteStyleContent(styleElement);\n }\n });\n };\n\n module.rewriteCssSelectorWith = function (element, oldSelector, newSelector) {\n replaceSimpleSelectorsBy(element, [oldSelector], function () {\n return newSelector;\n });\n };\n\n module.lowercaseCssTypeSelectors = function (element, matchingTagNames) {\n replaceSimpleSelectorsBy(element, matchingTagNames, function (match) {\n return match.toLowerCase();\n });\n };\n\n module.findHtmlOnlyNodeNames = function (element) {\n var treeWalker = element.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_ELEMENT),\n htmlNodeNames = {},\n nonHtmlNodeNames = {},\n currentTagName;\n\n do {\n currentTagName = treeWalker.currentNode.tagName.toLowerCase();\n if (treeWalker.currentNode.namespaceURI === 'http://www.w3.org/1999/xhtml') {\n htmlNodeNames[currentTagName] = true;\n } else {\n nonHtmlNodeNames[currentTagName] = true;\n }\n } while(treeWalker.nextNode());\n\n return Object.keys(htmlNodeNames).filter(function (tagName) {\n return !nonHtmlNodeNames[tagName];\n });\n };\n\n return module;\n}());\n\nvar documentHelper = (function (documentUtil) {\n \"use strict\";\n\n var module = {};\n\n var asArray = function (arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n };\n\n var cascadingAction = {\n active: true,\n hover: true,\n focus: false,\n target: false\n };\n\n module.fakeUserAction = function (element, selector, action) {\n var elem = element.querySelector(selector),\n pseudoClass = ':' + action,\n fakeActionClass = 'rasterizehtml' + action;\n if (! elem) {\n return;\n }\n\n if (cascadingAction[action]) {\n documentUtil.addClassNameRecursively(elem, fakeActionClass);\n } else {\n documentUtil.addClassName(elem, fakeActionClass);\n }\n documentUtil.rewriteCssSelectorWith(element, pseudoClass, '.' + fakeActionClass);\n };\n\n module.persistInputValues = function (doc) {\n var inputs = doc.querySelectorAll('input'),\n textareas = doc.querySelectorAll('textarea'),\n isCheckable = function (input) {\n return input.type === 'checkbox' || input.type === 'radio';\n };\n\n asArray(inputs).filter(isCheckable)\n .forEach(function (input) {\n if (input.checked) {\n input.setAttribute('checked', '');\n } else {\n input.removeAttribute('checked');\n }\n });\n\n asArray(inputs).filter(function (input) { return !isCheckable(input); })\n .forEach(function (input) {\n input.setAttribute('value', input.value);\n });\n\n asArray(textareas)\n .forEach(function (textarea) {\n textarea.textContent = textarea.value;\n });\n };\n\n module.rewriteTagNameSelectorsToLowerCase = function (element) {\n documentUtil.lowercaseCssTypeSelectors(element, documentUtil.findHtmlOnlyNodeNames(element));\n };\n\n return module;\n}(documentUtil));\n\nvar mediaQueryHelper = (function (cssMediaQuery) {\n \"use strict\";\n\n var module = {};\n\n var svgImgBlueByEmMediaQuery = function () {\n var svg = '<svg id=\"svg\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\">' +\n '<style>@media (max-width: 1em) { svg { background: #00f; } }</style>' +\n '</svg>';\n\n var url = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(svg),\n img = document.createElement('img');\n\n img.src = url;\n\n return img;\n };\n\n var firstPixelHasColor = function (img, r, g, b) {\n var canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n\n var context = canvas.getContext(\"2d\"),\n data;\n\n context.drawImage(img, 0, 0);\n data = context.getImageData(0, 0, 1, 1).data;\n return data[0] === r && data[1] === g && data[2] === b;\n };\n\n var hasEmMediaQueryIssue = function () {\n var img = svgImgBlueByEmMediaQuery(),\n defer = ayepromise.defer();\n\n document.querySelector('body').appendChild(img);\n\n img.onload = function () {\n document.querySelector('body').removeChild(img);\n try {\n defer.resolve(!firstPixelHasColor(img, 0, 0, 255));\n } catch (e) {\n // Fails in PhantomJS, let's assume the issue exists\n defer.resolve(true);\n }\n };\n img.onerror = function () {\n defer.reject();\n };\n\n return defer.promise;\n };\n\n var hasEmIssue;\n\n module.needsEmWorkaround = function () {\n if (hasEmIssue === undefined) {\n hasEmIssue = hasEmMediaQueryIssue();\n }\n return hasEmIssue;\n };\n\n var asArray = function (arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n };\n\n var cssRulesToText = function (cssRules) {\n return asArray(cssRules).map(function (rule) {\n return rule.cssText;\n }).join('\\n');\n };\n\n var mediaQueryRule = function (mediaQuery, cssRules) {\n return '@media ' + mediaQuery + '{' +\n cssRulesToText(cssRules) +\n '}';\n };\n\n var exchangeRuleWithNewContent = function (styleSheet, ruleIdx, newRuleText) {\n try {\n styleSheet.insertRule(newRuleText, ruleIdx+1);\n } catch (e) {\n // In case the browser does not like our new rule we just keep the existing one and quietly leave\n return;\n }\n styleSheet.deleteRule(ruleIdx);\n };\n\n var changeCssRule = function (rule, newRuleText) {\n var styleSheet = rule.parentStyleSheet,\n ruleIdx = asArray(styleSheet.cssRules).indexOf(rule);\n\n exchangeRuleWithNewContent(styleSheet, ruleIdx, newRuleText);\n };\n\n var rewriteStyleContent = function (styleElement) {\n styleElement.textContent = cssRulesToText(styleElement.sheet.cssRules);\n };\n\n var serializeExpression = function (exp) {\n var feature = exp.modifier ? exp.modifier + '-' + exp.feature : exp.feature;\n if (exp.value) {\n return '(' + feature + ': ' + exp.value + ')';\n } else {\n return '(' + feature + ')';\n }\n };\n\n var serializeQueryPart = function (q) {\n var segments = [];\n\n if (q.inverse) {\n segments.push(\"not\");\n }\n\n segments.push(q.type);\n\n if (q.expressions.length > 0) {\n segments.push('and ' + q.expressions.map(serializeExpression).join(' and '));\n }\n\n return segments.join(' ');\n };\n\n // poor man's testability\n module.serializeQuery = function (q) {\n var queryParts = q.map(serializeQueryPart);\n return queryParts.join(', ');\n };\n\n var transformEmIntoPx = function (em) {\n return em * 16;\n };\n\n var replaceEmValueWithPx = function (value) {\n // Match a number with em unit. Doesn't match all, but should be enough for now\n var match = /^((?:\\d+\\.)?\\d+)em/.exec(value);\n if (match) {\n return transformEmIntoPx(parseFloat(match[1])) + 'px';\n }\n return value;\n };\n\n var substituteEmWithPx = function (mediaQuery) {\n var parsedQuery = cssMediaQuery.parse(mediaQuery),\n hasChanges = false;\n\n parsedQuery.forEach(function (q) {\n q.expressions.forEach(function (exp) {\n var rewrittenValue = replaceEmValueWithPx(exp.value);\n\n hasChanges |= rewrittenValue !== exp.value;\n exp.value = rewrittenValue;\n });\n });\n\n if (hasChanges) {\n return module.serializeQuery(parsedQuery);\n }\n };\n\n var replaceEmsWithPx = function (mediaQueryRules) {\n var anyRuleHasChanges = false;\n\n mediaQueryRules.forEach(function (rule) {\n var rewrittenMediaQuery = substituteEmWithPx(rule.media.mediaText);\n\n if (rewrittenMediaQuery) {\n changeCssRule(rule, mediaQueryRule(rewrittenMediaQuery, rule.cssRules));\n }\n\n anyRuleHasChanges |= !!rewrittenMediaQuery;\n });\n\n return anyRuleHasChanges;\n };\n\n module.workAroundWebKitEmSizeIssue = function (element) {\n var styles = element.querySelectorAll('style');\n\n asArray(styles).forEach(function (style) {\n var mediaQueryRules = asArray(style.sheet.cssRules).filter(function (rule) {\n return rule.type === window.CSSRule.MEDIA_RULE;\n });\n\n var hasChanges = replaceEmsWithPx(mediaQueryRules);\n if (hasChanges) {\n rewriteStyleContent(style);\n }\n });\n };\n\n return module;\n}(cssMediaQuery));\n\nvar browser = (function (util, proxies, ayepromise, sanedomparsererror, theWindow) {\n \"use strict\";\n\n var module = {};\n\n var createHiddenElement = function (doc, tagName, width, height) {\n var element = doc.createElement(tagName);\n // 'display: none' doesn't cut it, as browsers seem to be lazy loading CSS\n element.style.visibility = \"hidden\";\n element.style.width = width + \"px\";\n element.style.height = height + \"px\";\n element.style.position = \"absolute\";\n element.style.top = (-10000 - height) + \"px\";\n element.style.left = (-10000 - width) + \"px\";\n // We need to add the element to the document so that its content gets loaded\n doc.getElementsByTagName(\"body\")[0].appendChild(element);\n return element;\n };\n\n module.executeJavascript = function (element, options) {\n var iframe = createHiddenElement(theWindow.document, \"iframe\", options.width, options.height),\n html = element.outerHTML,\n iframeErrorsMessages = [],\n defer = ayepromise.defer(),\n timeout = options.executeJsTimeout || 0;\n\n var doResolve = function () {\n var doc = iframe.contentDocument;\n theWindow.document.getElementsByTagName(\"body\")[0].removeChild(iframe);\n defer.resolve({\n document: doc,\n errors: iframeErrorsMessages\n });\n };\n\n var waitForJavaScriptToRun = function () {\n var d = ayepromise.defer();\n if (timeout > 0) {\n setTimeout(d.resolve, timeout);\n } else {\n d.resolve();\n }\n return d.promise;\n };\n\n var xhr = iframe.contentWindow.XMLHttpRequest,\n finishNotifyXhrProxy = proxies.finishNotifyingXhr(xhr),\n baseUrlXhrProxy = proxies.baseUrlRespectingXhr(finishNotifyXhrProxy, options.baseUrl);\n\n iframe.onload = function () {\n waitForJavaScriptToRun()\n .then(finishNotifyXhrProxy.waitForRequestsToFinish)\n .then(doResolve);\n };\n\n iframe.contentDocument.open();\n iframe.contentWindow.XMLHttpRequest = baseUrlXhrProxy;\n iframe.contentWindow.onerror = function (msg) {\n iframeErrorsMessages.push({\n resourceType: \"scriptExecution\",\n msg: msg\n });\n };\n\n iframe.contentDocument.write('<!DOCTYPE html>');\n iframe.contentDocument.write(html);\n iframe.contentDocument.close();\n\n return defer.promise;\n };\n\n var createHiddenSandboxedIFrame = function (doc, width, height) {\n var iframe = doc.createElement('iframe');\n iframe.style.width = width + \"px\";\n iframe.style.height = height + \"px\";\n // 'display: none' doesn't cut it, as browsers seem to be lazy loading content\n iframe.style.visibility = \"hidden\";\n iframe.style.position = \"absolute\";\n iframe.style.top = (-10000 - height) + \"px\";\n iframe.style.left = (-10000 - width) + \"px\";\n // Don't execute JS, all we need from sandboxing is access to the iframe's document\n iframe.sandbox = 'allow-same-origin';\n // Don't include a scrollbar on Linux\n iframe.scrolling = 'no';\n return iframe;\n };\n\n var createIframeWithSizeAtZoomLevel1 = function (width, height, zoom) {\n var scaledViewportWidth = Math.floor(width / zoom),\n scaledViewportHeight = Math.floor(height / zoom);\n\n return createHiddenSandboxedIFrame(theWindow.document, scaledViewportWidth, scaledViewportHeight);\n };\n\n var calculateZoomedContentSizeAndRoundUp = function (actualViewport, requestedWidth, requestedHeight, zoom) {\n return {\n width: Math.max(actualViewport.width * zoom, requestedWidth),\n height: Math.max(actualViewport.height * zoom, requestedHeight)\n };\n };\n\n var selectElementOrDescendant = function (element, selector) {\n var descendant = element.querySelector(selector);\n if (descendant) {\n return descendant;\n } else if (element.ownerDocument.querySelector(selector) === element) {\n return element;\n }\n\n throw {\n message: \"Clipping selector not found\"\n };\n };\n\n var calculateContentSize = function (rootElement, selector, requestedWidth, requestedHeight, zoom) {\n // clientWidth/clientHeight needed for PhantomJS\n var actualViewportWidth = Math.max(rootElement.scrollWidth, rootElement.clientWidth),\n actualViewportHeight = Math.max(rootElement.scrollHeight, rootElement.clientHeight),\n top, left, originalWidth, originalHeight, rootFontSize,\n element, rect, contentSize;\n\n if (selector) {\n element = selectElementOrDescendant(rootElement, selector);\n\n rect = element.getBoundingClientRect();\n\n top = rect.top;\n left = rect.left;\n originalWidth = rect.width;\n originalHeight = rect.height;\n } else {\n top = 0;\n left = 0;\n originalWidth = actualViewportWidth;\n originalHeight = actualViewportHeight;\n }\n\n contentSize = calculateZoomedContentSizeAndRoundUp({\n width: originalWidth,\n height: originalHeight\n },\n requestedWidth,\n requestedHeight,\n zoom);\n\n rootFontSize = theWindow.getComputedStyle(rootElement.ownerDocument.documentElement).fontSize;\n\n return {\n left: left,\n top: top,\n width: contentSize.width,\n height: contentSize.height,\n viewportWidth: actualViewportWidth,\n viewportHeight: actualViewportHeight,\n\n rootFontSize: rootFontSize\n };\n };\n\n var findCorrelatingElement = function (element, documentClone) {\n var tagName = element.tagName;\n // Stupid but simple method: find first match. Should work for a single HTML element, and any other element given as root\n return documentClone.querySelector(tagName);\n };\n\n var elementToFullHtmlDocument = function (element) {\n var tagName = element.tagName.toLowerCase();\n if (tagName === 'html' || tagName === 'body') {\n return element.outerHTML;\n }\n\n // Simple hack: hide the body from sizing, otherwise browser would apply a 8px margin\n return '<body style=\"margin: 0;\">' + element.outerHTML + '</body>';\n };\n\n module.calculateDocumentContentSize = function (element, options) {\n var defer = ayepromise.defer(),\n zoom = options.zoom || 1,\n iframe;\n\n\n iframe = createIframeWithSizeAtZoomLevel1(options.width, options.height, zoom);\n // We need to add the element to the document so that its content gets loaded\n theWindow.document.getElementsByTagName(\"body\")[0].appendChild(iframe);\n\n iframe.onload = function () {\n var doc = iframe.contentDocument,\n size;\n\n try {\n size = calculateContentSize(findCorrelatingElement(element, doc), options.clip, options.width, options.height, zoom);\n\n defer.resolve(size);\n } catch (e) {\n defer.reject(e);\n } finally {\n theWindow.document.getElementsByTagName(\"body\")[0].removeChild(iframe);\n }\n };\n\n // srcdoc doesn't work in PhantomJS yet\n iframe.contentDocument.open();\n iframe.contentDocument.write('<!DOCTYPE html>');\n iframe.contentDocument.write(elementToFullHtmlDocument(element));\n iframe.contentDocument.close();\n\n return defer.promise;\n };\n\n module.parseHtmlFragment = function (htmlFragment) {\n var doc = theWindow.document.implementation.createHTMLDocument('');\n doc.documentElement.innerHTML = htmlFragment;\n\n var element = doc.querySelector('body').firstChild;\n\n if (!element) {\n throw \"Invalid source\";\n }\n\n return element;\n };\n\n var addHTMLTagAttributes = function (doc, html) {\n var attributeMatch = /<html((?:\\s+[^>]*)?)>/im.exec(html),\n helperDoc = theWindow.document.implementation.createHTMLDocument(''),\n htmlTagSubstitute,\n i, elementSubstitute, attribute;\n\n if (!attributeMatch) {\n return;\n }\n\n htmlTagSubstitute = '<div' + attributeMatch[1] + '></div>';\n helperDoc.documentElement.innerHTML = htmlTagSubstitute;\n elementSubstitute = helperDoc.querySelector('div');\n\n for (i = 0; i < elementSubstitute.attributes.length; i++) {\n attribute = elementSubstitute.attributes[i];\n doc.documentElement.setAttribute(attribute.name, attribute.value);\n }\n };\n\n module.parseHTML = function (html) {\n // We should be using the DOMParser, but it is not supported in older browsers\n var doc = theWindow.document.implementation.createHTMLDocument('');\n doc.documentElement.innerHTML = html;\n\n addHTMLTagAttributes(doc, html);\n return doc;\n };\n\n var failOnInvalidSource = function (doc) {\n try {\n return sanedomparsererror.failOnParseError(doc);\n } catch (e) {\n throw {\n message: \"Invalid source\",\n originalError: e\n };\n }\n };\n\n module.validateXHTML = function (xhtml) {\n var p = new DOMParser(),\n doc = p.parseFromString(xhtml, \"application/xml\");\n\n failOnInvalidSource(doc);\n };\n\n var lastCacheDate = null;\n\n var getUncachableURL = function (url, cache) {\n if (cache === 'none' || cache === 'repeated') {\n if (lastCacheDate === null || cache !== 'repeated') {\n lastCacheDate = Date.now();\n }\n return url + \"?_=\" + lastCacheDate;\n } else {\n return url;\n }\n };\n\n var doDocumentLoad = function (url, options) {\n var xhr = new window.XMLHttpRequest(),\n joinedUrl = util.joinUrl(options.baseUrl, url),\n augmentedUrl = getUncachableURL(joinedUrl, options.cache),\n defer = ayepromise.defer(),\n doReject = function (e) {\n defer.reject({\n message: \"Unable to load page\",\n originalError: e\n });\n };\n\n xhr.addEventListener(\"load\", function () {\n if (xhr.status === 200 || xhr.status === 0) {\n defer.resolve(xhr.responseXML);\n } else {\n doReject(xhr.statusText);\n }\n }, false);\n\n xhr.addEventListener(\"error\", function (e) {\n doReject(e);\n }, false);\n\n try {\n xhr.open('GET', augmentedUrl, true);\n xhr.responseType = \"document\";\n xhr.send(null);\n } catch (e) {\n doReject(e);\n }\n\n return defer.promise;\n };\n\n module.loadDocument = function (url, options) {\n return doDocumentLoad(url, options)\n .then(function (doc) {\n return failOnInvalidSource(doc);\n });\n };\n\n return module;\n}(util, proxies, ayepromise, sanedomparsererror, window));\n\nvar svg2image = (function (ayepromise, window) {\n \"use strict\";\n\n var module = {};\n\n var urlForSvg = function (svg, useBlobs) {\n if (useBlobs) {\n return URL.createObjectURL(new Blob([svg], {\"type\": \"image/svg+xml\"}));\n } else {\n return \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(svg);\n }\n };\n\n var cleanUpUrl = function (url) {\n if (url instanceof Blob) {\n URL.revokeObjectURL(url);\n }\n };\n\n var simpleForeignObjectSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1\" height=\"1\"><foreignObject></foreignObject></svg>';\n\n var supportsReadingObjectFromCanvas = function (url) {\n var canvas = document.createElement(\"canvas\"),\n image = new Image(),\n defer = ayepromise.defer();\n\n image.onload = function () {\n var context = canvas.getContext(\"2d\");\n try {\n context.drawImage(image, 0, 0);\n // This will fail in Chrome & Safari\n canvas.toDataURL(\"image/png\");\n defer.resolve(true);\n } catch (e) {\n defer.resolve(false);\n }\n };\n image.onerror = defer.reject;\n image.src = url;\n\n return defer.promise;\n };\n\n var readingBackFromCanvasBenefitsFromOldSchoolDataUris = function () {\n // Check for work around for https://code.google.com/p/chromium/issues/detail?id=294129\n var blobUrl = urlForSvg(simpleForeignObjectSvg, true);\n return supportsReadingObjectFromCanvas(blobUrl)\n .then(function (supportsReadingFromBlobs) {\n cleanUpUrl(blobUrl);\n if (supportsReadingFromBlobs) {\n return false;\n }\n return supportsReadingObjectFromCanvas(urlForSvg(simpleForeignObjectSvg, false))\n .then(function (s) {\n return s;\n });\n }, function () {\n return false;\n });\n };\n\n var supportsBlobBuilding = function () {\n if (window.Blob) {\n // Available as constructor only in newer builds for all browsers\n try {\n new Blob(['<b></b>'], { \"type\" : \"text/xml\" });\n return true;\n } catch (err) {}\n }\n return false;\n };\n\n var checkBlobSupport = function () {\n var defer = ayepromise.defer();\n\n if (supportsBlobBuilding && window.URL) {\n readingBackFromCanvasBenefitsFromOldSchoolDataUris()\n .then(function (doesBenefit) {\n defer.resolve(! doesBenefit);\n }, function () {\n defer.reject();\n });\n } else {\n defer.resolve(false);\n }\n\n return defer.promise;\n };\n\n var checkForBlobsResult;\n\n var checkForBlobs = function () {\n if (checkForBlobsResult === undefined) {\n checkForBlobsResult = checkBlobSupport();\n }\n\n return checkForBlobsResult;\n };\n\n var buildImageUrl = function (svg) {\n return checkForBlobs().then(function (useBlobs) {\n return urlForSvg(svg, useBlobs);\n });\n };\n\n module.renderSvg = function (svg) {\n var url, image,\n defer = ayepromise.defer(),\n resetEventHandlers = function () {\n image.onload = null;\n image.onerror = null;\n },\n cleanUp = function () {\n if (url) {\n cleanUpUrl(url);\n }\n };\n\n image = new Image();\n image.onload = function() {\n resetEventHandlers();\n cleanUp();\n\n defer.resolve(image);\n };\n image.onerror = function () {\n cleanUp();\n\n // Webkit calls the onerror handler if the SVG is faulty\n defer.reject();\n };\n\n buildImageUrl(svg).then(function (imageUrl) {\n url = imageUrl;\n image.src = url;\n }, defer.reject);\n\n return defer.promise;\n };\n\n return module;\n}(ayepromise, window));\n\nvar document2svg = (function (util, browser, documentHelper, mediaQueryHelper, xmlserializer) {\n \"use strict\";\n\n var module = {};\n\n var svgAttributes = function (size, zoom) {\n var zoomFactor = zoom || 1;\n\n var attributes = {\n width: size.width,\n height: size.height,\n 'font-size': size.rootFontSize\n };\n\n if (zoomFactor !== 1) {\n attributes.style = 'transform:scale(' + zoomFactor + '); transform-origin: 0 0;';\n }\n\n return attributes;\n };\n\n var foreignObjectAttributes = function (size) {\n var closestScaledWith, closestScaledHeight,\n offsetX, offsetY;\n\n closestScaledWith = Math.round(size.viewportWidth);\n closestScaledHeight = Math.round(size.viewportHeight);\n\n offsetX = -size.left;\n offsetY = -size.top;\n\n var attributes = {\n 'x': offsetX,\n 'y': offsetY,\n 'width': closestScaledWith,\n 'height': closestScaledHeight\n };\n\n return attributes;\n };\n\n var workAroundCollapsingMarginsAcrossSVGElementInWebKitLike = function (attributes) {\n var style = attributes.style || '';\n attributes.style = style + 'float: left;';\n };\n\n var workAroundSafariSometimesNotShowingExternalResources = function (attributes) {\n /* Let's hope that works some magic. The spec says SVGLoad only fires\n * now when all externals are available.\n * http://www.w3.org/TR/SVG/struct.html#ExternalResourcesRequired */\n attributes.externalResourcesRequired = true;\n };\n\n var workAroundChromeShowingScrollbarsUnderLinuxIfHtmlIsOverflowScroll = function () {\n return '<style scoped=\"\">html::-webkit-scrollbar { display: none; }</style>';\n };\n\n var serializeAttributes = function (attributes) {\n var keys = Object.keys(attributes);\n if (!keys.length) {\n return '';\n }\n\n return ' ' + keys.map(function (key) {\n return key + '=\"' + attributes[key] + '\"';\n }).join(' ');\n };\n\n var convertElementToSvg = function (element, size, zoomFactor) {\n var xhtml = xmlserializer.serializeToString(element);\n\n browser.validateXHTML(xhtml);\n\n var foreignObjectAttrs = foreignObjectAttributes(size);\n workAroundCollapsingMarginsAcrossSVGElementInWebKitLike(foreignObjectAttrs);\n workAroundSafariSometimesNotShowingExternalResources(foreignObjectAttrs);\n\n return (\n '<svg xmlns=\"http://www.w3.org/2000/svg\"' +\n serializeAttributes(svgAttributes(size, zoomFactor)) +\n '>' +\n workAroundChromeShowingScrollbarsUnderLinuxIfHtmlIsOverflowScroll() +\n '<foreignObject' + serializeAttributes(foreignObjectAttrs) + '>' +\n xhtml +\n '</foreignObject>' +\n '</svg>'\n );\n };\n\n module.getSvgForDocument = function (element, size, zoomFactor) {\n documentHelper.rewriteTagNameSelectorsToLowerCase(element);\n\n return mediaQueryHelper.needsEmWorkaround().then(function (needsWorkaround) {\n if (needsWorkaround) {\n mediaQueryHelper.workAroundWebKitEmSizeIssue(element);\n }\n\n return convertElementToSvg(element, size, zoomFactor);\n });\n };\n\n module.drawDocumentAsSvg = function (element, options) {\n ['hover', 'active', 'focus', 'target'].forEach(function (action) {\n if (options[action]) {\n documentHelper.fakeUserAction(element, options[action], action);\n }\n });\n\n return browser.calculateDocumentContentSize(element, options)\n .then(function (size) {\n return module.getSvgForDocument(element, size, options.zoom);\n });\n };\n\n return module;\n}(util, browser, documentHelper, mediaQueryHelper, xmlserializer));\n\nvar rasterize = (function (util, browser, documentHelper, document2svg, svg2image, inlineresources) {\n \"use strict\";\n\n var module = {};\n\n var generalDrawError = function (e) {\n return {\n message: \"Error rendering page\",\n originalError: e\n };\n };\n\n var drawSvgAsImg = function (svg) {\n return svg2image.renderSvg(svg)\n .then(function (image) {\n return {\n image: image,\n svg: svg\n };\n }, function (e) {\n throw generalDrawError(e);\n });\n };\n\n var drawImageOnCanvas = function (image, canvas) {\n try {\n canvas.getContext(\"2d\").drawImage(image, 0, 0);\n } catch (e) {\n // Firefox throws a 'NS_ERROR_NOT_AVAILABLE' if the SVG is faulty\n throw generalDrawError(e);\n }\n };\n\n var doDraw = function (element, canvas, options) {\n return document2svg.drawDocumentAsSvg(element, options)\n .then(drawSvgAsImg)\n .then(function (result) {\n if (canvas) {\n drawImageOnCanvas(result.image, canvas);\n }\n\n return result;\n });\n };\n\n var operateJavaScriptOnDocument = function (element, options) {\n return browser.executeJavascript(element, options)\n .then(function (result) {\n var document = result.document;\n documentHelper.persistInputValues(document);\n\n return {\n document: document,\n errors: result.errors\n };\n });\n };\n\n module.rasterize = function (element, canvas, options) {\n var inlineOptions;\n\n inlineOptions = util.clone(options);\n inlineOptions.inlineScripts = options.executeJs === true;\n\n return inlineresources.inlineReferences(element, inlineOptions)\n .then(function (errors) {\n if (options.executeJs) {\n return operateJavaScriptOnDocument(element, options)\n .then(function (result) {\n return {\n element: result.document.documentElement,\n errors: errors.concat(result.errors)\n };\n });\n } else {\n return {\n element: element,\n errors: errors\n };\n }\n }).then(function (result) {\n return doDraw(result.element, canvas, options)\n .then(function (drawResult) {\n return {\n image: drawResult.image,\n svg: drawResult.svg,\n errors: result.errors\n };\n });\n });\n };\n\n return module;\n}(util, browser, documentHelper, document2svg, svg2image, inlineresources));\n\nvar rasterizeHTML = (function (util, browser, rasterize) {\n \"use strict\";\n\n var module = {};\n\n var getViewportSize = function (canvas, options) {\n var defaultWidth = 300,\n defaultHeight = 200,\n fallbackWidth = canvas ? canvas.width : defaultWidth,\n fallbackHeight = canvas ? canvas.height : defaultHeight,\n width = options.width !== undefined ? options.width : fallbackWidth,\n height = options.height !== undefined ? options.height : fallbackHeight;\n\n return {\n width: width,\n height: height\n };\n };\n\n var constructOptions = function (params) {\n var viewport = getViewportSize(params.canvas, params.options),\n options;\n\n options = util.clone(params.options);\n options.width = viewport.width;\n options.height = viewport.height;\n\n return options;\n };\n\n /**\n * Draws a Document to the canvas.\n * rasterizeHTML.drawDocument( document [, canvas] [, options] ).then(function (result) { ... });\n */\n module.drawDocument = function () {\n var doc = arguments[0],\n optionalArguments = Array.prototype.slice.call(arguments, 1),\n params = util.parseOptionalParameters(optionalArguments);\n\n var element = doc.documentElement ? doc.documentElement : doc;\n\n return rasterize.rasterize(element, params.canvas, constructOptions(params));\n };\n\n var drawHTML = function (html, canvas, options) {\n var doc = browser.parseHTML(html);\n\n return module.drawDocument(doc, canvas, options);\n };\n\n /**\n * Draws a HTML string to the canvas.\n * rasterizeHTML.drawHTML( html [, canvas] [, options] ).then(function (result) { ... });\n */\n module.drawHTML = function () {\n var html = arguments[0],\n optionalArguments = Array.prototype.slice.call(arguments, 1),\n params = util.parseOptionalParameters(optionalArguments);\n\n return drawHTML(html, params.canvas, params.options);\n };\n\n // work around https://bugzilla.mozilla.org/show_bug.cgi?id=925493\n var workAroundFirefoxNotLoadingStylesheetStyles = function (doc, url, options) {\n var d = document.implementation.createHTMLDocument('');\n d.replaceChild(doc.documentElement, d.documentElement);\n\n var extendedOptions = options ? util.clone(options) : {};\n\n if (!options.baseUrl) {\n extendedOptions.baseUrl = url;\n }\n\n return {\n document: d,\n options: extendedOptions\n };\n };\n\n var drawURL = function (url, canvas, options) {\n return browser.loadDocument(url, options)\n .then(function (doc) {\n var workaround = workAroundFirefoxNotLoadingStylesheetStyles(doc, url, options);\n return module.drawDocument(workaround.document, canvas, workaround.options);\n });\n };\n\n /**\n * Draws a page to the canvas.\n * rasterizeHTML.drawURL( url [, canvas] [, options] ).then(function (result) { ... });\n */\n module.drawURL = function () {\n var url = arguments[0],\n optionalArguments = Array.prototype.slice.call(arguments, 1),\n params = util.parseOptionalParameters(optionalArguments);\n\n return drawURL(url, params.canvas, params.options);\n };\n\n return module;\n}(util, browser, rasterize));\n\nreturn rasterizeHTML;\n\n}));\n\n},{\"ayepromise\":2,\"css-mediaquery\":8,\"inlineresources\":30,\"sane-domparser-error\":40,\"url\":3,\"xmlserializer\":41}],40:[function(require,module,exports){\n'use strict';\n\nvar innerXML = function (node) {\n var s = new XMLSerializer();\n return Array.prototype.map.call(node.childNodes, function (node) {\n return s.serializeToString(node);\n }).join('');\n};\n\nvar getParseError = function (doc) {\n // Firefox\n if (doc.documentElement.tagName === 'parsererror' &&\n doc.documentElement.namespaceURI === 'http://www.mozilla.org/newlayout/xml/parsererror.xml') {\n return doc.documentElement;\n }\n\n // Chrome, Safari\n if ((doc.documentElement.tagName === 'xml' || doc.documentElement.tagName === 'html') &&\n doc.documentElement.childNodes &&\n doc.documentElement.childNodes.length > 0 &&\n doc.documentElement.childNodes[0].nodeName === 'parsererror') {\n return doc.documentElement.childNodes[0];\n }\n\n // PhantomJS\n if (doc.documentElement.tagName === 'html' &&\n doc.documentElement.childNodes &&\n doc.documentElement.childNodes.length > 0 &&\n doc.documentElement.childNodes[0].nodeName === 'body' &&\n doc.documentElement.childNodes[0].childNodes &&\n doc.documentElement.childNodes[0].childNodes.length &&\n doc.documentElement.childNodes[0].childNodes[0].nodeName === 'parsererror') {\n return doc.documentElement.childNodes[0].childNodes[0];\n }\n\n return undefined;\n};\n\nvar errorMessagePatterns = [\n // Chrome, Safari, PhantomJS\n new RegExp('^<h3[^>]*>This page contains the following errors:<\\/h3><div[^>]*>(.+?)\\n?<\\/div>'),\n // Firefox\n new RegExp('^(.+)\\n')\n];\n\nvar extractParseError = function (errorNode) {\n var content = innerXML(errorNode);\n var i, match;\n\n for(i = 0; i < errorMessagePatterns.length; i++) {\n match = errorMessagePatterns[i].exec(content);\n\n if (match) {\n return match[1];\n }\n }\n return undefined;\n};\n\nvar failOnParseError = function (doc) {\n var errorMessage;\n\n if (doc === null) {\n throw new Error('Parse error');\n }\n\n var parseError = getParseError(doc);\n if (parseError !== undefined) {\n errorMessage = extractParseError(parseError) || 'Parse error';\n throw new Error(errorMessage);\n }\n};\n\nexports.failOnParseError = function (doc) {\n failOnParseError(doc);\n\n return doc;\n};\n\n},{}],41:[function(require,module,exports){\nvar removeInvalidCharacters = function (content) {\n // See http://www.w3.org/TR/xml/#NT-Char for valid XML 1.0 characters\n return content.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/g, '');\n};\n\nvar serializeAttributeValue = function (value) {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n};\n\nvar serializeTextContent = function (content) {\n return content\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n};\n\nvar serializeAttribute = function (attr) {\n var value = attr.value;\n\n return ' ' + attr.name + '=\"' + serializeAttributeValue(value) + '\"';\n};\n\nvar getTagName = function (node) {\n var tagName = node.tagName;\n\n // Aid in serializing of original HTML documents\n if (node.namespaceURI === 'http://www.w3.org/1999/xhtml') {\n tagName = tagName.toLowerCase();\n }\n return tagName;\n};\n\nvar serializeNamespace = function (node, isRootNode) {\n var nodeHasXmlnsAttr = Array.prototype.map.call(node.attributes || node.attrs, function (attr) {\n return attr.name;\n })\n .indexOf('xmlns') >= 0;\n // Serialize the namespace as an xmlns attribute whenever the element\n // doesn't already have one and the inherited namespace does not match\n // the element's namespace.\n if (!nodeHasXmlnsAttr &&\n (isRootNode ||\n node.namespaceURI !== node.parentNode.namespaceURI)) {\n return ' xmlns=\"' + node.namespaceURI + '\"';\n } else {\n return '';\n }\n};\n\nvar serializeChildren = function (node) {\n return Array.prototype.map.call(node.childNodes, function (childNode) {\n return nodeTreeToXHTML(childNode);\n }).join('');\n};\n\nvar serializeTag = function (node, isRootNode) {\n var output = '<' + getTagName(node);\n output += serializeNamespace(node, isRootNode);\n\n Array.prototype.forEach.call(node.attributes || node.attrs, function (attr) {\n output += serializeAttribute(attr);\n });\n\n if (node.childNodes.length > 0) {\n output += '>';\n output += serializeChildren(node);\n output += '</' + getTagName(node) + '>';\n } else {\n output += '/>';\n }\n return output;\n};\n\nvar serializeText = function (node) {\n var text = node.nodeValue || node.value || '';\n return serializeTextContent(text);\n};\n\nvar serializeComment = function (node) {\n return '<!--' +\n node.data\n .replace(/-/g, '&#45;') +\n '-->';\n};\n\nvar serializeCDATA = function (node) {\n return '<![CDATA[' + node.nodeValue + ']]>';\n};\n\nvar nodeTreeToXHTML = function (node, options) {\n var isRootNode = options && options.rootNode;\n\n if (node.nodeName === '#document' ||\n node.nodeName === '#document-fragment') {\n return serializeChildren(node);\n } else {\n if (node.tagName) {\n return serializeTag(node, isRootNode);\n } else if (node.nodeName === '#text') {\n return serializeText(node);\n } else if (node.nodeName === '#comment') {\n return serializeComment(node);\n } else if (node.nodeName === '#cdata-section') {\n return serializeCDATA(node);\n }\n }\n};\n\nexports.serializeToString = function (node) {\n return removeInvalidCharacters(nodeTreeToXHTML(node, {rootNode: true}));\n};\n\n},{}]},{},[1]);\n"]}
\No newline at end of file