Merge inbound to m-c.
authorRyan VanderMeulen <ryanvm@gmail.com>
Tue, 03 Sep 2013 17:40:56 -0400
changeset 145375 e3785e299ab6ea4c4f6f318ff601d73c6be9198c
parent 145374 6a2fa1dcddf0ca1ed2d2d3ea12c6aafe94546b2f (current diff)
parent 145344 13dcab876681a4f86a8938df826761869ebc92e9 (diff)
child 145376 7af0a1d83403a51a375828887ffa3f24723fa862
child 145435 d2410b48a8e09f92f26302631f6a4d098aaeef1c
child 145453 04aa8c1ab6bb7f715ae7334a074d882f54ae25d5
child 145716 f8f67a668be9349a55e3fcf9ef88470bc1160367
child 155767 8fae116e85c50a68bc62d93e2900c4eb21fb3075
push id33250
push userryanvm@gmail.com
push dateTue, 03 Sep 2013 21:43:55 +0000
treeherdermozilla-inbound@7af0a1d83403 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone26.0a1
first release with
nightly linux32
e3785e299ab6 / 26.0a1 / 20130904030204 / files
nightly linux64
e3785e299ab6 / 26.0a1 / 20130904030204 / files
nightly mac
e3785e299ab6 / 26.0a1 / 20130904030204 / files
nightly win32
e3785e299ab6 / 26.0a1 / 20130904030204 / files
nightly win64
e3785e299ab6 / 26.0a1 / 20130904030204 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to m-c.
content/base/public/nsIXPathEvaluatorInternal.h
content/xslt/src/xpath/nsXPathEvaluator.cpp
content/xslt/src/xpath/nsXPathEvaluator.h
dom/bindings/Bindings.conf
dom/webidl/WebIDL.mk
--- a/CLOBBER
+++ b/CLOBBER
@@ -13,9 +13,9 @@
 #          |               |
 #          O <-- Clobber   O  <-- Clobber
 #
 # Note: The description below will be part of the error message shown to users.
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
-Bug 909870 - xpidl header generation is somehow busted so we need to clobber on windows
+Bug 627487 - random test failures caused by bookmark JSON changes
--- a/accessible/src/jsat/AccessFu.jsm
+++ b/accessible/src/jsat/AccessFu.jsm
@@ -487,16 +487,129 @@ var Output = {
       braille.text = this.text;
       this.selectionStart = braille.selectionStart = aSelection.selectionStart + this.startOffset;
       this.selectionEnd = braille.selectionEnd = aSelection.selectionEnd + this.startOffset;
 
       return braille;
     }
   },
 
+  speechHelper: {
+    EARCONS: ['chrome://global/content/accessibility/tick.wav'],
+
+    delayedActions: [],
+
+    earconsToLoad: -1, // -1: not inited, 1 or more: initing, 0: inited
+
+    earconBuffers: {},
+
+    webaudioEnabled: false,
+
+    webspeechEnabled: false,
+
+    doDelayedActionsIfLoaded: function doDelayedActionsIfLoaded(aToLoadCount) {
+      if (aToLoadCount === 0) {
+        this.outputActions(this.delayedActions);
+        this.delayedActions = [];
+        return true;
+      }
+
+      return false;
+    },
+
+    init: function init() {
+      if (this.earconsToLoad === 0) {
+        // Already inited.
+        return;
+      }
+
+      let window = Utils.win;
+      this.webaudioEnabled = !!window.AudioContext;
+      this.webspeechEnabled = !!window.speechSynthesis;
+
+      this.earconsToLoad = this.webaudioEnabled ? this.EARCONS.length : 0;
+
+      if (this.doDelayedActionsIfLoaded(this.earconsToLoad)) {
+        // Nothing to load
+        return;
+      }
+
+      this.audioContext = new window.AudioContext();
+
+      for (let earcon of this.EARCONS) {
+        let xhr = new window.XMLHttpRequest();
+        xhr.open('GET', earcon);
+        xhr.responseType = 'arraybuffer';
+        xhr.onerror = () => {
+          Logger.error('Error getting earcon:', xhr.statusText);
+          this.doDelayedActionsIfLoaded(--this.earconsToLoad);
+        };
+        xhr.onload = () => {
+          this.audioContext.decodeAudioData(
+            xhr.response,
+            (audioBuffer) => {
+              try {
+                let earconName = /.*\/(.*)\..*$/.exec(earcon)[1];
+                this.earconBuffers[earconName] = new WeakMap();
+                this.earconBuffers[earconName].set(window, audioBuffer);
+                this.doDelayedActionsIfLoaded(--this.earconsToLoad);
+              } catch (x) {
+                Logger.logException(x);
+              }
+            },
+            () => {
+              this.doDelayedActionsIfLoaded(--this.earconsToLoad);
+              Logger.error('Error decoding earcon');
+            });
+        };
+        xhr.send();
+      }
+    },
+
+    output: function output(aActions) {
+      if (this.earconsToLoad !== 0) {
+        // We did not load the earcons yet.
+        this.delayedActions.push.apply(this.delayedActions, aActions);
+        if (this.earconsToLoad < 0) {
+          // Loading did not start yet, start it.
+          this.init();
+        }
+        return;
+      }
+
+      this.outputActions(aActions);
+    },
+
+    outputActions: function outputActions(aActions) {
+      for (let action of aActions) {
+        let window = Utils.win;
+        Logger.info('tts.' + action.method,
+                    '"' + action.data + '"',
+                    JSON.stringify(action.options));
+
+        if (!action.options.enqueue && this.webspeechEnabled) {
+          window.speechSynthesis.cancel();
+        }
+
+        if (action.method === 'speak' && this.webspeechEnabled) {
+          window.speechSynthesis.speak(
+            new window.SpeechSynthesisUtterance(action.data));
+        } else if (action.method === 'playEarcon' && this.webaudioEnabled) {
+          let audioBufferWeakMap = this.earconBuffers[action.data];
+          if (audioBufferWeakMap) {
+            let node = this.audioContext.createBufferSource();
+            node.connect(this.audioContext.destination);
+            node.buffer = audioBufferWeakMap.get(window);
+            node.start(0);
+          }
+        }
+      }
+    }
+  },
+
   start: function start() {
     Cu.import('resource://gre/modules/Geometry.jsm');
   },
 
   stop: function stop() {
     if (this.highlightBox) {
       Utils.win.document.documentElement.removeChild(this.highlightBox.get());
       delete this.highlightBox;
@@ -504,18 +617,17 @@ var Output = {
 
     if (this.announceBox) {
       Utils.win.document.documentElement.removeChild(this.announceBox.get());
       delete this.announceBox;
     }
   },
 
   Speech: function Speech(aDetails, aBrowser) {
-    for each (let action in aDetails.actions)
-      Logger.info('tts.' + action.method, '"' + action.data + '"', JSON.stringify(action.options));
+    this.speechHelper.output(aDetails.actions);
   },
 
   Visual: function Visual(aDetails, aBrowser) {
     switch (aDetails.method) {
       case 'showBounds':
       {
         let highlightBox = null;
         if (!this.highlightBox) {
--- a/accessible/src/jsat/jar.mn
+++ b/accessible/src/jsat/jar.mn
@@ -1,7 +1,8 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 toolkit.jar:
     content/global/accessibility/AccessFu.css (AccessFu.css)
     content/global/accessibility/content-script.js (content-script.js)
+    content/global/accessibility/tick.wav (tick.wav)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b40a1bbd0e85afe96f869ef38ac21d5a80344e2d
GIT binary patch
literal 3652
zc$_U(33yFc*M8T&LnaYZ456W>8bb|5DUF~_4Uw2*_^6l?D&{YyYD<wu)rV4zs2IM~
z)QG9nm}-i)32F?2){yW?$b9cTd#``>dH&}-&prE`yU$+heb>9*y`#eW_3Kd;7!f+W
z@8lVC8&v~9axLpAgC&4MH4F$JGV}v^3?I}lB79Kjz+f2<o*5rM?V~A;226`-G;^}t
z;y;`)eMX}pbEi#=lbNAWLw#k|khv3PPoFk-lDr9v>f@9*9on~l3y7I8cS4pw&|h^c
zntHPTy`;Nk{_P_&o9{}UxV}R_{&-X9#-tG^ej0hVhFVr|p#J1H7o?p3b7k9JH1qVi
z$j{Nrwxm86r>!e&(5!9Iu6t*j4(Qg-%Dx+UZ%<yBdfN748%N2!$B*k&Z@K1G;_1$h
z#=Rcxb@tW)@(;V)c<{C8I|G~MHMn`%TwYPPYl|nP8KoN<tg12O{`iO5e`od8B{{CN
z8s~f_Rcz#@HuYlr%P(u6s2f^%;mMkSm$mWg?}E4dkJhxxN=mBuHSoDsysbRiFUD_B
zS;>obUL}F;y}x?t`z((y)+qBbuiCj&YfP__TX^}!hdvwpy~;<IcCLEAR%Ur{!2>fj
zV72{lS&HYFJyNxT-M$K~D|WgU`4;)!ab*>Eu~h~PG4JHtT`TGgs=l{q=Cd_bS_Or<
zx;)yiQOCzCuc*5#+b`U)rd+$DoVV=>rcl4*Nq2epw9g6OL|v`?o|U4O+je6$H|Are
zTz8{kwi`U!{f8?CwS8CnZ1$v-BzhkBCj0EHyjd3I2=n@=vQ~xLXMI4i%m2l4^K;d&
z9EHUN<=1?&{W_Wr<sGeJm7q532cB5f&>N~r<qKC&+Zg+HE8VJPTTRJU06CorRN<=P
zzDkRgHZGk)M^p%wnhaCK0m#;I);DUFBa_QK!RT!pZ{qatwh~)UtE;DreUsyR*Vf7e
zTafdNeEJ!-+k2|3yi>hN8?3(i9t}`l=CTe`zP2j{`U3<|2$%5;yWKg*T37J~Yp-hd
zpo-%1WXEB@nY^X+ushf{(66!XSP`jCdatmY6{~E+eMjm&Wna(}pZCmbWp}8cN~|rY
zGKD|#PQ+`K{^p!LipG0-nYQ-VZN0gaTfow1xQdEbt!Wtb<3II!gi^4+X?0b{?728?
z%|?GmHg)vmnIva5#}4z{%HWpRYG&~as^mX(0ix_H$!5k;Z^vHJ?#<SG+h}{anWg<G
znQHM<eVv)2Y)>ei>+vldQoqtCCd?Wx_;cy9yO-|maNBC=0;{XT;h1Lz>ZLSUowXu8
z-nJ~SROGw*@I&WgW%vBoN^;bdYE)SHju6MYo+U09O?O6{tL{8LWxqsKOdam4%IUgU
zW3u>LTt&8-q2E;=$8FwOIZQuruzJ%o($sVWQ?4t*%yC|$lFCvK+k+ehdbc%&PT8Ka
zQ}?nQCY5p(A;dI7G<kEb+uOw1a~xUbT~D?t=L}t;Q&ogLm@_@ipw&5^t_NTf4KNXw
z;t3!Qf{*Hgo@Nn$h}-&zHIII>uQP4jE#dFwOMA*My5pQl&b=PEMp3q-ImfwobG9Rj
z&R2$8PaT)+?L42lR?u}v5|&#lObI39UzV?aT}9jH;<5Ei=TjQ?T9%be&Fvr3NIl=0
z#XZzF>L7=iF=(K=W4}IP22%`*bs*oPhd5=L;TSp4+1%wYl|c2(QQebb$fLu|eU)Yl
zGGAC<sB88)ro?jqtVZ%7y`FB^zD0=km|kjxO2-8=!{i`bb;6f=EqAiT(RHgGKd?`;
zk22$}7-Xr1XveFu93cp&_f##cHQP7?k(4IiSLGc2KJUa{`G2L<I2Hx^2+vcCXe?)P
z9eRU4#SvWOS0)P2#Gu!hhJ2Pjr%JPteN+wl(KP0kYM!Vkg>S1)G|w7tZKHwq?r5q9
z^I+A68k*rc2i0wz=$>wAPT+u`&(YsgtXj-5dO07bOzbjwW+E*9m}l}>ZpLlUjjr+^
zW;VA*Q@KyUM5LI1n>@TtVWzEKi$c0$cIhBmrpB5mPnxMvpg@Z>(@1qo|Ln1Y><_4e
zwaL>Bzo>K$(yRD=>SDHgerGS+U;LL9g(9`v+;{KO9o0B`p%0pP+QxmXO5H;ZBwt->
zW#dO$Y^G};q$AJ-n*OwjcIknZLLYUMmx?0aqf_XiC+PO*OndmQnaXYWvI*pId_?Ad
zZRX-E)kl;bs$(!vrSgx~brYhhqJ`zJQ>jo*F^fGp9BD5{gs0qd0~aXKEYx)=RefvL
zdhQyd!bw{>`Y3gw44rRX;+pgpicE=l$>WgD0cH>%pfR*v$6AT3R5$c9u{@P_;J$X4
zrtqdH{@e6LF23e$Gm@Y4Y~ITY5siABVL~yBf-qlS)W<POJ>nU<qtrB<8k<k_2<)Lb
zyib?$ztkO+=pM!&)6oqrafADcLlt2^pVB)`ETz*v&M_b1AN3D0vqg*J=r^v(S9ma5
zpf$$Gt{#A|WjvHqIR&dQoHy{l;iPdm#J}*L`~gz&5-FT%GI$RSryVBFB$1cRABXi8
z>60H&Yz*(GlL+PQd;=v2#YU-3A@WUvsg31y1&w(TkEPKRE31q_8g0cpTmx=IU<}{k
zGz>s>Y{U1s#x=1IComFkAe*~jBz2%-UdG39PY}%)|9n$5l@6JJ2z3}6%ncr<vMApi
zH%q1ZRRqON8cPXmnUg4`Y<$Br@fl?yjyJM5Eu|vV79GdIhZsB11@}d<OHjstU=p3c
za}1`vh~oR4NNMDcW0La|YAm=~P`qkF-|;$8whI&43*U)TmkQpC*hn|fSoj)6Ut^%4
zNSEJF(TEmNFfGIu+`%zKVg!Ce7EYrS5fo3$;gqT$rupPU(U^tDsKj?jK@gpj`z=f)
z8$FTT(M5-qA64ZeyqhM|w|rB&yN~(-r??X~$;yADDy>E)MhH(qXoo5E6^%d<e@Yot
z8wa={?V$7gI&VQaY5Y%+U&B9Vwo{T}kX$EajcC!p$Ec5<qMFI*BbdeshX+NAA>t%|
z@?J9-A@mL+*s#B3dtUl~w($6xU<wh9yb|ZW#d|nh*sP93_VDL;8^`%HKjME*ipji0
zMibCLR2{(8u^CMyvsIkIKk!1{%0Kc7UdJc6keyi1Q#hBSk->?^hyBnMA8;54B3Jsv
zZ6=8>nn-6T_+W}zV7##%4fzx4q@(E1>&*#ni(o!!j<QtFM4HDu8rArTaiTf?YdV`l
z{24wL2bd+QZXp_3z`yd_{LC!n-?<k%c{5*QKR#p1B!e7N+stFpF|ROvI1ICy%x&|X
z)HcN&l*o<ntGQ@S35M5rI9I_L*{KtxV$uAQS;C`)>wHsNxVg{Wd6szfM7Hw;cFS`t
zf6hC&B{$^r?2ozJN;+T)=JR5cBs%PYOp|MFOCJp3LBd}%oD|nhmW+Kwxj*rL*jHHJ
z!f)_X&cis^`IhO4gV@Mm=F7ruJ${#`N`(@6B@e&`)J1|+rw#&fnl;B`CF%(a^SKtL
z;Grn1J{BU6len9>z;j+LIlc$C^xSivgx)BS6HgR6B9(VZ<b{}qM}p=Vdy8+lxw%wY
z;V9=xzICOKN+nLYtT+RGkjamEHde^IbZ#V_`8{73&l!eNc{+$S^3@8_;}xmtHExC^
z)WIZ)k&GLn<8AzqmkEY_g1woXN)}@sFBUXk2*`O7`vQ{ji*Rp;4LPE&CdlW*l3%c3
z+{!j=ML*dUf8)k@%4vL-L&Rwc__BCTSBaCwXN1}A!j)4Hm$3tepGd7B|NPAz(O1-c
zkPiyOcSI4VIG?+sgD83}7YH}i@bmw3v`6?HA{DX;lQZSpIb6<jr3Wr?dn^*p3T4(9
z{KZ+kSg=gx@w{Jl&Xau9*byf?#Zht8q4XQx=LK9KyTJu<-t{;K2Ywf<KO<IDHe8rl
zh<BuWh6-ni7%vK0j6*mqZXYNk8>NfucR`xCKzr$vrg9$GCwoC8=3y<?31ji-g$1~b
z+mh25?8GHmsg3X+NRv^_q2lge3R^MAk^UWu&f*0r5@`WG!BVN?cKjtZY>oBeG&d!B
jJbsl}ZP5z9;Hm8U9mGfTWqxmol`U~YkbphtkFoeas2Q~l
--- a/b2g/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -235,16 +235,17 @@
 @BINPATH@/components/htmlparser.xpt
 @BINPATH@/components/identity.xpt
 @BINPATH@/components/imglib2.xpt
 @BINPATH@/components/imgicon.xpt
 @BINPATH@/components/inspector.xpt
 @BINPATH@/components/intl.xpt
 @BINPATH@/components/jar.xpt
 @BINPATH@/components/jsdebugger.xpt
+@BINPATH@/components/jsdownloads.xpt
 @BINPATH@/components/jsdservice.xpt
 @BINPATH@/components/jsinspector.xpt
 @BINPATH@/components/layout_base.xpt
 #ifdef NS_PRINTING
 @BINPATH@/components/layout_printing.xpt
 #endif
 @BINPATH@/components/layout_xul_tree.xpt
 @BINPATH@/components/layout_xul.xpt
--- a/browser/extensions/pdfjs/README.mozilla
+++ b/browser/extensions/pdfjs/README.mozilla
@@ -1,4 +1,4 @@
 This is the pdf.js project output, https://github.com/mozilla/pdf.js
 
-Current extension version is: 0.8.423
+Current extension version is: 0.8.478
 
--- a/browser/extensions/pdfjs/components/PdfStreamConverter.js
+++ b/browser/extensions/pdfjs/components/PdfStreamConverter.js
@@ -11,17 +11,17 @@
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 /* jshint esnext:true */
 /* globals Components, Services, XPCOMUtils, NetUtil, PrivateBrowsingUtils,
-           dump, NetworkManager */
+           dump, NetworkManager, PdfJsTelemetry */
 
 'use strict';
 
 var EXPORTED_SYMBOLS = ['PdfStreamConverter'];
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cr = Components.results;
@@ -37,16 +37,19 @@ const MAX_DATABASE_LENGTH = 4096;
 Cu.import('resource://gre/modules/XPCOMUtils.jsm');
 Cu.import('resource://gre/modules/Services.jsm');
 Cu.import('resource://gre/modules/NetUtil.jsm');
 Cu.import('resource://pdf.js/network.js');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
   'resource://gre/modules/PrivateBrowsingUtils.jsm');
 
+XPCOMUtils.defineLazyModuleGetter(this, 'PdfJsTelemetry',
+  'resource://pdf.js/PdfJsTelemetry.jsm');
+
 var Svc = {};
 XPCOMUtils.defineLazyServiceGetter(Svc, 'mime',
                                    '@mozilla.org/mime;1',
                                    'nsIMIMEService');
 
 function getChromeWindow(domWindow) {
   var containingBrowser = domWindow.QueryInterface(Ci.nsIInterfaceRequestor)
                                    .getInterface(Ci.nsIWebNavigation)
@@ -189,16 +192,22 @@ PdfDataListener.prototype = {
     }
   }
 };
 
 // All the priviledged actions.
 function ChromeActions(domWindow, contentDispositionFilename) {
   this.domWindow = domWindow;
   this.contentDispositionFilename = contentDispositionFilename;
+  this.telemetryState = {
+    documentInfo: false,
+    firstPageInfo: false,
+    streamTypesUsed: [],
+    startAt: Date.now()
+  };
 }
 
 ChromeActions.prototype = {
   isInPrivateBrowsing: function() {
     return PrivateBrowsingUtils.isWindowPrivate(this.domWindow);
   },
   download: function(data, sendResponse) {
     var self = this;
@@ -316,22 +325,59 @@ ChromeActions.prototype = {
   supportsDocumentFonts: function() {
     var prefBrowser = getIntPref('browser.display.use_document_fonts', 1);
     var prefGfx = getBoolPref('gfx.downloadable_fonts.enabled', true);
     return (!!prefBrowser && prefGfx);
   },
   supportsDocumentColors: function() {
     return getBoolPref('browser.display.use_document_colors', true);
   },
+  reportTelemetry: function (data) {
+    var probeInfo = JSON.parse(data);
+    switch (probeInfo.type) {
+      case 'documentInfo':
+        if (!this.telemetryState.documentInfo) {
+          PdfJsTelemetry.onDocumentVersion(probeInfo.version | 0);
+          PdfJsTelemetry.onDocumentGenerator(probeInfo.generator | 0);
+          if (probeInfo.formType) {
+            PdfJsTelemetry.onForm(probeInfo.formType === 'acroform');
+          }
+          this.telemetryState.documentInfo = true;
+        }
+        break;
+      case 'pageInfo':
+        if (!this.telemetryState.firstPageInfo) {
+          var duration = Date.now() - this.telemetryState.startAt;
+          PdfJsTelemetry.onTimeToView(duration);
+          this.telemetryState.firstPageInfo = true;
+        }
+        break;
+      case 'streamInfo':
+        if (!Array.isArray(probeInfo.streamTypes)) {
+          break;
+        }
+        for (var i = 0; i < probeInfo.streamTypes.length; i++) {
+          var streamTypeId = probeInfo.streamTypes[i] | 0;
+          if (streamTypeId >= 0 && streamTypeId < 10 &&
+              !this.telemetryState.streamTypesUsed[streamTypeId]) {
+            PdfJsTelemetry.onStreamType(streamTypeId);
+            this.telemetryState.streamTypesUsed[streamTypeId] = true;
+          }
+        }
+        break;
+    }
+  },
   fallback: function(url, sendResponse) {
     var self = this;
     var domWindow = this.domWindow;
     var strings = getLocalizedStrings('chrome.properties');
     var message = getLocalizedString(strings, 'unsupported_feature');
 
+    PdfJsTelemetry.onFallback();
+
     var notificationBox = null;
     try {
       // Based on MDN's "Working with windows in chrome code"
       var mainWindow = domWindow
         .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
         .getInterface(Components.interfaces.nsIWebNavigation)
         .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
         .rootTreeItem
@@ -725,16 +771,19 @@ PdfStreamConverter.prototype = {
       aRequest.setResponseHeader('Content-Security-Policy', '', false);
       aRequest.setResponseHeader('Content-Security-Policy-Report-Only', '',
                                  false);
       aRequest.setResponseHeader('X-Content-Security-Policy', '', false);
       aRequest.setResponseHeader('X-Content-Security-Policy-Report-Only', '',
                                  false);
     }
 
+    PdfJsTelemetry.onViewerIsUsed();
+    PdfJsTelemetry.onDocumentSize(aRequest.contentLength);
+
     if (!rangeRequest) {
       // Creating storage for PDF data
       var contentLength = aRequest.contentLength;
       this.dataListener = new PdfDataListener(contentLength);
       this.binaryStream = Cc['@mozilla.org/binaryinputstream;1']
                           .createInstance(Ci.nsIBinaryInputStream);
     } else {
       // Suspend the request so we're not consuming any of the stream,
--- a/browser/extensions/pdfjs/content/PdfJs.jsm
+++ b/browser/extensions/pdfjs/content/PdfJs.jsm
@@ -249,15 +249,15 @@ let PdfJs = {
 
   _ensureUnregistered: function _ensureUnregistered() {
     if (!this._registered)
       return;
 
     this._pdfStreamConverterFactory.unregister();
     delete this._pdfStreamConverterFactory;
 
-    this._pdfRedirectorFactory.unregister;
+    this._pdfRedirectorFactory.unregister();
     delete this._pdfRedirectorFactory;
     Svc.pluginHost.unregisterPlayPreviewMimeType(PDF_CONTENT_TYPE);
 
     this._registered = false;
   }
 };
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pdfjs/content/PdfJsTelemetry.jsm
@@ -0,0 +1,59 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2013 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* jshint esnext:true */
+
+'use strict';
+
+this.EXPORTED_SYMBOLS = ['PdfJsTelemetry'];
+
+const Cu = Components.utils;
+Cu.import('resource://gre/modules/Services.jsm');
+
+this.PdfJsTelemetry = {
+  onViewerIsUsed: function () {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_USED");
+    histogram.add(true);
+  },
+  onFallback: function () {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_FALLBACK_SHOWN");
+    histogram.add(true);
+  },
+  onDocumentSize: function (size) {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_DOCUMENT_SIZE_KB");
+    histogram.add(size / 1024);
+  },
+  onDocumentVersion: function (versionId) {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_DOCUMENT_VERSION");
+    histogram.add(versionId);
+  },
+  onDocumentGenerator: function (generatorId) {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_DOCUMENT_GENERATOR");
+    histogram.add(generatorId);
+  },
+  onForm: function (isAcroform) {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_FORM");
+    histogram.add(isAcroform);
+  },
+  onStreamType: function (streamTypeId) {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_STREAM_TYPES");
+    histogram.add(streamTypeId);
+  },
+  onTimeToView: function (ms) {
+    let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_TIME_TO_VIEW_MS");
+    histogram.add(ms);
+  }
+};
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -15,18 +15,18 @@
  * limitations under the License.
  */
 
 // Initializing PDFJS global object (if still undefined)
 if (typeof PDFJS === 'undefined') {
   (typeof window !== 'undefined' ? window : this).PDFJS = {};
 }
 
-PDFJS.version = '0.8.423';
-PDFJS.build = 'e2993a7';
+PDFJS.version = '0.8.478';
+PDFJS.build = '8a4a6f4';
 
 (function pdfjsWrapper() {
   // Use strict in our context only - users might not want it
   'use strict';
 
 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
 /* Copyright 2012 Mozilla Foundation
@@ -38,1146 +38,52 @@ PDFJS.build = 'e2993a7';
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/* globals assert, MissingDataException, isInt, NetworkManager, Promise,
-           isEmptyObj */
+/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref */
 
 'use strict';
 
-var ChunkedStream = (function ChunkedStreamClosure() {
-  function ChunkedStream(length, chunkSize, manager) {
-    this.bytes = new Uint8Array(length);
-    this.start = 0;
-    this.pos = 0;
-    this.end = length;
-    this.chunkSize = chunkSize;
-    this.loadedChunks = [];
-    this.numChunksLoaded = 0;
-    this.numChunks = Math.ceil(length / chunkSize);
-    this.manager = manager;
-  }
-
-  // required methods for a stream. if a particular stream does not
-  // implement these, an error should be thrown
-  ChunkedStream.prototype = {
-
-    getMissingChunks: function ChunkedStream_getMissingChunks() {
-      var chunks = [];
-      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
-        if (!(chunk in this.loadedChunks)) {
-          chunks.push(chunk);
-        }
-      }
-      return chunks;
-    },
-
-    getBaseStreams: function ChunkedStream_getBaseStreams() {
-      return [this];
-    },
-
-    allChunksLoaded: function ChunkedStream_allChunksLoaded() {
-      return this.numChunksLoaded === this.numChunks;
-    },
-
-    onReceiveData: function(begin, chunk) {
-      var end = begin + chunk.byteLength;
-
-      assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin);
-      // Using this.length is inaccurate here since this.start can be moved
-      // See ChunkedStream.moveStart()
-      var length = this.bytes.length;
-      assert(end % this.chunkSize === 0 || end === length,
-        'Bad end offset: ' + end);
-
-      this.bytes.set(new Uint8Array(chunk), begin);
-      var chunkSize = this.chunkSize;
-      var beginChunk = Math.floor(begin / chunkSize);
-      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
-
-      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-        if (!(chunk in this.loadedChunks)) {
-          this.loadedChunks[chunk] = true;
-          ++this.numChunksLoaded;
-        }
-      }
-    },
-
-    ensureRange: function ChunkedStream_ensureRange(begin, end) {
-      if (begin >= end) {
-        return;
-      }
-
-      var chunkSize = this.chunkSize;
-      var beginChunk = Math.floor(begin / chunkSize);
-      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
-      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-        if (!(chunk in this.loadedChunks)) {
-          throw new MissingDataException(begin, end);
-        }
-      }
-    },
-
-    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {
-      for (var chunk = beginChunk, n = this.numChunks; chunk < n; ++chunk) {
-        if (!(chunk in this.loadedChunks)) {
-          return chunk;
-        }
-      }
-      // Wrap around to beginning
-      for (var chunk = 0; chunk < beginChunk; ++chunk) {
-        if (!(chunk in this.loadedChunks)) {
-          return chunk;
-        }
-      }
-      return null;
-    },
-
-    hasChunk: function ChunkedStream_hasChunk(chunk) {
-      return chunk in this.loadedChunks;
-    },
-
-    get length() {
-      return this.end - this.start;
-    },
-
-    getByte: function ChunkedStream_getByte() {
-      var pos = this.pos;
-      if (pos >= this.end) {
-        return -1;
-      }
-      this.ensureRange(pos, pos + 1);
-      return this.bytes[this.pos++];
-    },
-
-    // returns subarray of original buffer
-    // should only be read
-    getBytes: function ChunkedStream_getBytes(length) {
-      var bytes = this.bytes;
-      var pos = this.pos;
-      var strEnd = this.end;
-
-      if (!length) {
-        this.ensureRange(pos, strEnd);
-        return bytes.subarray(pos, strEnd);
-      }
-
-      var end = pos + length;
-      if (end > strEnd)
-        end = strEnd;
-      this.ensureRange(pos, end);
-
-      this.pos = end;
-      return bytes.subarray(pos, end);
-    },
-
-    peekBytes: function ChunkedStream_peekBytes(length) {
-      var bytes = this.getBytes(length);
-      this.pos -= bytes.length;
-      return bytes;
-    },
-
-    getByteRange: function ChunkedStream_getBytes(begin, end) {
-      this.ensureRange(begin, end);
-      return this.bytes.subarray(begin, end);
-    },
-
-    skip: function ChunkedStream_skip(n) {
-      if (!n)
-        n = 1;
-      this.pos += n;
-    },
-
-    reset: function ChunkedStream_reset() {
-      this.pos = this.start;
-    },
-
-    moveStart: function ChunkedStream_moveStart() {
-      this.start = this.pos;
-    },
-
-    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {
-      function ChunkedStreamSubstream() {}
-      ChunkedStreamSubstream.prototype = Object.create(this);
-      ChunkedStreamSubstream.prototype.getMissingChunks = function() {
-        var chunkSize = this.chunkSize;
-        var beginChunk = Math.floor(this.start / chunkSize);
-        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
-        var missingChunks = [];
-        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-          if (!(chunk in this.loadedChunks)) {
-            missingChunks.push(chunk);
-          }
-        }
-        return missingChunks;
-      };
-      var subStream = new ChunkedStreamSubstream();
-      subStream.pos = subStream.start = start;
-      subStream.end = start + length || this.end;
-      subStream.dict = dict;
-      return subStream;
-    },
-
-    isStream: true
-  };
-
-  return ChunkedStream;
-})();
-
-var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
-
-  function ChunkedStreamManager(length, chunkSize, url, args) {
-    var self = this;
-    this.stream = new ChunkedStream(length, chunkSize, this);
-    this.length = length;
-    this.chunkSize = chunkSize;
-    this.url = url;
-    this.disableAutoFetch = args.disableAutoFetch;
-    var msgHandler = this.msgHandler = args.msgHandler;
-
-    if (args.chunkedViewerLoading) {
-      msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
-      msgHandler.on('OnDataProgress', this.onProgress.bind(this));
-      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
-        msgHandler.send('RequestDataRange', { begin: begin, end: end });
-      };
-    } else {
-
-      var getXhr = function getXhr() {
-        return new XMLHttpRequest();
-      };
-      this.networkManager = new NetworkManager(this.url, {
-        getXhr: getXhr,
-        httpHeaders: args.httpHeaders
-      });
-      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
-        this.networkManager.requestRange(begin, end, {
-          onDone: this.onReceiveData.bind(this),
-          onProgress: this.onProgress.bind(this)
-        });
-      };
-    }
-
-    this.currRequestId = 0;
-
-    this.chunksNeededByRequest = {};
-    this.requestsByChunk = {};
-    this.callbacksByRequest = {};
-
-    this.loadedStream = new Promise();
-  }
-
-  ChunkedStreamManager.prototype = {
-
-    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {
-      return this.loadedStream;
-    },
-
-    // Get all the chunks that are not yet loaded and groups them into
-    // contiguous ranges to load in as few requests as possible
-    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
-      var missingChunks = this.stream.getMissingChunks();
-      this.requestChunks(missingChunks);
-      return this.loadedStream;
-    },
-
-    requestChunks: function ChunkedStreamManager_requestChunks(chunks,
-                                                               callback) {
-      var requestId = this.currRequestId++;
-
-      var chunksNeeded;
-      this.chunksNeededByRequest[requestId] = chunksNeeded = {};
-      for (var i = 0, ii = chunks.length; i < ii; i++) {
-        if (!this.stream.hasChunk(chunks[i])) {
-          chunksNeeded[chunks[i]] = true;
-        }
-      }
-
-      if (isEmptyObj(chunksNeeded)) {
-        if (callback) {
-          callback();
-        }
-        return;
-      }
-
-      this.callbacksByRequest[requestId] = callback;
-
-      var chunksToRequest = [];
-      for (var chunk in chunksNeeded) {
-        chunk = chunk | 0;
-        if (!(chunk in this.requestsByChunk)) {
-          this.requestsByChunk[chunk] = [];
-          chunksToRequest.push(chunk);
-        }
-        this.requestsByChunk[chunk].push(requestId);
-      }
-
-      if (!chunksToRequest.length) {
-        return;
-      }
-
-      var groupedChunksToRequest = this.groupChunks(chunksToRequest);
-
-      for (var i = 0; i < groupedChunksToRequest.length; ++i) {
-        var groupedChunk = groupedChunksToRequest[i];
-        var begin = groupedChunk.beginChunk * this.chunkSize;
-        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
-        this.sendRequest(begin, end);
-      }
-    },
-
-    getStream: function ChunkedStreamManager_getStream() {
-      return this.stream;
-    },
-
-    // Loads any chunks in the requested range that are not yet loaded
-    requestRange: function ChunkedStreamManager_requestRange(
-                      begin, end, callback) {
-
-      end = Math.min(end, this.length);
-
-      var beginChunk = this.getBeginChunk(begin);
-      var endChunk = this.getEndChunk(end);
-
-      var chunks = [];
-      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-        chunks.push(chunk);
-      }
-
-      this.requestChunks(chunks, callback);
-    },
-
-    requestRanges: function ChunkedStreamManager_requestRanges(ranges,
-                                                               callback) {
-      ranges = ranges || [];
-      var chunksToRequest = [];
-
-      for (var i = 0; i < ranges.length; i++) {
-        var beginChunk = this.getBeginChunk(ranges[i].begin);
-        var endChunk = this.getEndChunk(ranges[i].end);
-        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-          if (chunksToRequest.indexOf(chunk) < 0) {
-            chunksToRequest.push(chunk);
-          }
-        }
-      }
-
-      chunksToRequest.sort(function(a, b) { return a - b; });
-      this.requestChunks(chunksToRequest, callback);
-    },
-
-    // Groups a sorted array of chunks into as few continguous larger
-    // chunks as possible
-    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {
-      var groupedChunks = [];
-      var beginChunk;
-      var prevChunk;
-      for (var i = 0; i < chunks.length; ++i) {
-        var chunk = chunks[i];
-
-        if (!beginChunk) {
-          beginChunk = chunk;
-        }
-
-        if (prevChunk && prevChunk + 1 !== chunk) {
-          groupedChunks.push({
-            beginChunk: beginChunk, endChunk: prevChunk + 1});
-          beginChunk = chunk;
-        }
-        if (i + 1 === chunks.length) {
-          groupedChunks.push({
-            beginChunk: beginChunk, endChunk: chunk + 1});
-        }
-
-        prevChunk = chunk;
-      }
-      return groupedChunks;
-    },
-
-    onProgress: function ChunkedStreamManager_onProgress(args) {
-      var bytesLoaded = this.stream.numChunksLoaded * this.chunkSize +
-                        args.loaded;
-      this.msgHandler.send('DocProgress', {
-        loaded: bytesLoaded,
-        total: this.length
-      });
-    },
-
-    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {
-      var chunk = args.chunk;
-      var begin = args.begin;
-      var end = begin + chunk.byteLength;
-
-      var beginChunk = this.getBeginChunk(begin);
-      var endChunk = this.getEndChunk(end);
-
-      this.stream.onReceiveData(begin, chunk);
-      if (this.stream.allChunksLoaded()) {
-        this.loadedStream.resolve(this.stream);
-      }
-
-      var loadedRequests = [];
-      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-
-        // The server might return more chunks than requested
-        var requestIds = this.requestsByChunk[chunk] || [];
-        delete this.requestsByChunk[chunk];
-
-        for (var i = 0; i < requestIds.length; ++i) {
-          var requestId = requestIds[i];
-          var chunksNeeded = this.chunksNeededByRequest[requestId];
-          if (chunk in chunksNeeded) {
-            delete chunksNeeded[chunk];
-          }
-
-          if (!isEmptyObj(chunksNeeded)) {
-            continue;
-          }
-
-          loadedRequests.push(requestId);
-        }
-      }
-
-      // If there are no pending requests, automatically fetch the next
-      // unfetched chunk of the PDF
-      if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) {
-        var nextEmptyChunk;
-        if (this.stream.numChunksLoaded === 1) {
-          // This is a special optimization so that after fetching the first
-          // chunk, rather than fetching the second chunk, we fetch the last
-          // chunk.
-          var lastChunk = this.stream.numChunks - 1;
-          if (!this.stream.hasChunk(lastChunk)) {
-            nextEmptyChunk = lastChunk;
-          }
-        } else {
-          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
-        }
-        if (isInt(nextEmptyChunk)) {
-          this.requestChunks([nextEmptyChunk]);
-        }
-      }
-
-      for (var i = 0; i < loadedRequests.length; ++i) {
-        var requestId = loadedRequests[i];
-        var callback = this.callbacksByRequest[requestId];
-        delete this.callbacksByRequest[requestId];
-        if (callback) {
-          callback();
-        }
-      }
-
-      this.msgHandler.send('DocProgress', {
-        loaded: this.stream.numChunksLoaded * this.chunkSize,
-        total: this.length
-      });
-    },
-
-    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {
-      var chunk = Math.floor(begin / this.chunkSize);
-      return chunk;
-    },
-
-    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {
-      if (end % this.chunkSize === 0) {
-        return end / this.chunkSize;
-      }
-
-      // 0 -> 0
-      // 1 -> 1
-      // 99 -> 1
-      // 100 -> 1
-      // 101 -> 2
-      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;
-      return chunk;
-    }
-  };
-
-  return ChunkedStreamManager;
-})();
-
-
-
-// TODO(mack): Make use of PDFJS.Util.inherit() when it becomes available
-var BasePdfManager = (function BasePdfManagerClosure() {
-  function BasePdfManager() {
-    throw new Error('Cannot initialize BaseManagerManager');
-  }
-
-  BasePdfManager.prototype = {
-    onLoadedStream: function BasePdfManager_onLoadedStream() {
-      throw new NotImplementedException();
-    },
-
-    ensureModel: function BasePdfManager_ensureModel(prop, args) {
-      return this.ensure(this.pdfModel, prop, args);
-    },
-
-    ensureXRef: function BasePdfManager_ensureXRef(prop, args) {
-      return this.ensure(this.pdfModel.xref, prop, args);
-    },
-
-    ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {
-      return this.ensure(this.pdfModel.catalog, prop, args);
-    },
-
-    getPage: function BasePdfManager_pagePage(pageIndex) {
-      return this.pdfModel.getPage(pageIndex);
-    },
-
-    ensure: function BasePdfManager_ensure(obj, prop, args) {
-      return new NotImplementedException();
-    },
-
-    requestRange: function BasePdfManager_ensure(begin, end) {
-      return new NotImplementedException();
-    },
-
-    requestLoadedStream: function BasePdfManager_requestLoadedStream() {
-      return new NotImplementedException();
-    },
-
-    updatePassword: function BasePdfManager_updatePassword(password) {
-      this.pdfModel.xref.password = this.password = password;
-      if (this.passwordChangedPromise) {
-        this.passwordChangedPromise.resolve();
-      }
-    }
-  };
-
-  return BasePdfManager;
-})();
-
-var LocalPdfManager = (function LocalPdfManagerClosure() {
-  function LocalPdfManager(data, password) {
-    var stream = new Stream(data);
-    this.pdfModel = new PDFDocument(this, stream, password);
-    this.loadedStream = new Promise();
-    this.loadedStream.resolve(stream);
-  }
-
-  LocalPdfManager.prototype = Object.create(BasePdfManager.prototype);
-  LocalPdfManager.prototype.constructor = LocalPdfManager;
-
-  LocalPdfManager.prototype.ensure =
-      function LocalPdfManager_ensure(obj, prop, args) {
-    var promise = new Promise();
-    try {
-      var value = obj[prop];
-      var result;
-      if (typeof(value) === 'function') {
-        result = value.apply(obj, args);
-      } else {
-        result = value;
-      }
-      promise.resolve(result);
-    } catch (e) {
-      console.log(e.stack);
-      promise.reject(e);
-    }
-    return promise;
-  };
-
-  LocalPdfManager.prototype.requestRange =
-      function LocalPdfManager_requestRange(begin, end) {
-    var promise = new Promise();
-    promise.resolve();
-    return promise;
-  };
-
-  LocalPdfManager.prototype.requestLoadedStream =
-      function LocalPdfManager_requestLoadedStream() {
-  };
-
-  LocalPdfManager.prototype.onLoadedStream =
-      function LocalPdfManager_getLoadedStream() {
-    return this.loadedStream;
-  };
-
-  return LocalPdfManager;
-})();
-
-var NetworkPdfManager = (function NetworkPdfManagerClosure() {
-
-  var CHUNK_SIZE = 65536;
-
-  function NetworkPdfManager(args, msgHandler) {
-
-    this.msgHandler = msgHandler;
-
-    var params = {
-      msgHandler: msgHandler,
-      httpHeaders: args.httpHeaders,
-      chunkedViewerLoading: args.chunkedViewerLoading,
-      disableAutoFetch: args.disableAutoFetch
-    };
-    this.streamManager = new ChunkedStreamManager(args.length, CHUNK_SIZE,
-                                                  args.url, params);
-
-    this.pdfModel = new PDFDocument(this, this.streamManager.getStream(),
-                                    args.password);
-  }
-
-  NetworkPdfManager.prototype = Object.create(BasePdfManager.prototype);
-  NetworkPdfManager.prototype.constructor = NetworkPdfManager;
-
-  NetworkPdfManager.prototype.ensure =
-      function NetworkPdfManager_ensure(obj, prop, args) {
-    var promise = new Promise();
-    this.ensureHelper(promise, obj, prop, args);
-    return promise;
-  };
-
-  NetworkPdfManager.prototype.ensureHelper =
-      function NetworkPdfManager_ensureHelper(promise, obj, prop, args) {
-    try {
-      var result;
-      var value = obj[prop];
-      if (typeof(value) === 'function') {
-        result = value.apply(obj, args);
-      } else {
-        result = value;
-      }
-      promise.resolve(result);
-    } catch(e) {
-      if (!(e instanceof MissingDataException)) {
-        console.log(e.stack);
-        promise.reject(e);
-        return;
-      }
-
-      this.streamManager.requestRange(e.begin, e.end, function() {
-        this.ensureHelper(promise, obj, prop, args);
-      }.bind(this));
-    }
-  };
-
-  NetworkPdfManager.prototype.requestRange =
-      function NetworkPdfManager_requestRange(begin, end) {
-    var promise = new Promise();
-    this.streamManager.requestRange(begin, end, function() {
-      promise.resolve();
-    });
-    return promise;
-  };
-
-  NetworkPdfManager.prototype.requestLoadedStream =
-      function NetworkPdfManager_requestLoadedStream() {
-    this.streamManager.requestAllChunks();
-  };
-
-  NetworkPdfManager.prototype.onLoadedStream =
-      function NetworkPdfManager_getLoadedStream() {
-    return this.streamManager.onLoadedStream();
-  };
-
-  return NetworkPdfManager;
-})();
-
-
-
 var globalScope = (typeof window === 'undefined') ? this : window;
 
 var isWorker = (typeof window == 'undefined');
 
 var ERRORS = 0, WARNINGS = 1, INFOS = 5;
 var verbosity = WARNINGS;
 
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+
+var TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+
 // The global PDFJS object exposes the API
 // In production, it will be declared outside a global wrapper
 // In development, it will be declared here
 if (!globalScope.PDFJS) {
   globalScope.PDFJS = {};
 }
 
 globalScope.PDFJS.pdfBug = false;
 
 
-var Page = (function PageClosure() {
-
-  function Page(pdfManager, xref, pageIndex, pageDict, ref) {
-    this.pdfManager = pdfManager;
-    this.pageIndex = pageIndex;
-    this.pageDict = pageDict;
-    this.xref = xref;
-    this.ref = ref;
-    this.idCounters = {
-      obj: 0
-    };
-    this.resourcesPromise = null;
-  }
-
-  Page.prototype = {
-    getPageProp: function Page_getPageProp(key) {
-      return this.pageDict.get(key);
-    },
-    inheritPageProp: function Page_inheritPageProp(key) {
-      var dict = this.pageDict;
-      var obj = dict.get(key);
-      while (obj === undefined) {
-        dict = dict.get('Parent');
-        if (!dict)
-          break;
-        obj = dict.get(key);
-      }
-      return obj;
-    },
-    get content() {
-      return this.getPageProp('Contents');
-    },
-    get resources() {
-      return shadow(this, 'resources', this.inheritPageProp('Resources'));
-    },
-    get mediaBox() {
-      var obj = this.inheritPageProp('MediaBox');
-      // Reset invalid media box to letter size.
-      if (!isArray(obj) || obj.length !== 4)
-        obj = [0, 0, 612, 792];
-      return shadow(this, 'mediaBox', obj);
-    },
-    get view() {
-      var mediaBox = this.mediaBox;
-      var cropBox = this.inheritPageProp('CropBox');
-      if (!isArray(cropBox) || cropBox.length !== 4)
-        return shadow(this, 'view', mediaBox);
-
-      // From the spec, 6th ed., p.963:
-      // "The crop, bleed, trim, and art boxes should not ordinarily
-      // extend beyond the boundaries of the media box. If they do, they are
-      // effectively reduced to their intersection with the media box."
-      cropBox = Util.intersect(cropBox, mediaBox);
-      if (!cropBox)
-        return shadow(this, 'view', mediaBox);
-
-      return shadow(this, 'view', cropBox);
-    },
-    get annotationRefs() {
-      return shadow(this, 'annotationRefs', this.inheritPageProp('Annots'));
-    },
-    get rotate() {
-      var rotate = this.inheritPageProp('Rotate') || 0;
-      // Normalize rotation so it's a multiple of 90 and between 0 and 270
-      if (rotate % 90 !== 0) {
-        rotate = 0;
-      } else if (rotate >= 360) {
-        rotate = rotate % 360;
-      } else if (rotate < 0) {
-        // The spec doesn't cover negatives, assume its counterclockwise
-        // rotation. The following is the other implementation of modulo.
-        rotate = ((rotate % 360) + 360) % 360;
-      }
-      return shadow(this, 'rotate', rotate);
-    },
-    getContentStream: function Page_getContentStream() {
-      var content = this.content;
-      var stream;
-      if (isArray(content)) {
-        // fetching items
-        var xref = this.xref;
-        var i, n = content.length;
-        var streams = [];
-        for (i = 0; i < n; ++i)
-          streams.push(xref.fetchIfRef(content[i]));
-        stream = new StreamsSequenceStream(streams);
-      } else if (isStream(content)) {
-        stream = content;
-      } else {
-        // replacing non-existent page content with empty one
-        stream = new NullStream();
-      }
-      return stream;
-    },
-    loadResources: function(keys) {
-      if (!this.resourcesPromise) {
-        // TODO: add async inheritPageProp and remove this.
-        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
-      }
-      var promise = new Promise();
-      this.resourcesPromise.then(function resourceSuccess() {
-        var objectLoader = new ObjectLoader(this.resources.map,
-                                            keys,
-                                            this.xref);
-        objectLoader.load().then(function objectLoaderSuccess() {
-          promise.resolve();
-        });
-      }.bind(this));
-      return promise;
-    },
-    getOperatorList: function Page_getOperatorList(handler) {
-      var self = this;
-      var promise = new Promise();
-
-      function reject(e) {
-        promise.reject(e);
-      }
-
-      var pageListPromise = new Promise();
-
-      var pdfManager = this.pdfManager;
-      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
-                                                   []);
-      var resourcesPromise = this.loadResources([
-        'ExtGState',
-        'ColorSpace',
-        'Pattern',
-        'Shading',
-        'XObject',
-        'Font',
-        // ProcSet
-        // Properties
-      ]);
-
-      var partialEvaluator = new PartialEvaluator(
-            pdfManager, this.xref, handler,
-            this.pageIndex, 'p' + this.pageIndex + '_',
-            this.idCounters);
-
-      var dataPromises = Promise.all(
-          [contentStreamPromise, resourcesPromise], reject);
-      dataPromises.then(function(data) {
-        var contentStream = data[0];
-
-
-        var opList = new OperatorList(handler, self.pageIndex);
-
-        handler.send('StartRenderPage', {
-          transparency: partialEvaluator.hasBlendModes(self.resources),
-          pageIndex: self.pageIndex
-        });
-        partialEvaluator.getOperatorList(contentStream, self.resources, opList);
-        pageListPromise.resolve(opList);
-      });
-
-      var annotationsPromise = pdfManager.ensure(this, 'annotations');
-      Promise.all([pageListPromise, annotationsPromise]).then(function(datas) {
-        var pageOpList = datas[0];
-        var annotations = datas[1];
-
-        if (annotations.length === 0) {
-          PartialEvaluator.optimizeQueue(pageOpList);
-          pageOpList.flush(true);
-          promise.resolve(pageOpList);
-          return;
-        }
-
-        var annotationsReadyPromise = Annotation.appendToOperatorList(
-          annotations, pageOpList, pdfManager, partialEvaluator);
-        annotationsReadyPromise.then(function () {
-          PartialEvaluator.optimizeQueue(pageOpList);
-          pageOpList.flush(true);
-          promise.resolve(pageOpList);
-        }, reject);
-      }, reject);
-
-      return promise;
-    },
-    extractTextContent: function Page_extractTextContent() {
-      var handler = {
-        on: function nullHandlerOn() {},
-        send: function nullHandlerSend() {}
-      };
-
-      var self = this;
-
-      var textContentPromise = new Promise();
-
-      var pdfManager = this.pdfManager;
-      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
-                                                   []);
-
-      var resourcesPromise = this.loadResources([
-        'ExtGState',
-        'XObject',
-        'Font'
-      ]);
-
-      var dataPromises = Promise.all([contentStreamPromise,
-                                      resourcesPromise]);
-      dataPromises.then(function(data) {
-        var contentStream = data[0];
-        var partialEvaluator = new PartialEvaluator(
-              pdfManager, self.xref, handler,
-              self.pageIndex, 'p' + self.pageIndex + '_',
-              self.idCounters);
-
-        var bidiTexts = partialEvaluator.getTextContent(contentStream,
-                                                        self.resources);
-        textContentPromise.resolve(bidiTexts);
-      });
-
-      return textContentPromise;
-    },
-
-    getAnnotationsData: function Page_getAnnotationsData() {
-      var annotations = this.annotations;
-      var annotationsData = [];
-      for (var i = 0, n = annotations.length; i < n; ++i) {
-        annotationsData.push(annotations[i].getData());
-      }
-      return annotationsData;
-    },
-
-    get annotations() {
-      var annotations = [];
-      var annotationRefs = this.annotationRefs || [];
-      for (var i = 0, n = annotationRefs.length; i < n; ++i) {
-        var annotationRef = annotationRefs[i];
-        var annotation = Annotation.fromRef(this.xref, annotationRef);
-        if (annotation) {
-          annotations.push(annotation);
-        }
-      }
-      return shadow(this, 'annotations', annotations);
-    }
-  };
-
-  return Page;
-})();
-
-/**
- * The `PDFDocument` holds all the data of the PDF file. Compared to the
- * `PDFDoc`, this one doesn't have any job management code.
- * Right now there exists one PDFDocument on the main thread + one object
- * for each worker. If there is no worker support enabled, there are two
- * `PDFDocument` objects on the main thread created.
- */
-var PDFDocument = (function PDFDocumentClosure() {
-  function PDFDocument(pdfManager, arg, password) {
-    if (isStream(arg))
-      init.call(this, pdfManager, arg, password);
-    else if (isArrayBuffer(arg))
-      init.call(this, pdfManager, new Stream(arg), password);
-    else
-      error('PDFDocument: Unknown argument type');
-  }
-
-  function init(pdfManager, stream, password) {
-    assertWellFormed(stream.length > 0, 'stream must have data');
-    this.pdfManager = pdfManager;
-    this.stream = stream;
-    var xref = new XRef(this.stream, password, pdfManager);
-    this.xref = xref;
-  }
-
-  function find(stream, needle, limit, backwards) {
-    var pos = stream.pos;
-    var end = stream.end;
-    var str = '';
-    if (pos + limit > end)
-      limit = end - pos;
-    for (var n = 0; n < limit; ++n)
-      str += String.fromCharCode(stream.getByte());
-    stream.pos = pos;
-    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
-    if (index == -1)
-      return false; /* not found */
-    stream.pos += index;
-    return true; /* found */
-  }
-
-  var DocumentInfoValidators = {
-    get entries() {
-      // Lazily build this since all the validation functions below are not
-      // defined until after this file loads.
-      return shadow(this, 'entries', {
-        Title: isString,
-        Author: isString,
-        Subject: isString,
-        Keywords: isString,
-        Creator: isString,
-        Producer: isString,
-        CreationDate: isString,
-        ModDate: isString,
-        Trapped: isName
-      });
-    }
-  };
-
-  PDFDocument.prototype = {
-    parse: function PDFDocument_parse(recoveryMode) {
-      this.setup(recoveryMode);
-      this.acroForm = this.catalog.catDict.get('AcroForm');
-    },
-
-    get linearization() {
-      var length = this.stream.length;
-      var linearization = false;
-      if (length) {
-        try {
-          linearization = new Linearization(this.stream);
-          if (linearization.length != length) {
-            linearization = false;
-          }
-        } catch (err) {
-          if (err instanceof MissingDataException) {
-            throw err;
-          }
-
-          info('The linearization data is not available ' +
-               'or unreadable PDF data is found');
-          linearization = false;
-        }
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'linearization', linearization);
-    },
-    get startXRef() {
-      var stream = this.stream;
-      var startXRef = 0;
-      var linearization = this.linearization;
-      if (linearization) {
-        // Find end of first obj.
-        stream.reset();
-        if (find(stream, 'endobj', 1024))
-          startXRef = stream.pos + 6;
-      } else {
-        // Find startxref by jumping backward from the end of the file.
-        var step = 1024;
-        var found = false, pos = stream.end;
-        while (!found && pos > 0) {
-          pos -= step - 'startxref'.length;
-          if (pos < 0)
-            pos = 0;
-          stream.pos = pos;
-          found = find(stream, 'startxref', step, true);
-        }
-        if (found) {
-          stream.skip(9);
-          var ch;
-          do {
-            ch = stream.getByte();
-          } while (Lexer.isSpace(ch));
-          var str = '';
-          while (ch >= 0x20 && ch <= 0x39) { // < '9'
-            str += String.fromCharCode(ch);
-            ch = stream.getByte();
-          }
-          startXRef = parseInt(str, 10);
-          if (isNaN(startXRef))
-            startXRef = 0;
-        }
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'startXRef', startXRef);
-    },
-    get mainXRefEntriesOffset() {
-      var mainXRefEntriesOffset = 0;
-      var linearization = this.linearization;
-      if (linearization)
-        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
-      // shadow the prototype getter with a data property
-      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
-    },
-    // Find the header, remove leading garbage and setup the stream
-    // starting from the header.
-    checkHeader: function PDFDocument_checkHeader() {
-      var stream = this.stream;
-      stream.reset();
-      if (find(stream, '%PDF-', 1024)) {
-        // Found the header, trim off any garbage before it.
-        stream.moveStart();
-        // Reading file format version
-        var MAX_VERSION_LENGTH = 12;
-        var version = '', ch;
-        while ((ch = stream.getByte()) > 0x20) { // SPACE
-          if (version.length >= MAX_VERSION_LENGTH) {
-            break;
-          }
-          version += String.fromCharCode(ch);
-        }
-        // removing "%PDF-"-prefix
-        this.pdfFormatVersion = version.substring(5);
-        return;
-      }
-      // May not be a PDF file, continue anyway.
-    },
-    parseStartXRef: function PDFDocument_parseStartXRef() {
-      var startXRef = this.startXRef;
-      this.xref.setStartXRef(startXRef);
-    },
-    setup: function PDFDocument_setup(recoveryMode) {
-      this.xref.parse(recoveryMode);
-      this.catalog = new Catalog(this.pdfManager, this.xref);
-    },
-    get numPages() {
-      var linearization = this.linearization;
-      var num = linearization ? linearization.numPages : this.catalog.numPages;
-      // shadow the prototype getter
-      return shadow(this, 'numPages', num);
-    },
-    get documentInfo() {
-      var docInfo = {
-        PDFFormatVersion: this.pdfFormatVersion,
-        IsAcroFormPresent: !!this.acroForm
-      };
-      var infoDict;
-      try {
-        infoDict = this.xref.trailer.get('Info');
-      } catch (err) {
-        info('The document information dictionary is invalid.');
-      }
-      if (infoDict) {
-        var validEntries = DocumentInfoValidators.entries;
-        // Only fill the document info with valid entries from the spec.
-        for (var key in validEntries) {
-          if (infoDict.has(key)) {
-            var value = infoDict.get(key);
-            // Make sure the value conforms to the spec.
-            if (validEntries[key](value)) {
-              docInfo[key] = typeof value !== 'string' ? value :
-                stringToPDFString(value);
-            } else {
-              info('Bad value in document info for "' + key + '"');
-            }
-          }
-        }
-      }
-      return shadow(this, 'documentInfo', docInfo);
-    },
-    get fingerprint() {
-      var xref = this.xref, fileID;
-      if (xref.trailer.has('ID')) {
-        fileID = '';
-        var id = xref.trailer.get('ID')[0];
-        id.split('').forEach(function(el) {
-          fileID += Number(el.charCodeAt(0)).toString(16);
-        });
-      } else {
-        // If we got no fileID, then we generate one,
-        // from the first 100 bytes of PDF
-        var data = this.stream.bytes.subarray(0, 100);
-        var hash = calculateMD5(data, 0, data.length);
-        fileID = '';
-        for (var i = 0, length = hash.length; i < length; i++) {
-          fileID += Number(hash[i]).toString(16);
-        }
-      }
-
-      return shadow(this, 'fingerprint', fileID);
-    },
-
-    traversePages: function PDFDocument_traversePages() {
-      this.catalog.traversePages();
-    },
-
-    getPage: function PDFDocument_getPage(pageIndex) {
-      return this.catalog.getPage(pageIndex);
-    }
-  };
-
-  return PDFDocument;
-})();
-
-
-
 // Use only for debugging purposes. This should not be used in any code that is
 // in mozilla master.
 var log = (function() {
   if ('console' in globalScope && 'log' in globalScope['console']) {
     return globalScope['console']['log'].bind(globalScope['console']);
   } else {
     return function nop() {
     };
@@ -1615,16 +521,31 @@ var Util = PDFJS.Util = (function UtilCl
   Util.inherit = function Util_inherit(sub, base, prototype) {
     sub.prototype = Object.create(base.prototype);
     sub.prototype.constructor = sub;
     for (var prop in prototype) {
       sub.prototype[prop] = prototype[prop];
     }
   };
 
+  Util.loadScript = function Util_loadScript(src, callback) {
+    var script = document.createElement('script');
+    var loaded = false;
+    script.setAttribute('src', src);
+    if (callback) {
+      script.onload = function() {
+        if (!loaded) {
+          callback();
+        }
+        loaded = true;
+      };
+    }
+    document.getElementsByTagName('head')[0].appendChild(script);
+  };
+
   return Util;
 })();
 
 var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
   function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
     this.viewBox = viewBox;
     this.scale = scale;
     this.rotation = rotation;
@@ -2098,12648 +1019,108 @@ PDFJS.createBlob = function createBlob(d
   if (typeof Blob === 'function')
     return new Blob([data], { type: contentType });
   // Blob builder is deprecated in FF14 and removed in FF18.
   var bb = new MozBlobBuilder();
   bb.append(data);
   return bb.getBlob(contentType);
 };
 
-
-/**
- * The maximum allowed image size in total pixels e.g. width * height. Images
- * above this value will not be drawn. Use -1 for no limit.
- * @var {Number}
- */
-PDFJS.maxImageSize = PDFJS.maxImageSize === undefined ? -1 : PDFJS.maxImageSize;
-
-/**
- * This is the main entry point for loading a PDF and interacting with it.
- * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
- * is used, which means it must follow the same origin rules that any XHR does
- * e.g. No cross domain requests without CORS.
- *
- * @param {string|TypedAray|object} source Can be an url to where a PDF is
- * located, a typed array (Uint8Array) already populated with data or
- * and parameter object with the following possible fields:
- *  - url   - The URL of the PDF.
- *  - data  - A typed array with PDF data.
- *  - httpHeaders - Basic authentication headers.
- *  - password - For decrypting password-protected PDFs.
- *
- * @param {object} pdfDataRangeTransport is optional. It is used if you want
- * to manually serve range requests for data in the PDF. See viewer.js for
- * an example of pdfDataRangeTransport's interface.
- *
- * @param {function} passwordCallback is optional. It is used to request a
- * password if wrong or no password was provided. The callback receives two
- * parameters: function that needs to be called with new password and reason
- * (see {PasswordResponses}).
- *
- * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
- */
-PDFJS.getDocument = function getDocument(source,
-                                         pdfDataRangeTransport,
-                                         passwordCallback,
-                                         progressCallback) {
-  var workerInitializedPromise, workerReadyPromise, transport;
-
-  if (typeof source === 'string') {
-    source = { url: source };
-  } else if (isArrayBuffer(source)) {
-    source = { data: source };
-  } else if (typeof source !== 'object') {
-    error('Invalid parameter in getDocument, need either Uint8Array, ' +
-          'string or a parameter object');
-  }
-
-  if (!source.url && !source.data)
-    error('Invalid parameter array, need either .data or .url');
-
-  // copy/use all keys as is except 'url' -- full path is required
-  var params = {};
-  for (var key in source) {
-    if (key === 'url' && typeof window !== 'undefined') {
-      params[key] = combineUrl(window.location.href, source[key]);
-      continue;
-    }
-    params[key] = source[key];
-  }
-
-  workerInitializedPromise = new PDFJS.Promise();
-  workerReadyPromise = new PDFJS.Promise();
-  transport = new WorkerTransport(workerInitializedPromise,
-      workerReadyPromise, pdfDataRangeTransport, progressCallback);
-  workerInitializedPromise.then(function transportInitialized() {
-    transport.passwordCallback = passwordCallback;
-    transport.fetchDocument(params);
-  });
-  return workerReadyPromise;
-};
-
-/**
- * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
- * properties that can be read synchronously.
- */
-var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
-  function PDFDocumentProxy(pdfInfo, transport) {
-    this.pdfInfo = pdfInfo;
-    this.transport = transport;
-  }
-  PDFDocumentProxy.prototype = {
-    /**
-     * @return {number} Total number of pages the PDF contains.
-     */
-    get numPages() {
-      return this.pdfInfo.numPages;
-    },
-    /**
-     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
-     * unique.
-     */
-    get fingerprint() {
-      return this.pdfInfo.fingerprint;
-    },
-    /**
-     * @return {boolean} true if embedded document fonts are in use. Will be
-     * set during rendering of the pages.
-     */
-    get embeddedFontsUsed() {
-      return this.transport.embeddedFontsUsed;
-    },
-    /**
-     * @param {number} The page number to get. The first page is 1.
-     * @return {Promise} A promise that is resolved with a {PDFPageProxy}
-     * object.
-     */
-    getPage: function PDFDocumentProxy_getPage(number) {
-      return this.transport.getPage(number);
-    },
-    /**
-     * @return {Promise} A promise that is resolved with a lookup table for
-     * mapping named destinations to reference numbers.
-     */
-    getDestinations: function PDFDocumentProxy_getDestinations() {
-      return this.transport.getDestinations();
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an array of all the
-     * JavaScript strings in the name tree.
-     */
-    getJavaScript: function PDFDocumentProxy_getDestinations() {
-      var promise = new PDFJS.Promise();
-      var js = this.pdfInfo.javaScript;
-      promise.resolve(js);
-      return promise;
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an {array} that is a
-     * tree outline (if it has one) of the PDF. The tree is in the format of:
-     * [
-     *  {
-     *   title: string,
-     *   bold: boolean,
-     *   italic: boolean,
-     *   color: rgb array,
-     *   dest: dest obj,
-     *   items: array of more items like this
-     *  },
-     *  ...
-     * ].
-     */
-    getOutline: function PDFDocumentProxy_getOutline() {
-      var promise = new PDFJS.Promise();
-      var outline = this.pdfInfo.outline;
-      promise.resolve(outline);
-      return promise;
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an {object} that has
-     * info and metadata properties.  Info is an {object} filled with anything
-     * available in the information dictionary and similarly metadata is a
-     * {Metadata} object with information from the metadata section of the PDF.
-     */
-    getMetadata: function PDFDocumentProxy_getMetadata() {
-      var promise = new PDFJS.Promise();
-      var info = this.pdfInfo.info;
-      var metadata = this.pdfInfo.metadata;
-      promise.resolve({
-        info: info,
-        metadata: metadata ? new PDFJS.Metadata(metadata) : null
-      });
-      return promise;
-    },
-    isEncrypted: function PDFDocumentProxy_isEncrypted() {
-      var promise = new PDFJS.Promise();
-      promise.resolve(this.pdfInfo.encrypted);
-      return promise;
-    },
-    /**
-     * @return {Promise} A promise that is resolved with a TypedArray that has
-     * the raw data from the PDF.
-     */
-    getData: function PDFDocumentProxy_getData() {
-      var promise = new PDFJS.Promise();
-      this.transport.getData(promise);
-      return promise;
-    },
-    /**
-     * @return {Promise} A promise that is resolved when the document's data
-     * is loaded
-     */
-    dataLoaded: function PDFDocumentProxy_dataLoaded() {
-      return this.transport.dataLoaded();
-    },
-    destroy: function PDFDocumentProxy_destroy() {
-      this.transport.destroy();
-    }
-  };
-  return PDFDocumentProxy;
-})();
-
-var PDFPageProxy = (function PDFPageProxyClosure() {
-  function PDFPageProxy(pageInfo, transport) {
-    this.pageInfo = pageInfo;
-    this.transport = transport;
-    this.stats = new StatTimer();
-    this.stats.enabled = !!globalScope.PDFJS.enableStats;
-    this.commonObjs = transport.commonObjs;
-    this.objs = new PDFObjects();
-    this.receivingOperatorList  = false;
-    this.cleanupAfterRender = false;
-    this.pendingDestroy = false;
-    this.renderTasks = [];
+function MessageHandler(name, comObj) {
+  this.name = name;
+  this.comObj = comObj;
+  this.callbackIndex = 1;
+  var callbacks = this.callbacks = {};
+  var ah = this.actionHandler = {};
+
+  ah['console_log'] = [function ahConsoleLog(data) {
+    log.apply(null, data);
+  }];
+  // If there's no console available, console_error in the
+  // action handler will do nothing.
+  if ('console' in globalScope) {
+    ah['console_error'] = [function ahConsoleError(data) {
+      globalScope['console'].error.apply(null, data);
+    }];
+  } else {
+    ah['console_error'] = [function ahConsoleError(data) {
+      log.apply(null, data);
+    }];
   }
-  PDFPageProxy.prototype = {
-    /**
-     * @return {number} Page number of the page. First page is 1.
-     */
-    get pageNumber() {
-      return this.pageInfo.pageIndex + 1;
-    },
-    /**
-     * @return {number} The number of degrees the page is rotated clockwise.
-     */
-    get rotate() {
-      return this.pageInfo.rotate;
-    },
-    /**
-     * @return {object} The reference that points to this page. It has 'num' and
-     * 'gen' properties.
-     */
-    get ref() {
-      return this.pageInfo.ref;
-    },
-    /**
-     * @return {array} An array of the visible portion of the PDF page in the
-     * user space units - [x1, y1, x2, y2].
-     */
-    get view() {
-      return this.pageInfo.view;
-    },
-    /**
-     * @param {number} scale The desired scale of the viewport.
-     * @param {number} rotate Degrees to rotate the viewport. If omitted this
-     * defaults to the page rotation.
-     * @return {PageViewport} Contains 'width' and 'height' properties along
-     * with transforms required for rendering.
-     */
-    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
-      if (arguments.length < 2)
-        rotate = this.rotate;
-      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an {array} of the
-     * annotation objects.
-     */
-    getAnnotations: function PDFPageProxy_getAnnotations() {
-      if (this.annotationsPromise)
-        return this.annotationsPromise;
-
-      var promise = new PDFJS.Promise();
-      this.annotationsPromise = promise;
-      this.transport.getAnnotations(this.pageInfo.pageIndex);
-      return promise;
-    },
-    /**
-     * Begins the process of rendering a page to the desired context.
-     * @param {object} params A parameter object that supports:
-     * {
-     *   canvasContext(required): A 2D context of a DOM Canvas object.,
-     *   textLayer(optional): An object that has beginLayout, endLayout, and
-     *                        appendText functions.,
-     *   imageLayer(optional): An object that has beginLayout, endLayout and
-     *                         appendImage functions.,
-     *   continueCallback(optional): A function that will be called each time
-     *                               the rendering is paused.  To continue
-     *                               rendering call the function that is the
-     *                               first argument to the callback.
-     * }.
-     * @return {RenderTask} An extended promise that is resolved when the page
-     * finishes rendering (see RenderTask).
-     */
-    render: function PDFPageProxy_render(params) {
-      var stats = this.stats;
-      stats.time('Overall');
-
-      // If there was a pending destroy cancel it so no cleanup happens during
-      // this call to render.
-      this.pendingDestroy = false;
-
-      // If there is no displayReadyPromise yet, then the operatorList was never
-      // requested before. Make the request and create the promise.
-      if (!this.displayReadyPromise) {
-        this.receivingOperatorList = true;
-        this.displayReadyPromise = new Promise();
-        this.operatorList = {
-          fnArray: [],
-          argsArray: [],
-          lastChunk: false
-        };
-
-        this.stats.time('Page Request');
-        this.transport.messageHandler.send('RenderPageRequest', {
-          pageIndex: this.pageNumber - 1
-        });
-      }
-
-      var internalRenderTask = new InternalRenderTask(complete, params,
-                                       this.objs, this.commonObjs,
-                                       this.operatorList, this.pageNumber);
-      this.renderTasks.push(internalRenderTask);
-      var renderTask = new RenderTask(internalRenderTask);
-
-      var self = this;
-      this.displayReadyPromise.then(
-        function pageDisplayReadyPromise(transparency) {
-          if (self.pendingDestroy) {
-            complete();
-            return;
-          }
-          stats.time('Rendering');
-          internalRenderTask.initalizeGraphics(transparency);
-          internalRenderTask.operatorListChanged();
-        },
-        function pageDisplayReadPromiseError(reason) {
-          complete(reason);
-        }
-      );
-
-      function complete(error) {
-        var i = self.renderTasks.indexOf(internalRenderTask);
-        if (i >= 0) {
-            self.renderTasks.splice(i, 1);
-        }
-
-        if (self.cleanupAfterRender) {
-          self.pendingDestroy = true;
-        }
-        self._tryDestroy();
-
-        if (error) {
-          renderTask.reject(error);
-        } else {
-          renderTask.resolve();
-        }
-        stats.timeEnd('Rendering');
-        stats.timeEnd('Overall');
-      }
-
-      return renderTask;
-    },
-    /**
-     * @return {Promise} That is resolved with the a {string} that is the text
-     * content from the page.
-     */
-    getTextContent: function PDFPageProxy_getTextContent() {
-      var promise = new PDFJS.Promise();
-      this.transport.messageHandler.send('GetTextContent', {
-          pageIndex: this.pageNumber - 1
-        },
-        function textContentCallback(textContent) {
-          promise.resolve(textContent);
-        }
-      );
-      return promise;
-    },
-    /**
-     * Stub for future feature.
-     */
-    getOperationList: function PDFPageProxy_getOperationList() {
-      var promise = new PDFJS.Promise();
-      var operationList = { // not implemented
-        dependencyFontsID: null,
-        operatorList: null
-      };
-      promise.resolve(operationList);
-      return promise;
-    },
-    /**
-     * Destroys resources allocated by the page.
-     */
-    destroy: function PDFPageProxy_destroy() {
-      this.pendingDestroy = true;
-      this._tryDestroy();
-    },
-    /**
-     * For internal use only. Attempts to clean up if rendering is in a state
-     * where that's possible.
-     */
-    _tryDestroy: function PDFPageProxy__destroy() {
-      if (!this.pendingDestroy ||
-          this.renderTasks.length !== 0 ||
-          this.receivingOperatorList) {
-        return;
-      }
-
-      delete this.operatorList;
-      delete this.displayReadyPromise;
-      this.objs.clear();
-      this.pendingDestroy = false;
-    },
-    /**
-     * For internal use only.
-     */
-    _startRenderPage: function PDFPageProxy_startRenderPage(transparency) {
-      this.displayReadyPromise.resolve(transparency);
-    },
-    /**
-     * For internal use only.
-     */
-    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk) {
-      // Add the new chunk to the current operator list.
-      Util.concatenateToArray(this.operatorList.fnArray,
-                              operatorListChunk.fnArray);
-      Util.concatenateToArray(this.operatorList.argsArray,
-                              operatorListChunk.argsArray);
-      this.operatorList.lastChunk = operatorListChunk.lastChunk;
-
-      // Notify all the rendering tasks there are more operators to be consumed.
-      for (var i = 0; i < this.renderTasks.length; i++) {
-        this.renderTasks[i].operatorListChanged();
-      }
-
-      if (operatorListChunk.lastChunk) {
-        this.receivingOperatorList = false;
-        this._tryDestroy();
-      }
-    }
-  };
-  return PDFPageProxy;
-})();
-/**
- * For internal use only.
- */
-var WorkerTransport = (function WorkerTransportClosure() {
-  function WorkerTransport(workerInitializedPromise, workerReadyPromise,
-      pdfDataRangeTransport, progressCallback) {
-    this.pdfDataRangeTransport = pdfDataRangeTransport;
-
-    this.workerReadyPromise = workerReadyPromise;
-    this.progressCallback = progressCallback;
-    this.commonObjs = new PDFObjects();
-
-    this.pageCache = [];
-    this.pagePromises = [];
-    this.embeddedFontsUsed = false;
-
-    this.passwordCallback = null;
-
-    // If worker support isn't disabled explicit and the browser has worker
-    // support, create a new web worker and test if it/the browser fullfills
-    // all requirements to run parts of pdf.js in a web worker.
-    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
-    // as it arrives on the worker. Chrome added this with version 15.
-    if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
-      var workerSrc = PDFJS.workerSrc;
-      if (typeof workerSrc === 'undefined') {
-        error('No PDFJS.workerSrc specified');
-      }
-
-      try {
-        // Some versions of FF can't create a worker on localhost, see:
-        // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
-        var worker = new Worker(workerSrc);
-        var messageHandler = new MessageHandler('main', worker);
-        this.messageHandler = messageHandler;
-
-        messageHandler.on('test', function transportTest(supportTypedArray) {
-          if (supportTypedArray) {
-            this.worker = worker;
-            this.setupMessageHandler(messageHandler);
-          } else {
-            globalScope.PDFJS.disableWorker = true;
-            this.setupFakeWorker();
-          }
-          workerInitializedPromise.resolve();
-        }.bind(this));
-
-        var testObj = new Uint8Array(1);
-        // Some versions of Opera throw a DATA_CLONE_ERR on
-        // serializing the typed array.
-        messageHandler.send('test', testObj);
-        return;
-      } catch (e) {
-        info('The worker has been disabled.');
-      }
-    }
-    // Either workers are disabled, not supported or have thrown an exception.
-    // Thus, we fallback to a faked worker.
-    globalScope.PDFJS.disableWorker = true;
-    this.setupFakeWorker();
-    workerInitializedPromise.resolve();
-  }
-  WorkerTransport.prototype = {
-    destroy: function WorkerTransport_destroy() {
-      this.pageCache = [];
-      this.pagePromises = [];
-      var self = this;
-      this.messageHandler.send('Terminate', null, function () {
-        if (self.worker) {
-          self.worker.terminate();
-        }
-      });
-    },
-    setupFakeWorker: function WorkerTransport_setupFakeWorker() {
-      warn('Setting up fake worker.');
-      // If we don't use a worker, just post/sendMessage to the main thread.
-      var fakeWorker = {
-        postMessage: function WorkerTransport_postMessage(obj) {
-          fakeWorker.onmessage({data: obj});
-        },
-        terminate: function WorkerTransport_terminate() {}
-      };
-
-      var messageHandler = new MessageHandler('main', fakeWorker);
-      this.setupMessageHandler(messageHandler);
-
-      // If the main thread is our worker, setup the handling for the messages
-      // the main thread sends to it self.
-      WorkerMessageHandler.setup(messageHandler);
-    },
-
-    setupMessageHandler:
-      function WorkerTransport_setupMessageHandler(messageHandler) {
-      this.messageHandler = messageHandler;
-
-      function updatePassword(password) {
-        messageHandler.send('UpdatePassword', password);
-      }
-
-      var pdfDataRangeTransport = this.pdfDataRangeTransport;
-      if (pdfDataRangeTransport) {
-        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
-          messageHandler.send('OnDataRange', {
-            begin: begin,
-            chunk: chunk
-          });
-        });
-
-        pdfDataRangeTransport.addProgressListener(function(loaded) {
-          messageHandler.send('OnDataProgress', {
-            loaded: loaded
+  ah['_warn'] = [function ah_Warn(data) {
+    warn(data);
+  }];
+
+  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+    var data = event.data;
+    if (data.isReply) {
+      var callbackId = data.callbackId;
+      if (data.callbackId in callbacks) {
+        var callback = callbacks[callbackId];
+        delete callbacks[callbackId];
+        callback(data.data);
+      } else {
+        error('Cannot resolve callback ' + callbackId);
+      }
+    } else if (data.action in ah) {
+      var action = ah[data.action];
+      if (data.callbackId) {
+        var promise = new Promise();
+        promise.then(function(resolvedData) {
+          comObj.postMessage({
+            isReply: true,
+            callbackId: data.callbackId,
+            data: resolvedData
           });
         });
-
-        messageHandler.on('RequestDataRange',
-          function transportDataRange(data) {
-            pdfDataRangeTransport.requestDataRange(data.begin, data.end);
-          }, this);
-      }
-
-      messageHandler.on('GetDoc', function transportDoc(data) {
-        var pdfInfo = data.pdfInfo;
-        var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
-        this.pdfDocument = pdfDocument;
-        this.workerReadyPromise.resolve(pdfDocument);
-      }, this);
-
-      messageHandler.on('NeedPassword', function transportPassword(data) {
-        if (this.passwordCallback) {
-          return this.passwordCallback(updatePassword,
-                                       PasswordResponses.NEED_PASSWORD);
-        }
-        this.workerReadyPromise.reject(data.exception.message, data.exception);
-      }, this);
-
-      messageHandler.on('IncorrectPassword', function transportBadPass(data) {
-        if (this.passwordCallback) {
-          return this.passwordCallback(updatePassword,
-                                       PasswordResponses.INCORRECT_PASSWORD);
-        }
-        this.workerReadyPromise.reject(data.exception.message, data.exception);
-      }, this);
-
-      messageHandler.on('InvalidPDF', function transportInvalidPDF(data) {
-        this.workerReadyPromise.reject(data.exception.name, data.exception);
-      }, this);
-
-      messageHandler.on('MissingPDF', function transportMissingPDF(data) {
-        this.workerReadyPromise.reject(data.exception.message, data.exception);
-      }, this);
-
-      messageHandler.on('UnknownError', function transportUnknownError(data) {
-        this.workerReadyPromise.reject(data.exception.message, data.exception);
-      }, this);
-
-      messageHandler.on('GetPage', function transportPage(data) {
-        var pageInfo = data.pageInfo;
-        var page = new PDFPageProxy(pageInfo, this);
-        this.pageCache[pageInfo.pageIndex] = page;
-        var promise = this.pagePromises[pageInfo.pageIndex];
-        promise.resolve(page);
-      }, this);
-
-      messageHandler.on('GetAnnotations', function transportAnnotations(data) {
-        var annotations = data.annotations;
-        var promise = this.pageCache[data.pageIndex].annotationsPromise;
-        promise.resolve(annotations);
-      }, this);
-
-      messageHandler.on('StartRenderPage', function transportRender(data) {
-        var page = this.pageCache[data.pageIndex];
-
-        page.stats.timeEnd('Page Request');
-        page._startRenderPage(data.transparency);
-      }, this);
-
-      messageHandler.on('RenderPageChunk', function transportRender(data) {
-        var page = this.pageCache[data.pageIndex];
-
-        page._renderPageChunk(data.operatorList);
-      }, this);
-
-      messageHandler.on('commonobj', function transportObj(data) {
-        var id = data[0];
-        var type = data[1];
-        if (this.commonObjs.hasData(id))
-          return;
-
-        switch (type) {
-          case 'Font':
-            var exportedData = data[2];
-
-            var font;
-            if ('error' in exportedData) {
-              var error = exportedData.error;
-              warn('Error during font loading: ' + error);
-              this.commonObjs.resolve(id, error);
-              break;
-            } else {
-              font = new Font(exportedData);
-            }
-
-            FontLoader.bind(
-              [font],
-              function fontReady(fontObjs) {
-                this.commonObjs.resolve(id, font);
-              }.bind(this)
-            );
-            break;
-          default:
-            error('Got unknown common object type ' + type);
-        }
-      }, this);
-
-      messageHandler.on('obj', function transportObj(data) {
-        var id = data[0];
-        var pageIndex = data[1];
-        var type = data[2];
-        var pageProxy = this.pageCache[pageIndex];
-        if (pageProxy.objs.hasData(id))
-          return;
-
-        switch (type) {
-          case 'JpegStream':
-            var imageData = data[3];
-            loadJpegStream(id, imageData, pageProxy.objs);
-            break;
-          case 'Image':
-            var imageData = data[3];
-            pageProxy.objs.resolve(id, imageData);
-
-            // heuristics that will allow not to store large data
-            var MAX_IMAGE_SIZE_TO_STORE = 8000000;
-            if ('data' in imageData &&
-                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
-              pageProxy.cleanupAfterRender = true;
-            }
-            break;
-          default:
-            error('Got unknown object type ' + type);
-        }
-      }, this);
-
-      messageHandler.on('DocProgress', function transportDocProgress(data) {
-        if (this.progressCallback) {
-          this.progressCallback({
-            loaded: data.loaded,
-            total: data.total
-          });
-        }
-      }, this);
-
-      messageHandler.on('DocError', function transportDocError(data) {
-        this.workerReadyPromise.reject(data);
-      }, this);
-
-      messageHandler.on('PageError', function transportError(data) {
-        var page = this.pageCache[data.pageNum - 1];
-        if (page.displayReadyPromise)
-          page.displayReadyPromise.reject(data.error);
-        else
-          error(data.error);
-      }, this);
-
-      messageHandler.on('JpegDecode', function(data, promise) {
-        var imageData = data[0];
-        var components = data[1];
-        if (components != 3 && components != 1)
-          error('Only 3 component or 1 component can be returned');
-
-        var img = new Image();
-        img.onload = (function messageHandler_onloadClosure() {
-          var width = img.width;
-          var height = img.height;
-          var size = width * height;
-          var rgbaLength = size * 4;
-          var buf = new Uint8Array(size * components);
-          var tmpCanvas = createScratchCanvas(width, height);
-          var tmpCtx = tmpCanvas.getContext('2d');
-          tmpCtx.drawImage(img, 0, 0);
-          var data = tmpCtx.getImageData(0, 0, width, height).data;
-
-          if (components == 3) {
-            for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
-              buf[j] = data[i];
-              buf[j + 1] = data[i + 1];
-              buf[j + 2] = data[i + 2];
-            }
-          } else if (components == 1) {
-            for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
-              buf[j] = data[i];
-            }
-          }
-          promise.resolve({ data: buf, width: width, height: height});
-        }).bind(this);
-        var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
-        img.src = src;
-      });
-    },
-
-    fetchDocument: function WorkerTransport_fetchDocument(source) {
-      source.disableAutoFetch = PDFJS.disableAutoFetch;
-      source.chunkedViewerLoading = !!this.pdfDataRangeTransport;
-      this.messageHandler.send('GetDocRequest', {
-        source: source,
-        disableRange: PDFJS.disableRange,
-        maxImageSize: PDFJS.maxImageSize
-      });
-    },
-
-    getData: function WorkerTransport_getData(promise) {
-      this.messageHandler.send('GetData', null, function(data) {
-        promise.resolve(data);
-      });
-    },
-
-    dataLoaded: function WorkerTransport_dataLoaded() {
-      var promise = new PDFJS.Promise();
-      this.messageHandler.send('DataLoaded', null, function(args) {
-        promise.resolve(args);
-      });
-      return promise;
-    },
-
-    getPage: function WorkerTransport_getPage(pageNumber, promise) {
-      var pageIndex = pageNumber - 1;
-      if (pageIndex in this.pagePromises)
-        return this.pagePromises[pageIndex];
-      var promise = new PDFJS.Promise('Page ' + pageNumber);
-      this.pagePromises[pageIndex] = promise;
-      this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
-      return promise;
-    },
-
-    getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
-      this.messageHandler.send('GetAnnotationsRequest',
-        { pageIndex: pageIndex });
-    },
-
-    getDestinations: function WorkerTransport_getDestinations() {
-      var promise = new PDFJS.Promise();
-      this.messageHandler.send('GetDestinations', null,
-        function transportDestinations(destinations) {
-          promise.resolve(destinations);
-        }
-      );
-      return promise;
-    }
-  };
-  return WorkerTransport;
-
-})();
-
-/**
- * RenderTask is basically a promise but adds a cancel function to terminate it.
- */
-var RenderTask = (function RenderTaskClosure() {
-  function RenderTask(internalRenderTask) {
-    this.internalRenderTask = internalRenderTask;
-    Promise.call(this);
-  }
-
-  RenderTask.prototype = Object.create(Promise.prototype);
-
-  /**
-   * Cancel the rendering task. If the task is curently rendering it will not be
-   * cancelled until graphics pauses with a timeout. The promise that this
-   * object extends will resolved when cancelled.
-   */
-  RenderTask.prototype.cancel = function RenderTask_cancel() {
-    this.internalRenderTask.cancel();
-  };
-
-  return RenderTask;
-})();
-
-var InternalRenderTask = (function InternalRenderTaskClosure() {
-
-  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
-                              pageNumber) {
-    this.callback = callback;
-    this.params = params;
-    this.objs = objs;
-    this.commonObjs = commonObjs;
-    this.operatorListIdx = null;
-    this.operatorList = operatorList;
-    this.pageNumber = pageNumber;
-    this.running = false;
-    this.graphicsReadyCallback = null;
-    this.graphicsReady = false;
-    this.cancelled = false;
-  }
-
-  InternalRenderTask.prototype = {
-
-    initalizeGraphics:
-        function InternalRenderTask_initalizeGraphics(transparency) {
-
-      if (this.cancelled) {
-        return;
-      }
-      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
-          globalScope.StepperManager.enabled) {
-        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
-        this.stepper.init(this.operatorList);
-        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
-      }
-
-      var params = this.params;
-      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
-                                    this.objs, params.textLayer,
-                                    params.imageLayer);
-
-      this.gfx.beginDrawing(params.viewport, transparency);
-      this.operatorListIdx = 0;
-      this.graphicsReady = true;
-      if (this.graphicsReadyCallback) {
-        this.graphicsReadyCallback();
-      }
-    },
-
-    cancel: function InternalRenderTask_cancel() {
-      this.running = false;
-      this.cancelled = true;
-      this.callback('cancelled');
-    },
-
-    operatorListChanged: function InternalRenderTask_operatorListChanged() {
-      if (!this.graphicsReady) {
-        if (!this.graphicsReadyCallback) {
-          this.graphicsReadyCallback = this._continue.bind(this);
-        }
-        return;
-      }
-
-      if (this.stepper) {
-        this.stepper.updateOperatorList(this.operatorList);
-      }
-
-      if (this.running) {
-        return;
-      }
-      this._continue();
-    },
-
-    _continue: function InternalRenderTask__continue() {
-      this.running = true;
-      if (this.cancelled) {
-        return;
-      }
-      if (this.params.continueCallback) {
-        this.params.continueCallback(this._next.bind(this));
-      } else {
-        this._next();
-      }
-    },
-
-    _next: function InternalRenderTask__next() {
-      if (this.cancelled) {
-        return;
-      }
-      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
-                                        this.operatorListIdx,
-                                        this._continue.bind(this),
-                                        this.stepper);
-      if (this.operatorListIdx === this.operatorList.fnArray.length) {
-        this.running = false;
-        if (this.operatorList.lastChunk) {
-          this.gfx.endDrawing();
-          this.callback();
-        }
-      }
-    }
-
-  };
-
-  return InternalRenderTask;
-})();
-
-
-// <canvas> contexts store most of the state we need natively.
-// However, PDF needs a bit more state, which we store here.
-
-var TextRenderingMode = {
-  FILL: 0,
-  STROKE: 1,
-  FILL_STROKE: 2,
-  INVISIBLE: 3,
-  FILL_ADD_TO_PATH: 4,
-  STROKE_ADD_TO_PATH: 5,
-  FILL_STROKE_ADD_TO_PATH: 6,
-  ADD_TO_PATH: 7,
-  FILL_STROKE_MASK: 3,
-  ADD_TO_PATH_FLAG: 4
-};
-
-// Minimal font size that would be used during canvas fillText operations.
-var MIN_FONT_SIZE = 16;
-
-var COMPILE_TYPE3_GLYPHS = true;
-
-function createScratchCanvas(width, height) {
-  var canvas = document.createElement('canvas');
-  canvas.width = width;
-  canvas.height = height;
-  return canvas;
-}
-
-function addContextCurrentTransform(ctx) {
-  // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
-  if (!ctx.mozCurrentTransform) {
-    // Store the original context
-    ctx._scaleX = ctx._scaleX || 1.0;
-    ctx._scaleY = ctx._scaleY || 1.0;
-    ctx._originalSave = ctx.save;
-    ctx._originalRestore = ctx.restore;
-    ctx._originalRotate = ctx.rotate;
-    ctx._originalScale = ctx.scale;
-    ctx._originalTranslate = ctx.translate;
-    ctx._originalTransform = ctx.transform;
-    ctx._originalSetTransform = ctx.setTransform;
-
-    ctx._transformMatrix = [ctx._scaleX, 0, 0, ctx._scaleY, 0, 0];
-    ctx._transformStack = [];
-
-    Object.defineProperty(ctx, 'mozCurrentTransform', {
-      get: function getCurrentTransform() {
-        return this._transformMatrix;
-      }
-    });
-
-    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
-      get: function getCurrentTransformInverse() {
-        // Calculation done using WolframAlpha:
-        // http://www.wolframalpha.com/input/?
-        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
-
-        var m = this._transformMatrix;
-        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
-
-        var ad_bc = a * d - b * c;
-        var bc_ad = b * c - a * d;
-
-        return [
-          d / ad_bc,
-          b / bc_ad,
-          c / bc_ad,
-          a / ad_bc,
-          (d * e - c * f) / bc_ad,
-          (b * e - a * f) / ad_bc
-        ];
-      }
-    });
-
-    ctx.save = function ctxSave() {
-      var old = this._transformMatrix;
-      this._transformStack.push(old);
-      this._transformMatrix = old.slice(0, 6);
-
-      this._originalSave();
-    };
-
-    ctx.restore = function ctxRestore() {
-      var prev = this._transformStack.pop();
-      if (prev) {
-        this._transformMatrix = prev;
-        this._originalRestore();
-      }
-    };
-
-    ctx.translate = function ctxTranslate(x, y) {
-      var m = this._transformMatrix;
-      m[4] = m[0] * x + m[2] * y + m[4];
-      m[5] = m[1] * x + m[3] * y + m[5];
-
-      this._originalTranslate(x, y);
-    };
-
-    ctx.scale = function ctxScale(x, y) {
-      var m = this._transformMatrix;
-      m[0] = m[0] * x;
-      m[1] = m[1] * x;
-      m[2] = m[2] * y;
-      m[3] = m[3] * y;
-
-      this._originalScale(x, y);
-    };
-
-    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
-      var m = this._transformMatrix;
-      this._transformMatrix = [
-        m[0] * a + m[2] * b,
-        m[1] * a + m[3] * b,
-        m[0] * c + m[2] * d,
-        m[1] * c + m[3] * d,
-        m[0] * e + m[2] * f + m[4],
-        m[1] * e + m[3] * f + m[5]
-      ];
-
-      ctx._originalTransform(a, b, c, d, e, f);
-    };
-
-    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
-      this._transformMatrix = [a, b, c, d, e, f];
-
-      ctx._originalSetTransform(a, b, c, d, e, f);
-    };
-
-    ctx.rotate = function ctxRotate(angle) {
-      var cosValue = Math.cos(angle);
-      var sinValue = Math.sin(angle);
-
-      var m = this._transformMatrix;
-      this._transformMatrix = [
-        m[0] * cosValue + m[2] * sinValue,
-        m[1] * cosValue + m[3] * sinValue,
-        m[0] * (-sinValue) + m[2] * cosValue,
-        m[1] * (-sinValue) + m[3] * cosValue,
-        m[4],
-        m[5]
-      ];
-
-      this._originalRotate(angle);
-    };
-  }
-}
-
-var CachedCanvases = (function CachedCanvasesClosure() {
-  var cache = {};
-  return {
-    getCanvas: function CachedCanvases_getCanvas(id, width, height) {
-      var canvas;
-      if (id in cache) {
-        canvas = cache[id];
-        canvas.width = width;
-        canvas.height = height;
-        // reset canvas transform for emulated mozCurrentTransform, if needed
-        canvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);
-      } else {
-        canvas = createScratchCanvas(width, height);
-        cache[id] = canvas;
-      }
-      return canvas;
-    },
-    clear: function () {
-      cache = {};
-    }
-  };
-})();
-
-function compileType3Glyph(imgData) {
-  var POINT_TO_PROCESS_LIMIT = 1000;
-
-  var width = imgData.width, height = imgData.height;
-  var i, j, j0, width1 = width + 1;
-  var points = new Uint8Array(width1 * (height + 1));
-  var POINT_TYPES =
-      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
-  // finding iteresting points: every point is located between mask pixels,
-  // so there will be points of the (width + 1)x(height + 1) grid. Every point
-  // will have flags assigned based on neighboring mask pixels:
-  //   4 | 8
-  //   --P--
-  //   2 | 1
-  // We are interested only in points with the flags:
-  //   - outside corners: 1, 2, 4, 8;
-  //   - inside corners: 7, 11, 13, 14;
-  //   - and, intersections: 5, 10.
-  var pos = 3, data = imgData.data, lineSize = width * 4, count = 0;
-  if (data[3] !== 0) {
-    points[0] = 1;
-    ++count;
-  }
-  for (j = 1; j < width; j++) {
-    if (data[pos] !== data[pos + 4]) {
-      points[j] = data[pos] ? 2 : 1;
-      ++count;
-    }
-    pos += 4;
-  }
-  if (data[pos] !== 0) {
-    points[j] = 2;
-    ++count;
-  }
-  pos += 4;
-  for (i = 1; i < height; i++) {
-    j0 = i * width1;
-    if (data[pos - lineSize] !== data[pos]) {
-      points[j0] = data[pos] ? 1 : 8;
-      ++count;
-    }
-    // 'sum' is the position of the current pixel configuration in the 'TYPES'
-    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).
-    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
-    for (j = 1; j < width; j++) {
-      sum = (sum >> 2) + (data[pos + 4] ? 4 : 0) +
-            (data[pos - lineSize + 4] ? 8 : 0);
-      if (POINT_TYPES[sum]) {
-        points[j0 + j] = POINT_TYPES[sum];
-        ++count;
-      }
-      pos += 4;
-    }
-    if (data[pos - lineSize] !== data[pos]) {
-      points[j0 + j] = data[pos] ? 2 : 4;
-      ++count;
-    }
-    pos += 4;
-
-    if (count > POINT_TO_PROCESS_LIMIT) {
-      return null;
-    }
-  }
-
-  pos -= lineSize;
-  j0 = i * width1;
-  if (data[pos] !== 0) {
-    points[j0] = 8;
-    ++count;
-  }
-  for (j = 1; j < width; j++) {
-    if (data[pos] !== data[pos + 4]) {
-      points[j0 + j] = data[pos] ? 4 : 8;
-      ++count;
-    }
-    pos += 4;
-  }
-  if (data[pos] !== 0) {
-    points[j0 + j] = 4;
-    ++count;
-  }
-  if (count > POINT_TO_PROCESS_LIMIT) {
-    return null;
-  }
-
-  // building outlines
-  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
-  var outlines = [];
-  for (i = 0; count && i <= height; i++) {
-    var p = i * width1;
-    var end = p + width;
-    while (p < end && !points[p]) {
-      p++;
-    }
-    if (p === end) {
-      continue;
-    }
-    var coords = [p % width1, i];
-
-    var type = points[p], p0 = p, pp;
-    do {
-      var step = steps[type];
-      do { p += step; } while (!points[p]);
-
-      pp = points[p];
-      if (pp !== 5 && pp !== 10) {
-        // set new direction
-        type = pp;
-        // delete mark
-        points[p] = 0;
-      } else { // type is 5 or 10, ie, a crossing
-        // set new direction
-        type = pp & ((0x33 * type) >> 4);
-        // set new type for "future hit"
-        points[p] &= (type >> 2 | type << 2);
-      }
-
-      coords.push(p % width1);
-      coords.push((p / width1) | 0);
-      --count;
-    } while (p0 !== p);
-    outlines.push(coords);
-    --i;
-  }
-
-  var drawOutline = function(c) {
-    c.save();
-    // the path shall be painted in [0..1]x[0..1] space
-    c.scale(1 / width, -1 / height);
-    c.translate(0, -height);
-    c.beginPath();
-    for (var i = 0, ii = outlines.length; i < ii; i++) {
-      var o = outlines[i];
-      c.moveTo(o[0], o[1]);
-      for (var j = 2, jj = o.length; j < jj; j += 2) {
-        c.lineTo(o[j], o[j+1]);
-      }
-    }
-    c.fill();
-    c.beginPath();
-    c.restore();
-  };
-
-  return drawOutline;
-}
-
-var CanvasExtraState = (function CanvasExtraStateClosure() {
-  function CanvasExtraState(old) {
-    // Are soft masks and alpha values shapes or opacities?
-    this.alphaIsShape = false;
-    this.fontSize = 0;
-    this.fontSizeScale = 1;
-    this.textMatrix = IDENTITY_MATRIX;
-    this.fontMatrix = FONT_IDENTITY_MATRIX;
-    this.leading = 0;
-    // Current point (in user coordinates)
-    this.x = 0;
-    this.y = 0;
-    // Start of text line (in text coordinates)
-    this.lineX = 0;
-    this.lineY = 0;
-    // Character and word spacing
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.textHScale = 1;
-    this.textRenderingMode = TextRenderingMode.FILL;
-    this.textRise = 0;
-    // Color spaces
-    this.fillColorSpace = ColorSpace.singletons.gray;
-    this.fillColorSpaceObj = null;
-    this.strokeColorSpace = ColorSpace.singletons.gray;
-    this.strokeColorSpaceObj = null;
-    this.fillColorObj = null;
-    this.strokeColorObj = null;
-    // Default fore and background colors
-    this.fillColor = '#000000';
-    this.strokeColor = '#000000';
-    // Note: fill alpha applies to all non-stroking operations
-    this.fillAlpha = 1;
-    this.strokeAlpha = 1;
-    this.lineWidth = 1;
-    this.paintFormXObjectDepth = 0;
-
-    this.old = old;
-  }
-
-  CanvasExtraState.prototype = {
-    clone: function CanvasExtraState_clone() {
-      return Object.create(this);
-    },
-    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
-      this.x = x;
-      this.y = y;
-    }
-  };
-  return CanvasExtraState;
-})();
-
-var CanvasGraphics = (function CanvasGraphicsClosure() {
-  // Defines the time the executeOperatorList is going to be executing
-  // before it stops and shedules a continue of execution.
-  var EXECUTION_TIME = 15;
-
-  function CanvasGraphics(canvasCtx, commonObjs, objs, textLayer, imageLayer) {
-    this.ctx = canvasCtx;
-    this.current = new CanvasExtraState();
-    this.stateStack = [];
-    this.pendingClip = null;
-    this.pendingEOFill = false;
-    this.res = null;
-    this.xobjs = null;
-    this.commonObjs = commonObjs;
-    this.objs = objs;
-    this.textLayer = textLayer;
-    this.imageLayer = imageLayer;
-    this.groupStack = [];
-    this.processingType3 = null;
-    // Patterns are painted relative to the initial page/form transform, see pdf
-    // spec 8.7.2 NOTE 1.
-    this.baseTransform = null;
-    this.baseTransformStack = [];
-    if (canvasCtx) {
-      addContextCurrentTransform(canvasCtx);
-    }
-  }
-
-  function putBinaryImageData(ctx, imgData) {
-    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
-      ctx.putImageData(imgData, 0, 0);
-      return;
-    }
-
-    var tmpImgData = ctx.createImageData(imgData.width, imgData.height);
-
-    var data = imgData.data;
-    var tmpImgDataPixels = tmpImgData.data;
-    if ('set' in tmpImgDataPixels)
-      tmpImgDataPixels.set(data);
-    else {
-      // Copy over the imageData pixel by pixel.
-      for (var i = 0, ii = tmpImgDataPixels.length; i < ii; i++)
-        tmpImgDataPixels[i] = data[i];
-    }
-
-    ctx.putImageData(tmpImgData, 0, 0);
-  }
-
-  function copyCtxState(sourceCtx, destCtx) {
-    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',
-                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',
-                      'globalCompositeOperation', 'font'];
-    for (var i = 0, ii = properties.length; i < ii; i++) {
-      var property = properties[i];
-      if (property in sourceCtx) {
-        destCtx[property] = sourceCtx[property];
-      }
-    }
-    if ('setLineDash' in sourceCtx) {
-      destCtx.setLineDash(sourceCtx.getLineDash());
-      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;
-    } else if ('mozDash' in sourceCtx) {
-      destCtx.mozDash = sourceCtx.mozDash;
-      destCtx.mozDashOffset = sourceCtx.mozDashOffset;
-    }
-  }
-
-  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
-  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
-  var NORMAL_CLIP = {};
-  var EO_CLIP = {};
-
-  CanvasGraphics.prototype = {
-    slowCommands: {
-      'stroke': true,
-      'closeStroke': true,
-      'fill': true,
-      'eoFill': true,
-      'fillStroke': true,
-      'eoFillStroke': true,
-      'closeFillStroke': true,
-      'closeEOFillStroke': true,
-      'showText': true,
-      'showSpacedText': true,
-      'setStrokeColorSpace': true,
-      'setFillColorSpace': true,
-      'setStrokeColor': true,
-      'setStrokeColorN': true,
-      'setFillColor': true,
-      'setFillColorN': true,
-      'setStrokeGray': true,
-      'setFillGray': true,
-      'setStrokeRGBColor': true,
-      'setFillRGBColor': true,
-      'setStrokeCMYKColor': true,
-      'setFillCMYKColor': true,
-      'paintJpegXObject': true,
-      'paintImageXObject': true,
-      'paintInlineImageXObject': true,
-      'paintInlineImageXObjectGroup': true,
-      'paintImageMaskXObject': true,
-      'paintImageMaskXObjectGroup': true,
-      'shadingFill': true
-    },
-
-    beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) {
-      // For pdfs that use blend modes we have to clear the canvas else certain
-      // blend modes can look wrong since we'd be blending with a white
-      // backdrop. The problem with a transparent backdrop though is we then
-      // don't get sub pixel anti aliasing on text, so we fill with white if
-      // we can.
-      var width = this.ctx.canvas.width;
-      var height = this.ctx.canvas.height;
-      if (transparency) {
-        this.ctx.clearRect(0, 0, width, height);
-      } else {
-        this.ctx.mozOpaque = true;
-        this.ctx.save();
-        this.ctx.fillStyle = 'rgb(255, 255, 255)';
-        this.ctx.fillRect(0, 0, width, height);
-        this.ctx.restore();
-      }
-
-      var transform = viewport.transform;
-      this.baseTransform = transform.slice();
-      this.ctx.save();
-      this.ctx.transform.apply(this.ctx, transform);
-
-      if (this.textLayer) {
-        this.textLayer.beginLayout();
-      }
-      if (this.imageLayer) {
-        this.imageLayer.beginLayout();
-      }
-    },
-
-    executeOperatorList: function CanvasGraphics_executeOperatorList(
-                                    operatorList,
-                                    executionStartIdx, continueCallback,
-                                    stepper) {
-      var argsArray = operatorList.argsArray;
-      var fnArray = operatorList.fnArray;
-      var i = executionStartIdx || 0;
-      var argsArrayLen = argsArray.length;
-
-      // Sometimes the OperatorList to execute is empty.
-      if (argsArrayLen == i) {
-        return i;
-      }
-
-      var executionEndIdx;
-      var endTime = Date.now() + EXECUTION_TIME;
-
-      var commonObjs = this.commonObjs;
-      var objs = this.objs;
-      var fnName;
-      var slowCommands = this.slowCommands;
-
-      while (true) {
-        if (stepper && i === stepper.nextBreakPoint) {
-          stepper.breakIt(i, continueCallback);
-          return i;
-        }
-
-        fnName = fnArray[i];
-
-        if (fnName !== 'dependency') {
-          this[fnName].apply(this, argsArray[i]);
-        } else {
-          var deps = argsArray[i];
-          for (var n = 0, nn = deps.length; n < nn; n++) {
-            var depObjId = deps[n];
-            var common = depObjId.substring(0, 2) == 'g_';
-
-            // If the promise isn't resolved yet, add the continueCallback
-            // to the promise and bail out.
-            if (!common && !objs.isResolved(depObjId)) {
-              objs.get(depObjId, continueCallback);
-              return i;
-            }
-            if (common && !commonObjs.isResolved(depObjId)) {
-              commonObjs.get(depObjId, continueCallback);
-              return i;
-            }
-          }
-        }
-
-        i++;
-
-        // If the entire operatorList was executed, stop as were done.
-        if (i == argsArrayLen) {
-          return i;
-        }
-
-        // If the execution took longer then a certain amount of time, shedule
-        // to continue exeution after a short delay.
-        // However, this is only possible if a 'continueCallback' is passed in.
-        if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
-          setTimeout(continueCallback, 0);
-          return i;
-        }
-
-        // If the operatorList isn't executed completely yet OR the execution
-        // time was short enough, do another execution round.
-      }
-    },
-
-    endDrawing: function CanvasGraphics_endDrawing() {
-      this.ctx.restore();
-      CachedCanvases.clear();
-
-      if (this.textLayer) {
-        this.textLayer.endLayout();
-      }
-      if (this.imageLayer) {
-        this.imageLayer.endLayout();
-      }
-    },
-
-    // Graphics state
-    setLineWidth: function CanvasGraphics_setLineWidth(width) {
-      this.current.lineWidth = width;
-      this.ctx.lineWidth = width;
-    },
-    setLineCap: function CanvasGraphics_setLineCap(style) {
-      this.ctx.lineCap = LINE_CAP_STYLES[style];
-    },
-    setLineJoin: function CanvasGraphics_setLineJoin(style) {
-      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
-    },
-    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
-      this.ctx.miterLimit = limit;
-    },
-    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
-      var ctx = this.ctx;
-      if ('setLineDash' in ctx) {
-        ctx.setLineDash(dashArray);
-        ctx.lineDashOffset = dashPhase;
-      } else {
-        ctx.mozDash = dashArray;
-        ctx.mozDashOffset = dashPhase;
-      }
-    },
-    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
-      // Maybe if we one day fully support color spaces this will be important
-      // for now we can ignore.
-      // TODO set rendering intent?
-    },
-    setFlatness: function CanvasGraphics_setFlatness(flatness) {
-      // There's no way to control this with canvas, but we can safely ignore.
-      // TODO set flatness?
-    },
-    setGState: function CanvasGraphics_setGState(states) {
-      for (var i = 0, ii = states.length; i < ii; i++) {
-        var state = states[i];
-        var key = state[0];
-        var value = state[1];
-
-        switch (key) {
-          case 'LW':
-            this.setLineWidth(value);
-            break;
-          case 'LC':
-            this.setLineCap(value);
-            break;
-          case 'LJ':
-            this.setLineJoin(value);
-            break;
-          case 'ML':
-            this.setMiterLimit(value);
-            break;
-          case 'D':
-            this.setDash(value[0], value[1]);
-            break;
-          case 'RI':
-            this.setRenderingIntent(value);
-            break;
-          case 'FL':
-            this.setFlatness(value);
-            break;
-          case 'Font':
-            this.setFont(value[0], value[1]);
-            break;
-          case 'CA':
-            this.current.strokeAlpha = state[1];
-            break;
-          case 'ca':
-            this.current.fillAlpha = state[1];
-            this.ctx.globalAlpha = state[1];
-            break;
-          case 'BM':
-            if (value && value.name && (value.name !== 'Normal')) {
-              var mode = value.name.replace(/([A-Z])/g,
-                function(c) {
-                  return '-' + c.toLowerCase();
-                }
-              ).substring(1);
-              this.ctx.globalCompositeOperation = mode;
-              if (this.ctx.globalCompositeOperation !== mode) {
-                warn('globalCompositeOperation "' + mode +
-                     '" is not supported');
-              }
-            } else {
-              this.ctx.globalCompositeOperation = 'source-over';
-            }
-            break;
-        }
-      }
-    },
-    save: function CanvasGraphics_save() {
-      this.ctx.save();
-      var old = this.current;
-      this.stateStack.push(old);
-      this.current = old.clone();
-    },
-    restore: function CanvasGraphics_restore() {
-      var prev = this.stateStack.pop();
-      if (prev) {
-        this.current = prev;
-        this.ctx.restore();
-      }
-    },
-    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
-      this.ctx.transform(a, b, c, d, e, f);
-    },
-
-    // Path
-    moveTo: function CanvasGraphics_moveTo(x, y) {
-      this.ctx.moveTo(x, y);
-      this.current.setCurrentPoint(x, y);
-    },
-    lineTo: function CanvasGraphics_lineTo(x, y) {
-      this.ctx.lineTo(x, y);
-      this.current.setCurrentPoint(x, y);
-    },
-    curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
-      this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
-      this.current.setCurrentPoint(x3, y3);
-    },
-    curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
-      var current = this.current;
-      this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
-      current.setCurrentPoint(x3, y3);
-    },
-    curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
-      this.curveTo(x1, y1, x3, y3, x3, y3);
-      this.current.setCurrentPoint(x3, y3);
-    },
-    closePath: function CanvasGraphics_closePath() {
-      this.ctx.closePath();
-    },
-    rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
-      this.ctx.rect(x, y, width, height);
-    },
-    stroke: function CanvasGraphics_stroke(consumePath) {
-      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
-      var ctx = this.ctx;
-      var strokeColor = this.current.strokeColor;
-      if (this.current.lineWidth === 0)
-        ctx.lineWidth = this.getSinglePixelWidth();
-      // For stroke we want to temporarily change the global alpha to the
-      // stroking alpha.
-      ctx.globalAlpha = this.current.strokeAlpha;
-      if (strokeColor && strokeColor.hasOwnProperty('type') &&
-          strokeColor.type === 'Pattern') {
-        // for patterns, we transform to pattern space, calculate
-        // the pattern, call stroke, and restore to user space
-        ctx.save();
-        ctx.strokeStyle = strokeColor.getPattern(ctx);
-        ctx.stroke();
-        ctx.restore();
-      } else {
-        ctx.stroke();
-      }
-      if (consumePath)
-        this.consumePath();
-      // Restore the global alpha to the fill alpha
-      ctx.globalAlpha = this.current.fillAlpha;
-    },
-    closeStroke: function CanvasGraphics_closeStroke() {
-      this.closePath();
-      this.stroke();
-    },
-    fill: function CanvasGraphics_fill(consumePath) {
-      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
-      var ctx = this.ctx;
-      var fillColor = this.current.fillColor;
-      var needRestore = false;
-
-      if (fillColor && fillColor.hasOwnProperty('type') &&
-          fillColor.type === 'Pattern') {
-        ctx.save();
-        ctx.fillStyle = fillColor.getPattern(ctx);
-        needRestore = true;
-      }
-
-      if (this.pendingEOFill) {
-        if ('mozFillRule' in this.ctx) {
-          this.ctx.mozFillRule = 'evenodd';
-          this.ctx.fill();
-          this.ctx.mozFillRule = 'nonzero';
-        } else {
-          try {
-            this.ctx.fill('evenodd');
-          } catch (ex) {
-            // shouldn't really happen, but browsers might think differently
-            this.ctx.fill();
-          }
-        }
-        this.pendingEOFill = false;
-      } else {
-        this.ctx.fill();
-      }
-
-      if (needRestore) {
-        ctx.restore();
-      }
-      if (consumePath) {
-        this.consumePath();
-      }
-    },
-    eoFill: function CanvasGraphics_eoFill() {
-      this.pendingEOFill = true;
-      this.fill();
-    },
-    fillStroke: function CanvasGraphics_fillStroke() {
-      this.fill(false);
-      this.stroke(false);
-
-      this.consumePath();
-    },
-    eoFillStroke: function CanvasGraphics_eoFillStroke() {
-      this.pendingEOFill = true;
-      this.fillStroke();
-    },
-    closeFillStroke: function CanvasGraphics_closeFillStroke() {
-      this.closePath();
-      this.fillStroke();
-    },
-    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
-      this.pendingEOFill = true;
-      this.closePath();
-      this.fillStroke();
-    },
-    endPath: function CanvasGraphics_endPath() {
-      this.consumePath();
-    },
-
-    // Clipping
-    clip: function CanvasGraphics_clip() {
-      this.pendingClip = NORMAL_CLIP;
-    },
-    eoClip: function CanvasGraphics_eoClip() {
-      this.pendingClip = EO_CLIP;
-    },
-
-    // Text
-    beginText: function CanvasGraphics_beginText() {
-      this.current.textMatrix = IDENTITY_MATRIX;
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    endText: function CanvasGraphics_endText() {
-      if (!('pendingTextPaths' in this)) {
-        this.ctx.beginPath();
-        return;
-      }
-      var paths = this.pendingTextPaths;
-      var ctx = this.ctx;
-
-      ctx.save();
-      ctx.beginPath();
-      for (var i = 0; i < paths.length; i++) {
-        var path = paths[i];
-        ctx.setTransform.apply(ctx, path.transform);
-        ctx.translate(path.x, path.y);
-        path.addToPath(ctx, path.fontSize);
-      }
-      ctx.restore();
-      ctx.clip();
-      ctx.beginPath();
-      delete this.pendingTextPaths;
-    },
-    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
-      this.current.charSpacing = spacing;
-    },
-    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
-      this.current.wordSpacing = spacing;
-    },
-    setHScale: function CanvasGraphics_setHScale(scale) {
-      this.current.textHScale = scale / 100;
-    },
-    setLeading: function CanvasGraphics_setLeading(leading) {
-      this.current.leading = -leading;
-    },
-    setFont: function CanvasGraphics_setFont(fontRefName, size) {
-      var fontObj = this.commonObjs.get(fontRefName);
-      var current = this.current;
-
-      if (!fontObj)
-        error('Can\'t find font for ' + fontRefName);
-
-      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix :
-                                                FONT_IDENTITY_MATRIX;
-
-      // A valid matrix needs all main diagonal elements to be non-zero
-      // This also ensures we bypass FF bugzilla bug #719844.
-      if (current.fontMatrix[0] === 0 ||
-          current.fontMatrix[3] === 0) {
-        warn('Invalid font matrix for font ' + fontRefName);
-      }
-
-      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
-      // and in some docs this can be negative (inverted x-y axes).
-      if (size < 0) {
-        size = -size;
-        current.fontDirection = -1;
-      } else {
-        current.fontDirection = 1;
-      }
-
-      this.current.font = fontObj;
-      this.current.fontSize = size;
-
-      if (fontObj.coded)
-        return; // we don't need ctx.font for Type3 fonts
-
-      var name = fontObj.loadedName || 'sans-serif';
-      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
-                                 (fontObj.bold ? 'bold' : 'normal');
-
-      var italic = fontObj.italic ? 'italic' : 'normal';
-      var typeface = '"' + name + '", ' + fontObj.fallbackName;
-
-      // Some font backends cannot handle fonts below certain size.
-      // Keeping the font at minimal size and using the fontSizeScale to change
-      // the current transformation matrix before the fillText/strokeText.
-      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
-      var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
-      this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
-                                   size / MIN_FONT_SIZE;
-
-      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
-      this.ctx.font = rule;
-    },
-    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
-      this.current.textRenderingMode = mode;
-    },
-    setTextRise: function CanvasGraphics_setTextRise(rise) {
-      this.current.textRise = rise;
-    },
-    moveText: function CanvasGraphics_moveText(x, y) {
-      this.current.x = this.current.lineX += x;
-      this.current.y = this.current.lineY += y;
-    },
-    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
-      this.setLeading(-y);
-      this.moveText(x, y);
-    },
-    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
-      this.current.textMatrix = [a, b, c, d, e, f];
-
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    nextLine: function CanvasGraphics_nextLine() {
-      this.moveText(0, this.current.leading);
-    },
-    applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
-      var ctx = this.ctx;
-      var current = this.current;
-      ctx.transform.apply(ctx, current.textMatrix);
-      ctx.translate(current.x, current.y + current.textRise);
-      if (current.fontDirection > 0) {
-        ctx.scale(current.textHScale, -1);
-      } else {
-        ctx.scale(-current.textHScale, 1);
-      }
-    },
-    createTextGeometry: function CanvasGraphics_createTextGeometry() {
-      var geometry = {};
-      var ctx = this.ctx;
-      var font = this.current.font;
-      var ctxMatrix = ctx.mozCurrentTransform;
-      var a = ctxMatrix[0], b = ctxMatrix[1], c = ctxMatrix[2];
-      var d = ctxMatrix[3], e = ctxMatrix[4], f = ctxMatrix[5];
-      var sx = (a >= 0) ?
-          Math.sqrt((a * a) + (b * b)) : -Math.sqrt((a * a) + (b * b));
-      var sy = (d >= 0) ?
-          Math.sqrt((c * c) + (d * d)) : -Math.sqrt((c * c) + (d * d));
-      var angle = Math.atan2(b, a);
-      var x = e;
-      var y = f;
-      geometry.x = x;
-      geometry.y = y;
-      geometry.hScale = sx;
-      geometry.vScale = sy;
-      geometry.angle = angle;
-      geometry.spaceWidth = font.spaceWidth;
-      geometry.fontName = font.loadedName;
-      geometry.fontFamily = font.fallbackName;
-      geometry.fontSize = this.current.fontSize;
-      return geometry;
-    },
-
-    paintChar: function (character, x, y) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize / current.fontSizeScale;
-      var textRenderingMode = current.textRenderingMode;
-      var fillStrokeMode = textRenderingMode &
-        TextRenderingMode.FILL_STROKE_MASK;
-      var isAddToPathSet = !!(textRenderingMode &
-        TextRenderingMode.ADD_TO_PATH_FLAG);
-
-      var addToPath;
-      if (font.disableFontFace || isAddToPathSet) {
-        addToPath = font.renderer.getPathGenerator(character);
-      }
-
-      if (font.disableFontFace) {
-        ctx.save();
-        ctx.translate(x, y);
-        ctx.beginPath();
-        addToPath(ctx, fontSize);
-        if (fillStrokeMode === TextRenderingMode.FILL ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.fill();
-        }
-        if (fillStrokeMode === TextRenderingMode.STROKE ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.stroke();
-        }
-        ctx.restore();
-      } else {
-        if (fillStrokeMode === TextRenderingMode.FILL ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.fillText(character, x, y);
-        }
-        if (fillStrokeMode === TextRenderingMode.STROKE ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.strokeText(character, x, y);
-        }
-      }
-
-      if (isAddToPathSet) {
-        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
-        paths.push({
-          transform: ctx.mozCurrentTransform,
-          x: x,
-          y: y,
-          fontSize: fontSize,
-          addToPath: addToPath
-        });
-      }
-    },
-
-    showText: function CanvasGraphics_showText(glyphs, skipTextSelection) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize;
-      var fontSizeScale = current.fontSizeScale;
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var textHScale = current.textHScale * current.fontDirection;
-      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
-      var glyphsLength = glyphs.length;
-      var textLayer = this.textLayer;
-      var geom;
-      var textSelection = textLayer && !skipTextSelection ? true : false;
-      var canvasWidth = 0.0;
-      var vertical = font.vertical;
-      var defaultVMetrics = font.defaultVMetrics;
-
-      // Type3 fonts - each glyph is a "mini-PDF"
-      if (font.coded) {
-        ctx.save();
-        ctx.transform.apply(ctx, current.textMatrix);
-        ctx.translate(current.x, current.y);
-
-        ctx.scale(textHScale, 1);
-
-        if (textSelection) {
-          this.save();
-          ctx.scale(1, -1);
-          geom = this.createTextGeometry();
-          this.restore();
-        }
-        for (var i = 0; i < glyphsLength; ++i) {
-
-          var glyph = glyphs[i];
-          if (glyph === null) {
-            // word break
-            this.ctx.translate(wordSpacing, 0);
-            current.x += wordSpacing * textHScale;
-            continue;
-          }
-
-          this.processingType3 = glyph;
-          this.save();
-          ctx.scale(fontSize, fontSize);
-          ctx.transform.apply(ctx, fontMatrix);
-          this.executeOperatorList(glyph.operatorList);
-          this.restore();
-
-          var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
-          var width = (transformed[0] * fontSize + charSpacing) *
-                      current.fontDirection;
-
-          ctx.translate(width, 0);
-          current.x += width * textHScale;
-
-          canvasWidth += width;
-        }
-        ctx.restore();
-        this.processingType3 = null;
-      } else {
-        ctx.save();
-        this.applyTextTransforms();
-
-        var lineWidth = current.lineWidth;
-        var a1 = current.textMatrix[0], b1 = current.textMatrix[1];
-        var scale = Math.sqrt(a1 * a1 + b1 * b1);
-        if (scale === 0 || lineWidth === 0)
-          lineWidth = this.getSinglePixelWidth();
-        else
-          lineWidth /= scale;
-
-        if (textSelection)
-          geom = this.createTextGeometry();
-
-        if (fontSizeScale != 1.0) {
-          ctx.scale(fontSizeScale, fontSizeScale);
-          lineWidth /= fontSizeScale;
-        }
-
-        ctx.lineWidth = lineWidth;
-
-        var x = 0;
-        for (var i = 0; i < glyphsLength; ++i) {
-          var glyph = glyphs[i];
-          if (glyph === null) {
-            // word break
-            x += current.fontDirection * wordSpacing;
-            continue;
-          }
-
-          var restoreNeeded = false;
-          var character = glyph.fontChar;
-          var vmetric = glyph.vmetric || defaultVMetrics;
-          if (vertical) {
-            var vx = glyph.vmetric ? vmetric[1] : glyph.width * 0.5;
-            vx = -vx * fontSize * current.fontMatrix[0];
-            var vy = vmetric[2] * fontSize * current.fontMatrix[0];
-          }
-          var width = vmetric ? -vmetric[0] : glyph.width;
-          var charWidth = width * fontSize * current.fontMatrix[0] +
-                          charSpacing * current.fontDirection;
-          var accent = glyph.accent;
-
-          var scaledX, scaledY, scaledAccentX, scaledAccentY;
-          if (!glyph.disabled) {
-            if (vertical) {
-              scaledX = vx / fontSizeScale;
-              scaledY = (x + vy) / fontSizeScale;
-            } else {
-              scaledX = x / fontSizeScale;
-              scaledY = 0;
-            }
-
-            if (font.remeasure && width > 0) {
-              // some standard fonts may not have the exact width, trying to
-              // rescale per character
-              var measuredWidth = ctx.measureText(character).width * 1000 /
-                current.fontSize * current.fontSizeScale;
-              var characterScaleX = width / measuredWidth;
-              restoreNeeded = true;
-              ctx.save();
-              ctx.scale(characterScaleX, 1);
-              scaledX /= characterScaleX;
-              if (accent) {
-                scaledAccentX /= characterScaleX;
-              }
-            }
-
-            this.paintChar(character, scaledX, scaledY);
-            if (accent) {
-              scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
-              scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
-              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
-            }
-          }
-
-          x += charWidth;
-
-          canvasWidth += charWidth;
-
-          if (restoreNeeded) {
-            ctx.restore();
-          }
-        }
-        if (vertical) {
-          current.y -= x * textHScale;
-        } else {
-          current.x += x * textHScale;
-        }
-        ctx.restore();
-      }
-
-      if (textSelection) {
-        geom.canvasWidth = canvasWidth;
-        if (vertical) {
-          var VERTICAL_TEXT_ROTATION = Math.PI / 2;
-          geom.angle += VERTICAL_TEXT_ROTATION;
-        }
-        this.textLayer.appendText(geom);
-      }
-
-      return canvasWidth;
-    },
-    showSpacedText: function CanvasGraphics_showSpacedText(arr) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize;
-      // TJ array's number is independent from fontMatrix
-      var textHScale = current.textHScale * 0.001 * current.fontDirection;
-      var arrLength = arr.length;
-      var textLayer = this.textLayer;
-      var geom;
-      var canvasWidth = 0.0;
-      var textSelection = textLayer ? true : false;
-      var vertical = font.vertical;
-      var spacingAccumulator = 0;
-
-      if (textSelection) {
-        ctx.save();
-        this.applyTextTransforms();
-        geom = this.createTextGeometry();
-        ctx.restore();
-      }
-
-      for (var i = 0; i < arrLength; ++i) {
-        var e = arr[i];
-        if (isNum(e)) {
-          var spacingLength = -e * fontSize * textHScale;
-          if (vertical) {
-            current.y += spacingLength;
-          } else {
-            current.x += spacingLength;
-          }
-
-          if (textSelection)
-            spacingAccumulator += spacingLength;
-        } else {
-          var shownCanvasWidth = this.showText(e, true);
-
-          if (textSelection) {
-            canvasWidth += spacingAccumulator + shownCanvasWidth;
-            spacingAccumulator = 0;
-          }
-        }
-      }
-
-      if (textSelection) {
-        geom.canvasWidth = canvasWidth;
-        if (vertical) {
-          var VERTICAL_TEXT_ROTATION = Math.PI / 2;
-          geom.angle += VERTICAL_TEXT_ROTATION;
-        }
-        this.textLayer.appendText(geom);
-      }
-    },
-    nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
-      this.nextLine();
-      this.showText(text);
-    },
-    nextLineSetSpacingShowText:
-      function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
-                                                         charSpacing,
-                                                         text) {
-      this.setWordSpacing(wordSpacing);
-      this.setCharSpacing(charSpacing);
-      this.nextLineShowText(text);
-    },
-
-    // Type3 fonts
-    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
-      // We can safely ignore this since the width should be the same
-      // as the width in the Widths array.
-    },
-    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
-                                                                        yWidth,
-                                                                        llx,
-                                                                        lly,
-                                                                        urx,
-                                                                        ury) {
-      // TODO According to the spec we're also suppose to ignore any operators
-      // that set color or include images while processing this type3 font.
-      this.rectangle(llx, lly, urx - llx, ury - lly);
-      this.clip();
-      this.endPath();
-    },
-
-    // Color
-    setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
-      this.current.strokeColorSpace = ColorSpace.fromIR(raw);
-    },
-    setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
-      this.current.fillColorSpace = ColorSpace.fromIR(raw);
-    },
-    setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
-      var cs = this.current.strokeColorSpace;
-      var rgbColor = cs.getRgb(arguments, 0);
-      var color = Util.makeCssRgb(rgbColor);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
-      if (IR[0] == 'TilingPattern') {
-        var args = IR[1];
-        var base = cs.base;
-        var color;
-        if (base) {
-          var baseComps = base.numComps;
-
-          color = base.getRgb(args, 0);
-        }
-        var pattern = new TilingPattern(IR, color, this.ctx, this.objs,
-                                        this.commonObjs, this.baseTransform);
-      } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
-        var pattern = Pattern.shadingFromIR(IR);
-      } else {
-        error('Unkown IR type ' + IR[0]);
-      }
-      return pattern;
-    },
-    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
-      var cs = this.current.strokeColorSpace;
-
-      if (cs.name == 'Pattern') {
-        this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
-      } else {
-        this.setStrokeColor.apply(this, arguments);
-      }
-    },
-    setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
-      var cs = this.current.fillColorSpace;
-      var rgbColor = cs.getRgb(arguments, 0);
-      var color = Util.makeCssRgb(rgbColor);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
-      var cs = this.current.fillColorSpace;
-
-      if (cs.name == 'Pattern') {
-        this.current.fillColor = this.getColorN_Pattern(arguments, cs);
-      } else {
-        this.setFillColor.apply(this, arguments);
-      }
-    },
-    setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
-      this.current.strokeColorSpace = ColorSpace.singletons.gray;
-
-      var rgbColor = this.current.strokeColorSpace.getRgb(arguments, 0);
-      var color = Util.makeCssRgb(rgbColor);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillGray: function CanvasGraphics_setFillGray(gray) {
-      this.current.fillColorSpace = ColorSpace.singletons.gray;
-
-      var rgbColor = this.current.fillColorSpace.getRgb(arguments, 0);
-      var color = Util.makeCssRgb(rgbColor);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
-      this.current.strokeColorSpace = ColorSpace.singletons.rgb;
-
-      var rgbColor = this.current.strokeColorSpace.getRgb(arguments, 0);
-      var color = Util.makeCssRgb(rgbColor);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
-      this.current.fillColorSpace = ColorSpace.singletons.rgb;
-
-      var rgbColor = this.current.fillColorSpace.getRgb(arguments, 0);
-      var color = Util.makeCssRgb(rgbColor);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-    setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
-      this.current.strokeColorSpace = ColorSpace.singletons.cmyk;
-
-      var color = Util.makeCssCmyk(arguments);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
-      this.current.fillColorSpace = ColorSpace.singletons.cmyk;
-
-      var color = Util.makeCssCmyk(arguments);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-
-    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
-      var ctx = this.ctx;
-
-      this.save();
-      var pattern = Pattern.shadingFromIR(patternIR);
-      ctx.fillStyle = pattern.getPattern(ctx);
-
-      var inv = ctx.mozCurrentTransformInverse;
-      if (inv) {
-        var canvas = ctx.canvas;
-        var width = canvas.width;
-        var height = canvas.height;
-
-        var bl = Util.applyTransform([0, 0], inv);
-        var br = Util.applyTransform([0, height], inv);
-        var ul = Util.applyTransform([width, 0], inv);
-        var ur = Util.applyTransform([width, height], inv);
-
-        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
-        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
-        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
-        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
-
-        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+        action[0].call(action[1], data.data, promise);
       } else {
-        // HACK to draw the gradient onto an infinite rectangle.
-        // PDF gradients are drawn across the entire image while
-        // Canvas only allows gradients to be drawn in a rectangle
-        // The following bug should allow us to remove this.
-        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
-
-        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
-      }
-
-      this.restore();
-    },
-
-    // Images
-    beginInlineImage: function CanvasGraphics_beginInlineImage() {
-      error('Should not call beginInlineImage');
-    },
-    beginImageData: function CanvasGraphics_beginImageData() {
-      error('Should not call beginImageData');
-    },
-
-    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
-                                                                        bbox) {
-      this.save();
-      this.current.paintFormXObjectDepth++;
-      this.baseTransformStack.push(this.baseTransform);
-
-      if (matrix && isArray(matrix) && 6 == matrix.length)
-        this.transform.apply(this, matrix);
-
-      this.baseTransform = this.ctx.mozCurrentTransform;
-
-      if (bbox && isArray(bbox) && 4 == bbox.length) {
-        var width = bbox[2] - bbox[0];
-        var height = bbox[3] - bbox[1];
-        this.rectangle(bbox[0], bbox[1], width, height);
-        this.clip();
-        this.endPath();
-      }
-    },
-
-    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
-      var depth = this.current.paintFormXObjectDepth;
-      do {
-        this.restore();
-        // some pdf don't close all restores inside object
-        // closing those for them
-      } while (this.current.paintFormXObjectDepth >= depth);
-      this.baseTransform = this.baseTransformStack.pop();
-    },
-
-    beginGroup: function CanvasGraphics_beginGroup(group) {
-      this.save();
-      var currentCtx = this.ctx;
-      // TODO non-isolated groups - according to Rik at adobe non-isolated
-      // group results aren't usually that different and they even have tools
-      // that ignore this setting. Notes from Rik on implmenting:
-      // - When you encounter an transparency group, create a new canvas with
-      // the dimensions of the bbox
-      // - copy the content from the previous canvas to the new canvas
-      // - draw as usual
-      // - remove the backdrop alpha:
-      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha
-      // value of your transparency group and 'alphaBackdrop' the alpha of the
-      // backdrop
-      // - remove background color:
-      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)
-      if (!group.isolated) {
-        info('TODO: Support non-isolated groups.');
-      }
-
-      // TODO knockout - supposedly possible with the clever use of compositing
-      // modes.
-      if (group.knockout) {
-        TODO('Support knockout groups.');
-      }
-
-      var currentTransform = currentCtx.mozCurrentTransform;
-      if (group.matrix) {
-        currentCtx.transform.apply(currentCtx, group.matrix);
-      }
-      assert(group.bbox, 'Bounding box is required.');
-
-      // Based on the current transform figure out how big the bounding box
-      // will actually be.
-      var bounds = Util.getAxialAlignedBoundingBox(
-                    group.bbox,
-                    currentCtx.mozCurrentTransform);
-      // Use ceil in case we're between sizes so we don't create canvas that is
-      // too small and make the canvas at least 1x1 pixels.
-      var drawnWidth = Math.max(Math.ceil(bounds[2] - bounds[0]), 1);
-      var drawnHeight = Math.max(Math.ceil(bounds[3] - bounds[1]), 1);
-
-      var scratchCanvas = createScratchCanvas(drawnWidth, drawnHeight);
-      var groupCtx = scratchCanvas.getContext('2d');
-      addContextCurrentTransform(groupCtx);
-      // Since we created a new canvas that is just the size of the bounding box
-      // we have to translate the group ctx.
-      var offsetX = bounds[0];
-      var offsetY = bounds[1];
-      groupCtx.translate(-offsetX, -offsetY);
-      groupCtx.transform.apply(groupCtx, currentTransform);
-
-      // Setup the current ctx so when the group is popped we draw it the right
-      // location.
-      currentCtx.setTransform(1, 0, 0, 1, 0, 0);
-      currentCtx.translate(offsetX, offsetY);
-
-      // The transparency group inherits all off the current graphics state
-      // except the blend mode, soft mask, and alpha constants.
-      copyCtxState(currentCtx, groupCtx);
-      this.ctx = groupCtx;
-      this.setGState([
-        ['SMask', 'None'],
-        ['BM', 'Normal'],
-        ['ca', 1],
-        ['CA', 1]
-      ]);
-      this.groupStack.push(currentCtx);
-    },
-
-    endGroup: function CanvasGraphics_endGroup(group) {
-      var groupCtx = this.ctx;
-      this.ctx = this.groupStack.pop();
-      // Turn off image smoothing to avoid sub pixel interpolation which can
-      // look kind of blurry for some pdfs.
-      if ('imageSmoothingEnabled' in this.ctx) {
-        this.ctx.imageSmoothingEnabled = false;
-      } else {
-        this.ctx.mozImageSmoothingEnabled = false;
-      }
-      this.ctx.drawImage(groupCtx.canvas, 0, 0);
-      this.restore();
-    },
-
-    beginAnnotations: function CanvasGraphics_beginAnnotations() {
-      this.save();
-      this.current = new CanvasExtraState();
-    },
-
-    endAnnotations: function CanvasGraphics_endAnnotations() {
-      this.restore();
-    },
-
-    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,
-                                                             matrix) {
-      this.save();
-
-      if (rect && isArray(rect) && 4 == rect.length) {
-        var width = rect[2] - rect[0];
-        var height = rect[3] - rect[1];
-        this.rectangle(rect[0], rect[1], width, height);
-        this.clip();
-        this.endPath();
-      }
-
-      this.transform.apply(this, transform);
-      this.transform.apply(this, matrix);
-    },
-
-    endAnnotation: function CanvasGraphics_endAnnotation() {
-      this.restore();
-    },
-
-    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
-      var domImage = this.objs.get(objId);
-      if (!domImage) {
-        error('Dependent image isn\'t ready yet');
-      }
-
-      this.save();
-
-      var ctx = this.ctx;
-      // scale the image to the unit square
-      ctx.scale(1 / w, -1 / h);
-
-      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
-                    0, -h, w, h);
-      if (this.imageLayer) {
-        var currentTransform = ctx.mozCurrentTransformInverse;
-        var position = this.getCanvasPosition(0, 0);
-        this.imageLayer.appendImage({
-          objId: objId,
-          left: position[0],
-          top: position[1],
-          width: w / currentTransform[0],
-          height: h / currentTransform[3]
-        });
-      }
-      this.restore();
-    },
-
-    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
-      var ctx = this.ctx;
-      var width = img.width, height = img.height;
-
-      var glyph = this.processingType3;
-
-      if (COMPILE_TYPE3_GLYPHS && glyph && !('compiled' in glyph)) {
-        var MAX_SIZE_TO_COMPILE = 1000;
-        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
-          glyph.compiled =
-            compileType3Glyph({data: img.data, width: width, height: height});
-        } else {
-          glyph.compiled = null;
-        }
-      }
-
-      if (glyph && glyph.compiled) {
-        glyph.compiled(ctx);
-        return;
-      }
-
-      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
-      var maskCtx = maskCanvas.getContext('2d');
-      maskCtx.save();
-
-      putBinaryImageData(maskCtx, img);
-
-      maskCtx.globalCompositeOperation = 'source-in';
-
-      var fillColor = this.current.fillColor;
-      maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
-                          fillColor.type === 'Pattern') ?
-                          fillColor.getPattern(maskCtx) : fillColor;
-      maskCtx.fillRect(0, 0, width, height);
-
-      maskCtx.restore();
-
-      this.paintInlineImageXObject(maskCanvas);
-    },
-
-    paintImageMaskXObjectGroup:
-      function CanvasGraphics_paintImageMaskXObjectGroup(images) {
-      var ctx = this.ctx;
-
-      for (var i = 0, ii = images.length; i < ii; i++) {
-        var image = images[i];
-        var width = image.width, height = image.height;
-
-        var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
-        var maskCtx = maskCanvas.getContext('2d');
-        maskCtx.save();
-
-        putBinaryImageData(maskCtx, image);
-
-        maskCtx.globalCompositeOperation = 'source-in';
-
-        var fillColor = this.current.fillColor;
-        maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
-                            fillColor.type === 'Pattern') ?
-                            fillColor.getPattern(maskCtx) : fillColor;
-        maskCtx.fillRect(0, 0, width, height);
-
-        maskCtx.restore();
-
-        ctx.save();
-        ctx.transform.apply(ctx, image.transform);
-        ctx.scale(1, -1);
-        ctx.drawImage(maskCanvas, 0, 0, width, height,
-                      0, -1, 1, 1);
-        ctx.restore();
-      }
-    },
-
-    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
-      var imgData = this.objs.get(objId);
-      if (!imgData)
-        error('Dependent image isn\'t ready yet');
-
-      this.paintInlineImageXObject(imgData);
-    },
-
-    paintInlineImageXObject:
-      function CanvasGraphics_paintInlineImageXObject(imgData) {
-      var width = imgData.width;
-      var height = imgData.height;
-      var ctx = this.ctx;
-
-      this.save();
-      // scale the image to the unit square
-      ctx.scale(1 / width, -1 / height);
-
-      var currentTransform = ctx.mozCurrentTransformInverse;
-      var a = currentTransform[0], b = currentTransform[1];
-      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
-      var c = currentTransform[2], d = currentTransform[3];
-      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
-
-      var imgToPaint;
-      if (imgData instanceof HTMLElement) {
-        imgToPaint = imgData;
-      } else {
-        var tmpCanvas = CachedCanvases.getCanvas('inlineImage', width, height);
-        var tmpCtx = tmpCanvas.getContext('2d');
-        putBinaryImageData(tmpCtx, imgData);
-        imgToPaint = tmpCanvas;
-      }
-
-      var paintWidth = width, paintHeight = height;
-      var tmpCanvasId = 'prescale1';
-      // Vertial or horizontal scaling shall not be more than 2 to not loose the
-      // pixels during drawImage operation, painting on the temporary canvas(es)
-      // that are twice smaller in size
-      while ((widthScale > 2 && paintWidth > 1) ||
-             (heightScale > 2 && paintHeight > 1)) {
-        var newWidth = paintWidth, newHeight = paintHeight;
-        if (widthScale > 2 && paintWidth > 1) {
-          newWidth = Math.ceil(paintWidth / 2);
-          widthScale /= paintWidth / newWidth;
-        }
-        if (heightScale > 2 && paintHeight > 1) {
-          newHeight = Math.ceil(paintHeight / 2);
-          heightScale /= paintHeight / newHeight;
-        }
-        var tmpCanvas = CachedCanvases.getCanvas(tmpCanvasId,
-                                                 newWidth, newHeight);
-        tmpCtx = tmpCanvas.getContext('2d');
-        tmpCtx.clearRect(0, 0, newWidth, newHeight);
-        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
-                                     0, 0, newWidth, newHeight);
-        imgToPaint = tmpCanvas;
-        paintWidth = newWidth;
-        paintHeight = newHeight;
-        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
-      }
-      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
-                                0, -height, width, height);
-
-      if (this.imageLayer) {
-        var position = this.getCanvasPosition(0, -height);
-        this.imageLayer.appendImage({
-          imgData: imgData,
-          left: position[0],
-          top: position[1],
-          width: width / currentTransform[0],
-          height: height / currentTransform[3]
-        });
-      }
-      this.restore();
-    },
-
-    paintInlineImageXObjectGroup:
-      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
-      var ctx = this.ctx;
-      var w = imgData.width;
-      var h = imgData.height;
-
-      var tmpCanvas = CachedCanvases.getCanvas('inlineImage', w, h);
-      var tmpCtx = tmpCanvas.getContext('2d');
-      putBinaryImageData(tmpCtx, imgData);
-
-      for (var i = 0, ii = map.length; i < ii; i++) {
-        var entry = map[i];
-        ctx.save();
-        ctx.transform.apply(ctx, entry.transform);
-        ctx.scale(1, -1);
-        ctx.drawImage(tmpCanvas, entry.x, entry.y, entry.w, entry.h,
-                      0, -1, 1, 1);
-        if (this.imageLayer) {
-          var position = this.getCanvasPosition(entry.x, entry.y);
-          this.imageLayer.appendImage({
-            imgData: imgData,
-            left: position[0],
-            top: position[1],
-            width: w,
-            height: h
-          });
-        }
-        ctx.restore();
-      }
-    },
-
-    // Marked content
-
-    markPoint: function CanvasGraphics_markPoint(tag) {
-      // TODO Marked content.
-    },
-    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
-      // TODO Marked content.
-    },
-    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
-      // TODO Marked content.
-    },
-    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
-                                        tag, properties) {
-      // TODO Marked content.
-    },
-    endMarkedContent: function CanvasGraphics_endMarkedContent() {
-      // TODO Marked content.
-    },
-
-    // Compatibility
-
-    beginCompat: function CanvasGraphics_beginCompat() {
-      // TODO ignore undefined operators (should we do that anyway?)
-    },
-    endCompat: function CanvasGraphics_endCompat() {
-      // TODO stop ignoring undefined operators
-    },
-
-    // Helper functions
-
-    consumePath: function CanvasGraphics_consumePath() {
-      if (this.pendingClip) {
-        if (this.pendingClip == EO_CLIP) {
-          if ('mozFillRule' in this.ctx) {
-            this.ctx.mozFillRule = 'evenodd';
-            this.ctx.clip();
-            this.ctx.mozFillRule = 'nonzero';
-          } else {
-            try {
-              this.ctx.clip('evenodd');
-            } catch (ex) {
-              // shouldn't really happen, but browsers might think differently
-              this.ctx.clip();
-            }
-          }
-        } else {
-          this.ctx.clip();
-        }
-        this.pendingClip = null;
-      }
-      this.ctx.beginPath();
-    },
-    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
-      var inverse = this.ctx.mozCurrentTransformInverse;
-      // max of the current horizontal and vertical scale
-      return Math.sqrt(Math.max(
-        (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
-        (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
-    },
-    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
-        var transform = this.ctx.mozCurrentTransform;
-        return [
-          transform[0] * x + transform[2] * y + transform[4],
-          transform[1] * x + transform[3] * y + transform[5]
-        ];
-    }
-  };
-
-  return CanvasGraphics;
-})();
-
-
-
-var Name = (function NameClosure() {
-  function Name(name) {
-    this.name = name;
-  }
-
-  Name.prototype = {};
-
-  return Name;
-})();
-
-var Cmd = (function CmdClosure() {
-  function Cmd(cmd) {
-    this.cmd = cmd;
-  }
-
-  Cmd.prototype = {};
-
-  var cmdCache = {};
-
-  Cmd.get = function Cmd_get(cmd) {
-    var cmdValue = cmdCache[cmd];
-    if (cmdValue)
-      return cmdValue;
-
-    return cmdCache[cmd] = new Cmd(cmd);
-  };
-
-  return Cmd;
-})();
-
-var Dict = (function DictClosure() {
-  var nonSerializable = function nonSerializableClosure() {
-    return nonSerializable; // creating closure on some variable
-  };
-
-  // xref is optional
-  function Dict(xref) {
-    // Map should only be used internally, use functions below to access.
-    this.map = Object.create(null);
-    this.xref = xref;
-    this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict
-  }
-
-  Dict.prototype = {
-    assignXref: function Dict_assignXref(newXref) {
-      this.xref = newXref;
-    },
-
-    // automatically dereferences Ref objects
-    get: function Dict_get(key1, key2, key3) {
-      var value;
-      var xref = this.xref;
-      if (typeof (value = this.map[key1]) != 'undefined' || key1 in this.map ||
-          typeof key2 == 'undefined') {
-        return xref ? xref.fetchIfRef(value) : value;
-      }
-      if (typeof (value = this.map[key2]) != 'undefined' || key2 in this.map ||
-          typeof key3 == 'undefined') {
-        return xref ? xref.fetchIfRef(value) : value;
-      }
-      value = this.map[key3] || null;
-      return xref ? xref.fetchIfRef(value) : value;
-    },
-
-    // Same as get(), but returns a promise and uses fetchIfRefAsync().
-    getAsync: function Dict_getAsync(key1, key2, key3) {
-      var value;
-      var promise;
-      var xref = this.xref;
-      if (typeof (value = this.map[key1]) !== undefined || key1 in this.map ||
-          typeof key2 === undefined) {
-        if (xref) {
-          return xref.fetchIfRefAsync(value);
-        }
-        promise = new Promise();
-        promise.resolve(value);
-        return promise;
-      }
-      if (typeof (value = this.map[key2]) !== undefined || key2 in this.map ||
-          typeof key3 === undefined) {
-        if (xref) {
-          return xref.fetchIfRefAsync(value);
-        }
-        promise = new Promise();
-        promise.resolve(value);
-        return promise;
-      }
-      value = this.map[key3] || null;
-      if (xref) {
-        return xref.fetchIfRefAsync(value);
-      }
-      promise = new Promise();
-      promise.resolve(value);
-      return promise;
-    },
-
-    // no dereferencing
-    getRaw: function Dict_getRaw(key) {
-      return this.map[key];
-    },
-
-    // creates new map and dereferences all Refs
-    getAll: function Dict_getAll() {
-      var all = {};
-      for (var key in this.map) {
-        var obj = this.get(key);
-        all[key] = obj instanceof Dict ? obj.getAll() : obj;
-      }
-      return all;
-    },
-
-    set: function Dict_set(key, value) {
-      this.map[key] = value;
-    },
-
-    has: function Dict_has(key) {
-      return key in this.map;
-    },
-
-    forEach: function Dict_forEach(callback) {
-      for (var key in this.map) {
-        callback(key, this.get(key));
-      }
-    }
-  };
-
-  return Dict;
-})();
-
-var Ref = (function RefClosure() {
-  function Ref(num, gen) {
-    this.num = num;
-    this.gen = gen;
-  }
-
-  Ref.prototype = {};
-
-  return Ref;
-})();
-
-// The reference is identified by number and generation,
-// this structure stores only one instance of the reference.
-var RefSet = (function RefSetClosure() {
-  function RefSet() {
-    this.dict = {};
-  }
-
-  RefSet.prototype = {
-    has: function RefSet_has(ref) {
-      return ('R' + ref.num + '.' + ref.gen) in this.dict;
-    },
-
-    put: function RefSet_put(ref) {
-      this.dict['R' + ref.num + '.' + ref.gen] = true;
-    },
-
-    remove: function RefSet_remove(ref) {
-      delete this.dict['R' + ref.num + '.' + ref.gen];
-    }
-  };
-
-  return RefSet;
-})();
-
-var RefSetCache = (function RefSetCacheClosure() {
-  function RefSetCache() {
-    this.dict = {};
-  }
-
-  RefSetCache.prototype = {
-    get: function RefSetCache_get(ref) {
-      return this.dict['R' + ref.num + '.' + ref.gen];
-    },
-
-    has: function RefSetCache_has(ref) {
-      return ('R' + ref.num + '.' + ref.gen) in this.dict;
-    },
-
-    put: function RefSetCache_put(ref, obj) {
-      this.dict['R' + ref.num + '.' + ref.gen] = obj;
-    }
-  };
-
-  return RefSetCache;
-})();
-
-var Catalog = (function CatalogClosure() {
-  function Catalog(pdfManager, xref) {
-    this.pdfManager = pdfManager;
-    this.xref = xref;
-    this.catDict = xref.getCatalogObj();
-    assertWellFormed(isDict(this.catDict),
-      'catalog object is not a dictionary');
-
-    // Stores state as we traverse the pages catalog so that we can resume
-    // parsing if an exception is thrown
-    this.traversePagesQueue = [{
-      pagesDict: this.toplevelPagesDict,
-      posInKids: 0
-    }];
-    this.pagePromises = [];
-    this.currPageIndex = 0;
-  }
-
-  Catalog.prototype = {
-    get metadata() {
-      var streamRef = this.catDict.getRaw('Metadata');
-      if (!isRef(streamRef))
-        return shadow(this, 'metadata', null);
-
-      var encryptMetadata = !this.xref.encrypt ? false :
-        this.xref.encrypt.encryptMetadata;
-
-      var stream = this.xref.fetch(streamRef, !encryptMetadata);
-      var metadata;
-      if (stream && isDict(stream.dict)) {
-        var type = stream.dict.get('Type');
-        var subtype = stream.dict.get('Subtype');
-
-        if (isName(type) && isName(subtype) &&
-            type.name === 'Metadata' && subtype.name === 'XML') {
-          // XXX: This should examine the charset the XML document defines,
-          // however since there are currently no real means to decode
-          // arbitrary charsets, let's just hope that the author of the PDF
-          // was reasonable enough to stick with the XML default charset,
-          // which is UTF-8.
-          try {
-            metadata = stringToUTF8String(bytesToString(stream.getBytes()));
-          } catch (e) {
-            info('Skipping invalid metadata.');
-          }
-        }
-      }
-
-      return shadow(this, 'metadata', metadata);
-    },
-    get toplevelPagesDict() {
-      var pagesObj = this.catDict.get('Pages');
-      assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
-      // shadow the prototype getter
-      return shadow(this, 'toplevelPagesDict', pagesObj);
-    },
-    get documentOutline() {
-      var obj = null;
-      try {
-        obj = this.readDocumentOutline();
-      } catch (ex) {
-        if (ex instanceof MissingDataException) {
-          throw ex;
-        }
-        warn('Unable to read document outline');
-      }
-      return shadow(this, 'documentOutline', obj);
-    },
-    readDocumentOutline: function Catalog_readDocumentOutline() {
-      var xref = this.xref;
-      var obj = this.catDict.get('Outlines');
-      var root = { items: [] };
-      if (isDict(obj)) {
-        obj = obj.getRaw('First');
-        var processed = new RefSet();
-        if (isRef(obj)) {
-          var queue = [{obj: obj, parent: root}];
-          // to avoid recursion keeping track of the items
-          // in the processed dictionary
-          processed.put(obj);
-          while (queue.length > 0) {
-            var i = queue.shift();
-            var outlineDict = xref.fetchIfRef(i.obj);
-            if (outlineDict === null)
-              continue;
-            if (!outlineDict.has('Title'))
-              error('Invalid outline item');
-            var dest = outlineDict.get('A');
-            if (dest)
-              dest = dest.get('D');
-            else if (outlineDict.has('Dest')) {
-              dest = outlineDict.getRaw('Dest');
-              if (isName(dest))
-                dest = dest.name;
-            }
-            var title = outlineDict.get('Title');
-            var outlineItem = {
-              dest: dest,
-              title: stringToPDFString(title),
-              color: outlineDict.get('C') || [0, 0, 0],
-              count: outlineDict.get('Count'),
-              bold: !!(outlineDict.get('F') & 2),
-              italic: !!(outlineDict.get('F') & 1),
-              items: []
-            };
-            i.parent.items.push(outlineItem);
-            obj = outlineDict.getRaw('First');
-            if (isRef(obj) && !processed.has(obj)) {
-              queue.push({obj: obj, parent: outlineItem});
-              processed.put(obj);
-            }
-            obj = outlineDict.getRaw('Next');
-            if (isRef(obj) && !processed.has(obj)) {
-              queue.push({obj: obj, parent: i.parent});
-              processed.put(obj);
-            }
-          }
-        }
-      }
-      return root.items.length > 0 ? root.items : null;
-    },
-    get numPages() {
-      var obj = this.toplevelPagesDict.get('Count');
-      assertWellFormed(
-        isInt(obj),
-        'page count in top level pages object is not an integer'
-      );
-      // shadow the prototype getter
-      return shadow(this, 'num', obj);
-    },
-    get destinations() {
-      function fetchDestination(dest) {
-        return isDict(dest) ? dest.get('D') : dest;
-      }
-
-      var xref = this.xref;
-      var dests = {}, nameTreeRef, nameDictionaryRef;
-      var obj = this.catDict.get('Names');
-      if (obj)
-        nameTreeRef = obj.getRaw('Dests');
-      else if (this.catDict.has('Dests'))
-        nameDictionaryRef = this.catDict.get('Dests');
-
-      if (nameDictionaryRef) {
-        // reading simple destination dictionary
-        obj = nameDictionaryRef;
-        obj.forEach(function catalogForEach(key, value) {
-          if (!value) return;
-          dests[key] = fetchDestination(value);
-        });
-      }
-      if (nameTreeRef) {
-        var nameTree = new NameTree(nameTreeRef, xref);
-        var names = nameTree.getAll();
-        for (var name in names) {
-          if (!names.hasOwnProperty(name)) {
-            continue;
-          }
-          dests[name] = fetchDestination(names[name]);
-        }
-      }
-      return shadow(this, 'destinations', dests);
-    },
-    get javaScript() {
-      var xref = this.xref;
-      var obj = this.catDict.get('Names');
-
-      var javaScript = [];
-      if (obj && obj.has('JavaScript')) {
-        var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);
-        var names = nameTree.getAll();
-        for (var name in names) {
-          if (!names.hasOwnProperty(name)) {
-            continue;
-          }
-          // We don't really use the JavaScript right now so this code is
-          // defensive so we don't cause errors on document load.
-          var jsDict = names[name];
-          if (!isDict(jsDict)) {
-            continue;
-          }
-          var type = jsDict.get('S');
-          if (!isName(type) || type.name !== 'JavaScript') {
-            continue;
-          }
-          var js = jsDict.get('JS');
-          if (!isString(js) && !isStream(js)) {
-            continue;
-          }
-          if (isStream(js)) {
-            js = bytesToString(js.getBytes());
-          }
-          javaScript.push(stringToPDFString(js));
-        }
-      }
-      return shadow(this, 'javaScript', javaScript);
-    },
-
-    getPage: function Catalog_getPage(pageIndex) {
-      if (!(pageIndex in this.pagePromises)) {
-        this.pagePromises[pageIndex] = new Promise();
-      }
-      return this.pagePromises[pageIndex];
-    },
-
-    // Traverses pages in DFS order so that pages are processed in increasing
-    // order
-    traversePages: function Catalog_traversePages() {
-      var queue = this.traversePagesQueue;
-      while (queue.length) {
-        var queueItem = queue[queue.length - 1];
-        var pagesDict = queueItem.pagesDict;
-
-        var kids = pagesDict.get('Kids');
-        assert(isArray(kids), 'page dictionary kids object is not an array');
-        if (queueItem.posInKids >= kids.length) {
-          queue.pop();
-          continue;
-        }
-        var kidRef = kids[queueItem.posInKids];
-        assert(isRef(kidRef), 'page dictionary kid is not a reference');
-
-        var kid = this.xref.fetch(kidRef);
-        if (isDict(kid, 'Page') || (isDict(kid) && !kid.has('Kids'))) {
-          var pageIndex = this.currPageIndex++;
-          var page = new Page(this.pdfManager, this.xref, pageIndex, kid,
-                              kidRef);
-          if (!(pageIndex in this.pagePromises)) {
-            this.pagePromises[pageIndex] = new Promise();
-          }
-          this.pagePromises[pageIndex].resolve(page);
-
-        } else { // must be a child page dictionary
-          assert(
-            isDict(kid),
-            'page dictionary kid reference points to wrong type of object'
-          );
-
-          queue.push({
-            pagesDict: kid,
-            posInKids: 0
-          });
-        }
-        ++queueItem.posInKids;
-      }
-    }
-  };
-
-  return Catalog;
-})();
-
-var XRef = (function XRefClosure() {
-  function XRef(stream, password) {
-
-    this.stream = stream;
-    this.entries = [];
-    this.xrefstms = {};
-    // prepare the XRef cache
-    this.cache = [];
-    this.password = password;
-  }
-
-  XRef.prototype = {
-    setStartXRef: function XRef_setStartXRef(startXRef) {
-      // Store the starting positions of xref tables as we process them
-      // so we can recover from missing data errors
-      this.startXRefQueue = [startXRef];
-    },
-
-    parse: function XRef_parse(recoveryMode) {
-      var trailerDict;
-      if (!recoveryMode) {
-        trailerDict = this.readXRef();
-      } else {
-        warn('Indexing all PDF objects');
-        trailerDict = this.indexObjects();
-      }
-      trailerDict.assignXref(this);
-      this.trailer = trailerDict;
-      var encrypt = trailerDict.get('Encrypt');
-      if (encrypt) {
-        var ids = trailerDict.get('ID');
-        var fileId = (ids && ids.length) ? ids[0] : '';
-        this.encrypt = new CipherTransformFactory(
-            encrypt, fileId, this.password);
-      }
-
-      // get the root dictionary (catalog) object
-      if (!(this.root = trailerDict.get('Root'))) {
-        error('Invalid root reference');
-      }
-    },
-
-    processXRefTable: function XRef_processXRefTable(parser) {
-      if (!('tableState' in this)) {
-        // Stores state of the table as we process it so we can resume
-        // from middle of table in case of missing data error
-        this.tableState = {
-          entryNum: 0,
-          streamPos: parser.lexer.stream.pos,
-          parserBuf1: parser.buf1,
-          parserBuf2: parser.buf2
-        };
-      }
-
-      var obj = this.readXRefTable(parser);
-
-      // Sanity check
-      if (!isCmd(obj, 'trailer'))
-        error('Invalid XRef table: could not find trailer dictionary');
-
-      // Read trailer dictionary, e.g.
-      // trailer
-      //    << /Size 22
-      //      /Root 20R
-      //      /Info 10R
-      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
-      //    >>
-      // The parser goes through the entire stream << ... >> and provides
-      // a getter interface for the key-value table
-      var dict = parser.getObj();
-      if (!isDict(dict))
-        error('Invalid XRef table: could not parse trailer dictionary');
-
-      delete this.tableState;
-
-      return dict;
-    },
-
-    readXRefTable: function XRef_readXRefTable(parser) {
-      // Example of cross-reference table:
-      // xref
-      // 0 1                    <-- subsection header (first obj #, obj count)
-      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
-      // 23 2                   <-- subsection header ... and so on ...
-      // 0000025518 00002 n
-      // 0000025635 00000 n
-      // trailer
-      // ...
-
-      var stream = parser.lexer.stream;
-      var tableState = this.tableState;
-      stream.pos = tableState.streamPos;
-      parser.buf1 = tableState.parserBuf1;
-      parser.buf2 = tableState.parserBuf2;
-
-      // Outer loop is over subsection headers
-      var obj;
-
-      while (true) {
-        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {
-          if (isCmd(obj = parser.getObj(), 'trailer')) {
-            break;
-          }
-          tableState.firstEntryNum = obj;
-          tableState.entryCount = parser.getObj();
-        }
-
-        var first = tableState.firstEntryNum;
-        var count = tableState.entryCount;
-        if (!isInt(first) || !isInt(count))
-          error('Invalid XRef table: wrong types in subsection header');
-
-        // Inner loop is over objects themselves
-        for (var i = tableState.entryNum; i < count; i++) {
-          tableState.streamPos = stream.pos;
-          tableState.entryNum = i;
-          tableState.parserBuf1 = parser.buf1;
-          tableState.parserBuf2 = parser.buf2;
-
-          var entry = {};
-          entry.offset = parser.getObj();
-          entry.gen = parser.getObj();
-          var type = parser.getObj();
-
-          if (isCmd(type, 'f'))
-            entry.free = true;
-          else if (isCmd(type, 'n'))
-            entry.uncompressed = true;
-
-          // Validate entry obj
-          if (!isInt(entry.offset) || !isInt(entry.gen) ||
-              !(entry.free || entry.uncompressed)) {
-            console.log(entry.offset, entry.gen, entry.free,
-                entry.uncompressed);
-            error('Invalid entry in XRef subsection: ' + first + ', ' + count);
-          }
-
-          if (!this.entries[i + first])
-            this.entries[i + first] = entry;
-        }
-
-        tableState.entryNum = 0;
-        tableState.streamPos = stream.pos;
-        tableState.parserBuf1 = parser.buf1;
-        tableState.parserBuf2 = parser.buf2;
-        delete tableState.firstEntryNum;
-        delete tableState.entryCount;
-      }
-
-      // Per issue 3248: hp scanners generate bad XRef
-      if (first === 1 && this.entries[1] && this.entries[1].free) {
-        // shifting the entries
-        this.entries.shift();
-      }
-
-      // Sanity check: as per spec, first object must be free
-      if (this.entries[0] && !this.entries[0].free)
-        error('Invalid XRef table: unexpected first object');
-
-      return obj;
-    },
-
-    processXRefStream: function XRef_processXRefStream(stream) {
-      if (!('streamState' in this)) {
-        // Stores state of the stream as we process it so we can resume
-        // from middle of stream in case of missing data error
-        var streamParameters = stream.dict;
-        var byteWidths = streamParameters.get('W');
-        var range = streamParameters.get('Index');
-        if (!range) {
-          range = [0, streamParameters.get('Size')];
-        }
-
-        this.streamState = {
-          entryRanges: range,
-          byteWidths: byteWidths,
-          entryNum: 0,
-          streamPos: stream.pos
-        };
-      }
-      this.readXRefStream(stream);
-      delete this.streamState;
-
-      return stream.dict;
-    },
-
-    readXRefStream: function XRef_readXRefStream(stream) {
-      var i, j;
-      var streamState = this.streamState;
-      stream.pos = streamState.streamPos;
-
-      var byteWidths = streamState.byteWidths;
-      var typeFieldWidth = byteWidths[0];
-      var offsetFieldWidth = byteWidths[1];
-      var generationFieldWidth = byteWidths[2];
-
-      var entryRanges = streamState.entryRanges;
-      while (entryRanges.length > 0) {
-
-        var first = entryRanges[0];
-        var n = entryRanges[1];
-
-        if (!isInt(first) || !isInt(n))
-          error('Invalid XRef range fields: ' + first + ', ' + n);
-
-        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
-            !isInt(generationFieldWidth)) {
-          error('Invalid XRef entry fields length: ' + first + ', ' + n);
-        }
-        for (i = streamState.entryNum; i < n; ++i) {
-          streamState.entryNum = i;
-          streamState.streamPos = stream.pos;
-
-          var type = 0, offset = 0, generation = 0;
-          for (j = 0; j < typeFieldWidth; ++j)
-            type = (type << 8) | stream.getByte();
-          // if type field is absent, its default value = 1
-          if (typeFieldWidth === 0)
-            type = 1;
-          for (j = 0; j < offsetFieldWidth; ++j)
-            offset = (offset << 8) | stream.getByte();
-          for (j = 0; j < generationFieldWidth; ++j)
-            generation = (generation << 8) | stream.getByte();
-          var entry = {};
-          entry.offset = offset;
-          entry.gen = generation;
-          switch (type) {
-            case 0:
-              entry.free = true;
-              break;
-            case 1:
-              entry.uncompressed = true;
-              break;
-            case 2:
-              break;
-            default:
-              error('Invalid XRef entry type: ' + type);
-          }
-          if (!this.entries[first + i])
-            this.entries[first + i] = entry;
-        }
-
-        streamState.entryNum = 0;
-        streamState.streamPos = stream.pos;
-        entryRanges.splice(0, 2);
-      }
-    },
-    indexObjects: function XRef_indexObjects() {
-      // Simple scan through the PDF content to find objects,
-      // trailers and XRef streams.
-      function readToken(data, offset) {
-        var token = '', ch = data[offset];
-        while (ch !== 13 && ch !== 10) {
-          if (++offset >= data.length)
-            break;
-          token += String.fromCharCode(ch);
-          ch = data[offset];
-        }
-        return token;
-      }
-      function skipUntil(data, offset, what) {
-        var length = what.length, dataLength = data.length;
-        var skipped = 0;
-        // finding byte sequence
-        while (offset < dataLength) {
-          var i = 0;
-          while (i < length && data[offset + i] == what[i])
-            ++i;
-          if (i >= length)
-            break; // sequence found
-
-          offset++;
-          skipped++;
-        }
-        return skipped;
-      }
-      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
-      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
-                                          101, 102]);
-      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
-      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
-
-      var stream = this.stream;
-      stream.pos = 0;
-      var buffer = stream.getBytes();
-      var position = stream.start, length = buffer.length;
-      var trailers = [], xrefStms = [];
-      var state = 0;
-      var currentToken;
-      while (position < length) {
-        var ch = buffer[position];
-        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
-          ++position;
-          continue;
-        }
-        if (ch === 37) { // %-comment
-          do {
-            ++position;
-            ch = buffer[position];
-          } while (ch !== 13 && ch !== 10);
-          continue;
-        }
-        var token = readToken(buffer, position);
-        var m;
-        if (token === 'xref') {
-          position += skipUntil(buffer, position, trailerBytes);
-          trailers.push(position);
-          position += skipUntil(buffer, position, startxrefBytes);
-        } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
-          this.entries[m[1]] = {
-            offset: position,
-            gen: m[2] | 0,
-            uncompressed: true
-          };
-
-          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
-          var content = buffer.subarray(position, position + contentLength);
-
-          // checking XRef stream suspect
-          // (it shall have '/XRef' and next char is not a letter)
-          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
-          if (xrefTagOffset < contentLength &&
-              content[xrefTagOffset + 5] < 64) {
-            xrefStms.push(position);
-            this.xrefstms[position] = 1; // don't read it recursively
-          }
-
-          position += contentLength;
-        } else
-          position += token.length + 1;
-      }
-      // reading XRef streams
-      for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
-        this.startXRefQueue.push(xrefStms[i]);
-        this.readXRef(/* recoveryMode */ true);
-      }
-      // finding main trailer
-      var dict;
-      for (var i = 0, ii = trailers.length; i < ii; ++i) {
-        stream.pos = trailers[i];
-        var parser = new Parser(new Lexer(stream), true, null);
-        var obj = parser.getObj();
-        if (!isCmd(obj, 'trailer'))
-          continue;
-        // read the trailer dictionary
-        if (!isDict(dict = parser.getObj()))
-          continue;
-        // taking the first one with 'ID'
-        if (dict.has('ID'))
-          return dict;
-      }
-      // no tailer with 'ID', taking last one (if exists)
-      if (dict)
-        return dict;
-      // nothing helps
-      // calling error() would reject worker with an UnknownErrorException.
-      throw new InvalidPDFException('Invalid PDF structure');
-    },
-
-    readXRef: function XRef_readXRef(recoveryMode) {
-      var stream = this.stream;
-
-      try {
-        while (this.startXRefQueue.length) {
-          var startXRef = this.startXRefQueue[0];
-
-          stream.pos = startXRef;
-
-          var parser = new Parser(new Lexer(stream), true, null);
-          var obj = parser.getObj();
-          var dict;
-
-          // Get dictionary
-          if (isCmd(obj, 'xref')) {
-
-            // Parse end-of-file XRef
-            dict = this.processXRefTable(parser);
-            if (!this.topDict) {
-              this.topDict = dict;
-            }
-
-            // Recursively get other XRefs 'XRefStm', if any
-            obj = dict.get('XRefStm');
-            if (isInt(obj)) {
-              var pos = obj;
-              // ignore previously loaded xref streams
-              // (possible infinite recursion)
-              if (!(pos in this.xrefstms)) {
-                this.xrefstms[pos] = 1;
-                this.startXRefQueue.push(pos);
-              }
-            }
-          } else if (isInt(obj)) {
-
-            // Parse in-stream XRef
-            if (!isInt(parser.getObj()) ||
-                !isCmd(parser.getObj(), 'obj') ||
-                !isStream(obj = parser.getObj())) {
-              error('Invalid XRef stream');
-            }
-            dict = this.processXRefStream(obj);
-            if (!this.topDict) {
-              this.topDict = dict;
-            }
-
-            if (!dict)
-              error('Failed to read XRef stream');
-          }
-
-          // Recursively get previous dictionary, if any
-          obj = dict.get('Prev');
-          if (isInt(obj)) {
-            this.startXRefQueue.push(obj);
-          } else if (isRef(obj)) {
-            // The spec says Prev must not be a reference, i.e. "/Prev NNN"
-            // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
-            this.startXRefQueue.push(obj.num);
-          }
-
-          this.startXRefQueue.shift();
-        }
-
-        return this.topDict;
-      } catch (e) {
-        if (e instanceof MissingDataException) {
-          throw e;
-        }
-        log('(while reading XRef): ' + e);
-      }
-
-      if (recoveryMode)
-        return;
-      throw new XRefParseException();
-    },
-
-    getEntry: function XRef_getEntry(i) {
-      var e = this.entries[i];
-      if (e === null)
-        return null;
-      return e.free || !e.offset ? null : e; // returns null if entry is free
-    },
-    fetchIfRef: function XRef_fetchIfRef(obj) {
-      if (!isRef(obj))
-        return obj;
-      return this.fetch(obj);
-    },
-    fetch: function XRef_fetch(ref, suppressEncryption) {
-      assertWellFormed(isRef(ref), 'ref object is not a reference');
-      var num = ref.num;
-      var e;
-      if (num in this.cache) {
-        e = this.cache[num];
-        if (e instanceof Stream) {
-          return e.makeSubStream(e.start, e.length, e.dict);
-        }
-        return e;
-      }
-
-      e = this.getEntry(num);
-
-      // the referenced entry can be free
-      if (e === null)
-        return (this.cache[num] = e);
-
-      var gen = ref.gen;
-      var stream, parser;
-      if (e.uncompressed) {
-        if (e.gen != gen)
-          error('inconsistent generation in XRef');
-        stream = this.stream.makeSubStream(e.offset);
-        parser = new Parser(new Lexer(stream), true, this);
-        var obj1 = parser.getObj();
-        var obj2 = parser.getObj();
-        var obj3 = parser.getObj();
-        if (!isInt(obj1) || obj1 != num ||
-            !isInt(obj2) || obj2 != gen ||
-            !isCmd(obj3)) {
-          error('bad XRef entry');
-        }
-        if (!isCmd(obj3, 'obj')) {
-          // some bad pdfs use "obj1234" and really mean 1234
-          if (obj3.cmd.indexOf('obj') === 0) {
-            num = parseInt(obj3.cmd.substring(3), 10);
-            if (!isNaN(num))
-              return num;
-          }
-          error('bad XRef entry');
-        }
-        if (this.encrypt && !suppressEncryption) {
-          try {
-            e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
-          } catch (ex) {
-            // almost all streams must be encrypted, but sometimes
-            // they are not probably due to some broken generators
-            // re-trying without encryption
-            return this.fetch(ref, true);
-          }
-        } else {
-          e = parser.getObj();
-        }
-        if (!isStream(e)) {
-          this.cache[num] = e;
-        }
-        return e;
-      }
-
-      // compressed entry
-      var tableOffset = e.offset;
-      stream = this.fetch(new Ref(tableOffset, 0));
-      if (!isStream(stream))
-        error('bad ObjStm stream');
-      var first = stream.dict.get('First');
-      var n = stream.dict.get('N');
-      if (!isInt(first) || !isInt(n)) {
-        error('invalid first and n parameters for ObjStm stream');
-      }
-      parser = new Parser(new Lexer(stream), false, this);
-      parser.allowStreams = true;
-      var i, entries = [], nums = [];
-      // read the object numbers to populate cache
-      for (i = 0; i < n; ++i) {
-        num = parser.getObj();
-        if (!isInt(num)) {
-          error('invalid object number in the ObjStm stream: ' + num);
-        }
-        nums.push(num);
-        var offset = parser.getObj();
-        if (!isInt(offset)) {
-          error('invalid object offset in the ObjStm stream: ' + offset);
-        }
-      }
-      // read stream objects for cache
-      for (i = 0; i < n; ++i) {
-        entries.push(parser.getObj());
-        num = nums[i];
-        var entry = this.entries[num];
-        if (entry && entry.offset === tableOffset && entry.gen === i) {
-          this.cache[num] = entries[i];
-        }
-      }
-      e = entries[e.gen];
-      if (e === undefined) {
-        error('bad XRef entry for compressed object');
-      }
-      return e;
-    },
-    fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) {
-      if (!isRef(obj)) {
-        var promise = new Promise();
-        promise.resolve(obj);
-        return promise;
-      }
-      return this.fetchAsync(obj);
-    },
-    fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {
-      var promise = new Promise();
-      var tryFetch = function (promise) {
-        try {
-          promise.resolve(this.fetch(ref, suppressEncryption));
-        } catch (e) {
-          if (e instanceof MissingDataException) {
-            this.stream.manager.requestRange(e.begin, e.end, tryFetch);
-            return;
-          }
-          promise.reject(e);
-        }
-      }.bind(this, promise);
-      tryFetch();
-      return promise;
-    },
-    getCatalogObj: function XRef_getCatalogObj() {
-      return this.root;
-    }
-  };
-
-  return XRef;
-})();
-
-/**
- * A NameTree is like a Dict but has some adventagous properties, see the spec
- * (7.9.6) for more details.
- * TODO: implement all the Dict functions and make this more efficent.
- */
-var NameTree = (function NameTreeClosure() {
-  function NameTree(root, xref) {
-    this.root = root;
-    this.xref = xref;
-  }
-
-  NameTree.prototype = {
-    getAll: function NameTree_getAll() {
-      var dict = {};
-      if (!this.root) {
-        return dict;
-      }
-      var xref = this.xref;
-      // reading name tree
-      var processed = new RefSet();
-      processed.put(this.root);
-      var queue = [this.root];
-      while (queue.length > 0) {
-        var i, n;
-        var obj = xref.fetchIfRef(queue.shift());
-        if (!isDict(obj)) {
-          continue;
-        }
-        if (obj.has('Kids')) {
-          var kids = obj.get('Kids');
-          for (i = 0, n = kids.length; i < n; i++) {
-            var kid = kids[i];
-            if (processed.has(kid))
-              error('invalid destinations');
-            queue.push(kid);
-            processed.put(kid);
-          }
-          continue;
-        }
-        var names = obj.get('Names');
-        if (names) {
-          for (i = 0, n = names.length; i < n; i += 2) {
-            dict[names[i]] = xref.fetchIfRef(names[i + 1]);
-          }
-        }
-      }
-      return dict;
-    }
-  };
-  return NameTree;
-})();
-
-/**
- * A PDF document and page is built of many objects. E.g. there are objects
- * for fonts, images, rendering code and such. These objects might get processed
- * inside of a worker. The `PDFObjects` implements some basic functions to
- * manage these objects.
- */
-var PDFObjects = (function PDFObjectsClosure() {
-  function PDFObjects() {
-    this.objs = {};
-  }
-
-  PDFObjects.prototype = {
-    /**
-     * Internal function.
-     * Ensures there is an object defined for `objId`.
-     */
-    ensureObj: function PDFObjects_ensureObj(objId) {
-      if (this.objs[objId])
-        return this.objs[objId];
-
-      var obj = {
-        promise: new Promise(objId),
-        data: null,
-        resolved: false
-      };
-      this.objs[objId] = obj;
-
-      return obj;
-    },
-
-    /**
-     * If called *without* callback, this returns the data of `objId` but the
-     * object needs to be resolved. If it isn't, this function throws.
-     *
-     * If called *with* a callback, the callback is called with the data of the
-     * object once the object is resolved. That means, if you call this
-     * function and the object is already resolved, the callback gets called
-     * right away.
-     */
-    get: function PDFObjects_get(objId, callback) {
-      // If there is a callback, then the get can be async and the object is
-      // not required to be resolved right now
-      if (callback) {
-        this.ensureObj(objId).promise.then(callback);
-        return null;
-      }
-
-      // If there isn't a callback, the user expects to get the resolved data
-      // directly.
-      var obj = this.objs[objId];
-
-      // If there isn't an object yet or the object isn't resolved, then the
-      // data isn't ready yet!
-      if (!obj || !obj.resolved)
-        error('Requesting object that isn\'t resolved yet ' + objId);
-
-      return obj.data;
-    },
-
-    /**
-     * Resolves the object `objId` with optional `data`.
-     */
-    resolve: function PDFObjects_resolve(objId, data) {
-      var obj = this.ensureObj(objId);
-
-      obj.resolved = true;
-      obj.data = data;
-      obj.promise.resolve(data);
-    },
-
-    isResolved: function PDFObjects_isResolved(objId) {
-      var objs = this.objs;
-
-      if (!objs[objId]) {
-        return false;
-      } else {
-        return objs[objId].resolved;
-      }
-    },
-
-    hasData: function PDFObjects_hasData(objId) {
-      return this.isResolved(objId);
-    },
-
-    /**
-     * Returns the data of `objId` if object exists, null otherwise.
-     */
-    getData: function PDFObjects_getData(objId) {
-      var objs = this.objs;
-      if (!objs[objId] || !objs[objId].resolved) {
-        return null;
-      } else {
-        return objs[objId].data;
-      }
-    },
-
-    clear: function PDFObjects_clear() {
-      this.objs = {};
-    }
-  };
-  return PDFObjects;
-})();
-
-/**
- * A helper for loading missing data in object graphs. It traverses the graph
- * depth first and queues up any objects that have missing data. Once it has
- * has traversed as many objects that are available it attempts to bundle the
- * missing data requests and then resume from the nodes that weren't ready.
- *
- * NOTE: It provides protection from circular references by keeping track of
- * of loaded references. However, you must be careful not to load any graphs
- * that have references to the catalog or other pages since that will cause the
- * entire PDF document object graph to be traversed.
- */
-var ObjectLoader = (function() {
-
-  function mayHaveChildren(value) {
-    return isRef(value) || isDict(value) || isArray(value) || isStream(value);
-  }
-
-  function addChildren(node, nodesToVisit) {
-    if (isDict(node) || isStream(node)) {
-      var map;
-      if (isDict(node)) {
-        map = node.map;
-      } else {
-        map = node.dict.map;
-      }
-      for (var key in map) {
-        var value = map[key];
-        if (mayHaveChildren(value)) {
-          nodesToVisit.push(value);
-        }
-      }
-    } else if (isArray(node)) {
-      for (var i = 0, ii = node.length; i < ii; i++) {
-        var value = node[i];
-        if (mayHaveChildren(value)) {
-          nodesToVisit.push(value);
-        }
-      }
-    }
-  }
-
-  function ObjectLoader(obj, keys, xref) {
-    this.obj = obj;
-    this.keys = keys;
-    this.xref = xref;
-    this.refSet = null;
-  }
-
-  ObjectLoader.prototype = {
-
-    load: function ObjectLoader_load() {
-      var keys = this.keys;
-      this.promise = new Promise();
-      // Don't walk the graph if all the data is already loaded.
-      if (!(this.xref.stream instanceof ChunkedStream) ||
-          this.xref.stream.getMissingChunks().length === 0) {
-        this.promise.resolve();
-        return this.promise;
-      }
-
-      this.refSet = new RefSet();
-      // Setup the initial nodes to visit.
-      var nodesToVisit = [];
-      for (var i = 0; i < keys.length; i++) {
-        nodesToVisit.push(this.obj[keys[i]]);
-      }
-
-      this.walk(nodesToVisit);
-      return this.promise;
-    },
-
-    walk: function ObjectLoader_walk(nodesToVisit) {
-      var nodesToRevisit = [];
-      var pendingRequests = [];
-      // DFS walk of the object graph.
-      while (nodesToVisit.length) {
-        var currentNode = nodesToVisit.pop();
-
-        // Only references or chunked streams can cause missing data exceptions.
-        if (isRef(currentNode)) {
-          // Skip nodes that have already been visited.
-          if (this.refSet.has(currentNode)) {
-            continue;
-          }
-          try {
-            var ref = currentNode;
-            this.refSet.put(ref);
-            currentNode = this.xref.fetch(currentNode);
-          } catch (e) {
-            if (!(e instanceof MissingDataException)) {
-              throw e;
-            }
-            nodesToRevisit.push(currentNode);
-            pendingRequests.push({ begin: e.begin, end: e.end });
-          }
-        }
-        if (currentNode && currentNode.getBaseStreams) {
-          var baseStreams = currentNode.getBaseStreams();
-          var foundMissingData = false;
-          for (var i = 0; i < baseStreams.length; i++) {
-            var stream = baseStreams[i];
-            if (stream.getMissingChunks && stream.getMissingChunks().length) {
-              foundMissingData = true;
-              pendingRequests.push({
-                begin: stream.start,
-                end: stream.end
-              });
-            }
-          }
-          if (foundMissingData) {
-            nodesToRevisit.push(currentNode);
-          }
-        }
-
-        addChildren(currentNode, nodesToVisit);
-      }
-
-      if (pendingRequests.length) {
-        this.xref.stream.manager.requestRanges(pendingRequests,
-            function pendingRequestCallback() {
-          nodesToVisit = nodesToRevisit;
-          for (var i = 0; i < nodesToRevisit.length; i++) {
-            var node = nodesToRevisit[i];
-            // Remove any reference nodes from the currrent refset so they
-            // aren't skipped when we revist them.
-            if (isRef(node)) {
-              this.refSet.remove(node);
-            }
-          }
-          this.walk(nodesToVisit);
-        }.bind(this));
-        return;
-      }
-      // Everything is loaded.
-      this.refSet = null;
-      this.promise.resolve();
-    }
-
-  };
-
-  return ObjectLoader;
-})();
-
-
-
-
-var Annotation = (function AnnotationClosure() {
-  // 12.5.5: Algorithm: Appearance streams
-  function getTransformMatrix(rect, bbox, matrix) {
-    var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);
-    var minX = bounds[0];
-    var minY = bounds[1];
-    var maxX = bounds[2];
-    var maxY = bounds[3];
-
-    if (minX === maxX || minY === maxY) {
-      // From real-life file, bbox was [0, 0, 0, 0]. In this case,
-      // just apply the transform for rect
-      return [1, 0, 0, 1, rect[0], rect[1]];
-    }
-
-    var xRatio = (rect[2] - rect[0]) / (maxX - minX);
-    var yRatio = (rect[3] - rect[1]) / (maxY - minY);
-    return [
-      xRatio,
-      0,
-      0,
-      yRatio,
-      rect[0] - minX * xRatio,
-      rect[1] - minY * yRatio
-    ];
-  }
-
-  function getDefaultAppearance(dict) {
-    var appearanceState = dict.get('AP');
-    if (!isDict(appearanceState)) {
-      return;
-    }
-
-    var appearance;
-    var appearances = appearanceState.get('N');
-    if (isDict(appearances)) {
-      var as = dict.get('AS');
-      if (as && appearances.has(as.name)) {
-        appearance = appearances.get(as.name);
+        action[0].call(action[1], data.data);
       }
     } else {
-      appearance = appearances;
-    }
-    return appearance;
-  }
-
-  function Annotation(params) {
-    if (params.data) {
-      this.data = params.data;
-      return;
-    }
-
-    var dict = params.dict;
-    var data = this.data = {};
-
-    data.subtype = dict.get('Subtype').name;
-    var rect = dict.get('Rect');
-    data.rect = Util.normalizeRect(rect);
-    data.annotationFlags = dict.get('F');
-
-    var color = dict.get('C');
-    if (isArray(color) && color.length === 3) {
-      // TODO(mack): currently only supporting rgb; need support different
-      // colorspaces
-      data.color = color;
-    } else {
-      data.color = [0, 0, 0];
-    }
-
-    // Some types of annotations have border style dict which has more
-    // info than the border array
-    if (dict.has('BS')) {
-      var borderStyle = dict.get('BS');
-      data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;
-    } else {
-      var borderArray = dict.get('Border') || [0, 0, 1];
-      data.borderWidth = borderArray[2] || 0;
-    }
-
-    this.appearance = getDefaultAppearance(dict);
-  }
-
-  Annotation.prototype = {
-
-    getData: function Annotation_getData() {
-      return this.data;
-    },
-
-    hasHtml: function Annotation_hasHtml() {
-      return false;
-    },
-
-    getHtmlElement: function Annotation_getHtmlElement(commonObjs) {
-      throw new NotImplementedException(
-        'getHtmlElement() should be implemented in subclass');
-    },
-
-    // TODO(mack): Remove this, it's not really that helpful.
-    getEmptyContainer: function Annotation_getEmptyContainer(tagName, rect) {
-      assert(!isWorker,
-        'getEmptyContainer() should be called from main thread');
-
-      rect = rect || this.data.rect;
-      var element = document.createElement(tagName);
-      element.style.width = Math.ceil(rect[2] - rect[0]) + 'px';
-      element.style.height = Math.ceil(rect[3] - rect[1]) + 'px';
-      return element;
-    },
-
-    isViewable: function Annotation_isViewable() {
-      var data = this.data;
-      return !!(
-        data &&
-        (!data.annotationFlags ||
-         !(data.annotationFlags & 0x22)) && // Hidden or NoView
-        data.rect                            // rectangle is nessessary
-      );
-    },
-
-    loadResources: function(keys) {
-      var promise = new Promise();
-      this.appearance.dict.getAsync('Resources').then(function(resources) {
-        if (!resources) {
-          promise.resolve();
-          return;
-        }
-        var objectLoader = new ObjectLoader(resources.map,
-                                            keys,
-                                            resources.xref);
-        objectLoader.load().then(function() {
-          promise.resolve(resources);
-        });
-      }.bind(this));
-
-      return promise;
-    },
-
-    getOperatorList: function Annotation_getToOperatorList(evaluator) {
-
-      var promise = new Promise();
-
-      if (!this.appearance) {
-        promise.resolve(new OperatorList());
-        return promise;
-      }
-
-      var data = this.data;
-
-      var appearanceDict = this.appearance.dict;
-      var resourcesPromise = this.loadResources([
-        'ExtGState',
-        'ColorSpace',
-        'Pattern',
-        'Shading',
-        'XObject',
-        'Font'
-        // ProcSet
-        // Properties
-      ]);
-      var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1];
-      var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0];
-      var transform = getTransformMatrix(data.rect, bbox, matrix);
-
-      var border = data.border;
-
-      resourcesPromise.then(function(resources) {
-        var opList = new OperatorList();
-        opList.addOp('beginAnnotation', [data.rect, transform, matrix]);
-        evaluator.getOperatorList(this.appearance, resources, opList);
-        opList.addOp('endAnnotation', []);
-        promise.resolve(opList);
-      }.bind(this));
-
-      return promise;
-    }
-  };
-
-  Annotation.getConstructor =
-      function Annotation_getConstructor(subtype, fieldType) {
-
-    if (!subtype) {
-      return;
-    }
-
-    // TODO(mack): Implement FreeText annotations
-    if (subtype === 'Link') {
-      return LinkAnnotation;
-    } else if (subtype === 'Text') {
-      return TextAnnotation;
-    } else if (subtype === 'Widget') {
-      if (!fieldType) {
-        return;
-      }
-
-      if (fieldType === 'Tx') {
-        return TextWidgetAnnotation;
-      } else {
-        return WidgetAnnotation;
-      }
-    } else {
-      return Annotation;
-    }
-  };
-
-  // TODO(mack): Support loading annotation from data
-  Annotation.fromData = function Annotation_fromData(data) {
-    var subtype = data.subtype;
-    var fieldType = data.fieldType;
-    var Constructor = Annotation.getConstructor(subtype, fieldType);
-    if (Constructor) {
-      return new Constructor({ data: data });
-    }
-  };
-
-  Annotation.fromRef = function Annotation_fromRef(xref, ref) {
-
-    var dict = xref.fetchIfRef(ref);
-    if (!isDict(dict)) {
-      return;
-    }
-
-    var subtype = dict.get('Subtype');
-    subtype = isName(subtype) ? subtype.name : '';
-    if (!subtype) {
-      return;
-    }
-
-    var fieldType = Util.getInheritableProperty(dict, 'FT');
-    fieldType = isName(fieldType) ? fieldType.name : '';
-
-    var Constructor = Annotation.getConstructor(subtype, fieldType);
-    if (!Constructor) {
-      return;
-    }
-
-    var params = {
-      dict: dict,
-      ref: ref,
-    };
-
-    var annotation = new Constructor(params);
-
-    if (annotation.isViewable()) {
-      return annotation;
-    } else {
-      TODO('unimplemented annotation type: ' + subtype);
-    }
-  };
-
-  Annotation.appendToOperatorList = function Annotation_appendToOperatorList(
-      annotations, opList, pdfManager, partialEvaluator) {
-
-    function reject(e) {
-      annotationsReadyPromise.reject(e);
-    }
-
-    var annotationsReadyPromise = new Promise();
-
-    var annotationPromises = [];
-    for (var i = 0, n = annotations.length; i < n; ++i) {
-      annotationPromises.push(annotations[i].getOperatorList(partialEvaluator));
-    }
-    Promise.all(annotationPromises).then(function(datas) {
-      opList.addOp('beginAnnotations', []);
-      for (var i = 0, n = datas.length; i < n; ++i) {
-        var annotOpList = datas[i];
-        opList.addOpList(annotOpList);
-      }
-      opList.addOp('endAnnotations', []);
-      annotationsReadyPromise.resolve();
-    }, reject);
-
-    return annotationsReadyPromise;
-  };
-
-  return Annotation;
-})();
-PDFJS.Annotation = Annotation;
-
-
-var WidgetAnnotation = (function WidgetAnnotationClosure() {
-
-  function WidgetAnnotation(params) {
-    Annotation.call(this, params);
-
-    if (params.data) {
-      return;
-    }
-
-    var dict = params.dict;
-    var data = this.data;
-
-    data.fieldValue = stringToPDFString(
-      Util.getInheritableProperty(dict, 'V') || '');
-    data.alternativeText = stringToPDFString(dict.get('TU') || '');
-    data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';
-    var fieldType = Util.getInheritableProperty(dict, 'FT');
-    data.fieldType = isName(fieldType) ? fieldType.name : '';
-    data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;
-    this.fieldResources = Util.getInheritableProperty(dict, 'DR') || new Dict();
-
-    // Building the full field name by collecting the field and
-    // its ancestors 'T' data and joining them using '.'.
-    var fieldName = [];
-    var namedItem = dict;
-    var ref = params.ref;
-    while (namedItem) {
-      var parent = namedItem.get('Parent');
-      var parentRef = namedItem.getRaw('Parent');
-      var name = namedItem.get('T');
-      if (name) {
-        fieldName.unshift(stringToPDFString(name));
-      } else {
-        // The field name is absent, that means more than one field
-        // with the same name may exist. Replacing the empty name
-        // with the '`' plus index in the parent's 'Kids' array.
-        // This is not in the PDF spec but necessary to id the
-        // the input controls.
-        var kids = parent.get('Kids');
-        var j, jj;
-        for (j = 0, jj = kids.length; j < jj; j++) {
-          var kidRef = kids[j];
-          if (kidRef.num == ref.num && kidRef.gen == ref.gen)
-            break;
-        }
-        fieldName.unshift('`' + j);
-      }
-      namedItem = parent;
-      ref = parentRef;
-    }
-    data.fullName = fieldName.join('.');
-  }
-
-  var parent = Annotation.prototype;
-  Util.inherit(WidgetAnnotation, Annotation, {
-    isViewable: function WidgetAnnotation_isViewable() {
-      if (this.data.fieldType === 'Sig') {
-        TODO('unimplemented annotation type: Widget signature');
-        return false;
-      }
-
-      return parent.isViewable.call(this);
-    }
-  });
-
-  return WidgetAnnotation;
-})();
-
-var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
-  function TextWidgetAnnotation(params) {
-    WidgetAnnotation.call(this, params);
-
-    if (params.data) {
-      return;
-    }
-
-    this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');
-  }
-
-  // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont()
-  function setTextStyles(element, item, fontObj) {
-
-    var style = element.style;
-    style.fontSize = item.fontSize + 'px';
-    style.direction = item.fontDirection < 0 ? 'rtl': 'ltr';
-
-    if (!fontObj) {
-      return;
-    }
-
-    style.fontWeight = fontObj.black ?
-                            (fontObj.bold ? 'bolder' : 'bold') :
-                            (fontObj.bold ? 'bold' : 'normal');
-    style.fontStyle = fontObj.italic ? 'italic' : 'normal';
-
-    var fontName = fontObj.loadedName;
-    var fontFamily = fontName ? '"' + fontName + '", ' : '';
-    // Use a reasonable default font if the font doesn't specify a fallback
-    var fallbackName = fontObj.fallbackName || 'Helvetica, sans-serif';
-    style.fontFamily = fontFamily + fallbackName;
-  }
-
-
-  var parent = WidgetAnnotation.prototype;
-  Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
-    hasHtml: function TextWidgetAnnotation_hasHtml() {
-      return !!this.data.fieldValue;
-    },
-
-    getHtmlElement: function TextWidgetAnnotation_getHtmlElement(commonObjs) {
-      assert(!isWorker, 'getHtmlElement() shall be called from main thread');
-
-      var item = this.data;
-
-      var element = this.getEmptyContainer('div');
-      element.style.display = 'table';
-
-      var content = document.createElement('div');
-      content.textContent = item.fieldValue;
-      var textAlignment = item.textAlignment;
-      content.style.textAlign = ['left', 'center', 'right'][textAlignment];
-      content.style.verticalAlign = 'middle';
-      content.style.display = 'table-cell';
-
-      var fontObj = item.fontRefName ?
-                    commonObjs.getData(item.fontRefName) : null;
-      var cssRules = setTextStyles(content, item, fontObj);
-
-      element.appendChild(content);
-
-      return element;
-    },
-
-    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator) {
-
-      var promise = new Promise();
-      var opList = new OperatorList();
-      var data = this.data;
-
-      // Even if there is an appearance stream, ignore it. This is the
-      // behaviour used by Adobe Reader.
-
-      var defaultAppearance = data.defaultAppearance;
-      if (!defaultAppearance) {
-        promise.resolve(opList);
-        return promise;
-      }
-
-      // Include any font resources found in the default appearance
-
-      var stream = new Stream(stringToBytes(defaultAppearance));
-      evaluator.getOperatorList(stream, this.fieldResources, opList);
-      var appearanceFnArray = opList.fnArray;
-      var appearanceArgsArray = opList.argsArray;
-      var fnArray = [];
-      var argsArray = [];
-
-      // TODO(mack): Add support for stroke color
-      data.rgb = [0, 0, 0];
-      // TODO THIS DOESN'T MAKE ANY SENSE SINCE THE fnArray IS EMPTY!
-      for (var i = 0, n = fnArray.length; i < n; ++i) {
-        var fnName = appearanceFnArray[i];
-        var args = appearanceArgsArray[i];
-
-        if (fnName === 'setFont') {
-          data.fontRefName = args[0];
-          var size = args[1];
-          if (size < 0) {
-            data.fontDirection = -1;
-            data.fontSize = -size;
-          } else {
-            data.fontDirection = 1;
-            data.fontSize = size;
-          }
-        } else if (fnName === 'setFillRGBColor') {
-          data.rgb = args;
-        } else if (fnName === 'setFillGray') {
-          var rgbValue = args[0] * 255;
-          data.rgb = [rgbValue, rgbValue, rgbValue];
-        }
-      }
-      promise.resolve(opList);
-      return promise;
-    }
-  });
-
-  return TextWidgetAnnotation;
-})();
-
-var TextAnnotation = (function TextAnnotationClosure() {
-  function TextAnnotation(params) {
-    Annotation.call(this, params);
-
-    if (params.data) {
-      return;
-    }
-
-    var dict = params.dict;
-    var data = this.data;
-
-    var content = dict.get('Contents');
-    var title = dict.get('T');
-    data.content = stringToPDFString(content || '');
-    data.title = stringToPDFString(title || '');
-    data.name = !dict.has('Name') ? 'Note' : dict.get('Name').name;
-  }
-
-  var ANNOT_MIN_SIZE = 10;
-
-  Util.inherit(TextAnnotation, Annotation, {
-
-    getOperatorList: function TextAnnotation_getOperatorList(evaluator) {
-      var promise = new Promise();
-      promise.resolve(new OperatorList());
-      return promise;
-    },
-
-    hasHtml: function TextAnnotation_hasHtml() {
-      return true;
-    },
-
-    getHtmlElement: function TextAnnotation_getHtmlElement(commonObjs) {
-      assert(!isWorker, 'getHtmlElement() shall be called from main thread');
-
-      var item = this.data;
-      var rect = item.rect;
-
-      // sanity check because of OOo-generated PDFs
-      if ((rect[3] - rect[1]) < ANNOT_MIN_SIZE) {
-        rect[3] = rect[1] + ANNOT_MIN_SIZE;
-      }
-      if ((rect[2] - rect[0]) < ANNOT_MIN_SIZE) {
-        rect[2] = rect[0] + (rect[3] - rect[1]); // make it square
-      }
-
-      var container = this.getEmptyContainer('section', rect);
-      container.className = 'annotText';
-
-      var image = document.createElement('img');
-      image.style.width = container.style.width;
-      image.style.height = container.style.height;
-      var iconName = item.name;
-      image.src = PDFJS.imageResourcesPath + 'annotation-' +
-        iconName.toLowerCase() + '.svg';
-      image.alt = '[{{type}} Annotation]';
-      image.dataset.l10nId = 'text_annotation_type';
-      image.dataset.l10nArgs = JSON.stringify({type: iconName});
-      var content = document.createElement('div');
-      content.setAttribute('hidden', true);
-      var title = document.createElement('h1');
-      var text = document.createElement('p');
-      content.style.left = Math.floor(rect[2] - rect[0]) + 'px';
-      content.style.top = '0px';
-      title.textContent = item.title;
-
-      if (!item.content && !item.title) {
-        content.setAttribute('hidden', true);
-      } else {
-        var e = document.createElement('span');
-        var lines = item.content.split(/(?:\r\n?|\n)/);
-        for (var i = 0, ii = lines.length; i < ii; ++i) {
-          var line = lines[i];
-          e.appendChild(document.createTextNode(line));
-          if (i < (ii - 1))
-            e.appendChild(document.createElement('br'));
-        }
-        text.appendChild(e);
-        image.addEventListener('mouseover', function annotationImageOver() {
-          container.style.zIndex += 1;
-          content.removeAttribute('hidden');
-        }, false);
-
-        image.addEventListener('mouseout', function annotationImageOut() {
-          container.style.zIndex -= 1;
-          content.setAttribute('hidden', true);
-        }, false);
-      }
-
-      content.appendChild(title);
-      content.appendChild(text);
-      container.appendChild(image);
-      container.appendChild(content);
-
-      return container;
-    }
-  });
-
-  return TextAnnotation;
-})();
-
-var LinkAnnotation = (function LinkAnnotationClosure() {
-  function LinkAnnotation(params) {
-    Annotation.call(this, params);
-
-    if (params.data) {
-      return;
-    }
-
-    var dict = params.dict;
-    var data = this.data;
-
-    var action = dict.get('A');
-    if (action) {
-      var linkType = action.get('S').name;
-      if (linkType === 'URI') {
-        var url = action.get('URI');
-        // TODO: pdf spec mentions urls can be relative to a Base
-        // entry in the dictionary.
-        if (!isValidUrl(url, false)) {
-          url = '';
-        }
-        data.url = url;
-      } else if (linkType === 'GoTo') {
-        data.dest = action.get('D');
-      } else if (linkType === 'GoToR') {
-        var urlDict = action.get('F');
-        if (isDict(urlDict)) {
-          // We assume that the 'url' is a Filspec dictionary
-          // and fetch the url without checking any further
-          url = urlDict.get('F') || '';
-        }
-
-        // TODO: pdf reference says that GoToR
-        // can also have 'NewWindow' attribute
-        if (!isValidUrl(url, false)) {
-          url = '';
-        }
-        data.url = url;
-        data.dest = action.get('D');
-      } else {
-        TODO('unrecognized link type: ' + linkType);
-      }
-    } else if (dict.has('Dest')) {
-      // simple destination link
-      var dest = dict.get('Dest');
-      data.dest = isName(dest) ? dest.name : dest;
-    }
-  }
-
-  Util.inherit(LinkAnnotation, Annotation, {
-    hasOperatorList: function LinkAnnotation_hasOperatorList() {
-      return false;
-    },
-
-    hasHtml: function LinkAnnotation_hasHtml() {
-      return true;
-    },
-
-    getHtmlElement: function LinkAnnotation_getHtmlElement(commonObjs) {
-      var rect = this.data.rect;
-      var element = document.createElement('a');
-      var borderWidth = this.data.borderWidth;
-
-      element.style.borderWidth = borderWidth + 'px';
-      var color = this.data.color;
-      var rgb = [];
-      for (var i = 0; i < 3; ++i) {
-        rgb[i] = Math.round(color[i] * 255);
-      }
-      element.style.borderColor = Util.makeCssRgb(rgb);
-      element.style.borderStyle = 'solid';
-
-      var width = rect[2] - rect[0] - 2 * borderWidth;
-      var height = rect[3] - rect[1] - 2 * borderWidth;
-      element.style.width = width + 'px';
-      element.style.height = height + 'px';
-
-      element.href = this.data.url || '';
-      return element;
-    }
-  });
-
-  return LinkAnnotation;
-})();
-
-
-var PDFFunction = (function PDFFunctionClosure() {
-  var CONSTRUCT_SAMPLED = 0;
-  var CONSTRUCT_INTERPOLATED = 2;
-  var CONSTRUCT_STICHED = 3;
-  var CONSTRUCT_POSTSCRIPT = 4;
-
-  return {
-    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
-                                                       str) {
-      var length = 1;
-      for (var i = 0, ii = size.length; i < ii; i++)
-        length *= size[i];
-      length *= outputSize;
-
-      var array = [];
-      var codeSize = 0;
-      var codeBuf = 0;
-      // 32 is a valid bps so shifting won't work
-      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
-
-      var strBytes = str.getBytes((length * bps + 7) / 8);
-      var strIdx = 0;
-      for (var i = 0; i < length; i++) {
-        while (codeSize < bps) {
-          codeBuf <<= 8;
-          codeBuf |= strBytes[strIdx++];
-          codeSize += 8;
-        }
-        codeSize -= bps;
-        array.push((codeBuf >> codeSize) * sampleMul);
-        codeBuf &= (1 << codeSize) - 1;
-      }
-      return array;
-    },
-
-    getIR: function PDFFunction_getIR(xref, fn) {
-      var dict = fn.dict;
-      if (!dict)
-        dict = fn;
-
-      var types = [this.constructSampled,
-                   null,
-                   this.constructInterpolated,
-                   this.constructStiched,
-                   this.constructPostScript];
-
-      var typeNum = dict.get('FunctionType');
-      var typeFn = types[typeNum];
-      if (!typeFn)
-        error('Unknown type of function');
-
-      return typeFn.call(this, fn, dict, xref);
-    },
-
-    fromIR: function PDFFunction_fromIR(IR) {
-      var type = IR[0];
-      switch (type) {
-        case CONSTRUCT_SAMPLED:
-          return this.constructSampledFromIR(IR);
-        case CONSTRUCT_INTERPOLATED:
-          return this.constructInterpolatedFromIR(IR);
-        case CONSTRUCT_STICHED:
-          return this.constructStichedFromIR(IR);
-        //case CONSTRUCT_POSTSCRIPT:
-        default:
-          return this.constructPostScriptFromIR(IR);
-      }
-    },
-
-    parse: function PDFFunction_parse(xref, fn) {
-      var IR = this.getIR(xref, fn);
-      return this.fromIR(IR);
-    },
-
-    constructSampled: function PDFFunction_constructSampled(str, dict) {
-      function toMultiArray(arr) {
-        var inputLength = arr.length;
-        var outputLength = arr.length / 2;
-        var out = [];
-        var index = 0;
-        for (var i = 0; i < inputLength; i += 2) {
-          out[index] = [arr[i], arr[i + 1]];
-          ++index;
-        }
-        return out;
-      }
-      var domain = dict.get('Domain');
-      var range = dict.get('Range');
-
-      if (!domain || !range)
-        error('No domain or range');
-
-      var inputSize = domain.length / 2;
-      var outputSize = range.length / 2;
-
-      domain = toMultiArray(domain);
-      range = toMultiArray(range);
-
-      var size = dict.get('Size');
-      var bps = dict.get('BitsPerSample');
-      var order = dict.get('Order') || 1;
-      if (order !== 1) {
-        // No description how cubic spline interpolation works in PDF32000:2008
-        // As in poppler, ignoring order, linear interpolation may work as good
-        TODO('No support for cubic spline interpolation: ' + order);
-      }
-
-      var encode = dict.get('Encode');
-      if (!encode) {
-        encode = [];
-        for (var i = 0; i < inputSize; ++i) {
-          encode.push(0);
-          encode.push(size[i] - 1);
-        }
-      }
-      encode = toMultiArray(encode);
-
-      var decode = dict.get('Decode');
-      if (!decode)
-        decode = range;
-      else
-        decode = toMultiArray(decode);
-
-      var samples = this.getSampleArray(size, outputSize, bps, str);
-
-      return [
-        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
-        outputSize, Math.pow(2, bps) - 1, range
-      ];
-    },
-
-    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
-      // See chapter 3, page 109 of the PDF reference
-      function interpolate(x, xmin, xmax, ymin, ymax) {
-        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
-      }
-
-      return function constructSampledFromIRResult(args) {
-        // See chapter 3, page 110 of the PDF reference.
-        var m = IR[1];
-        var domain = IR[2];
-        var encode = IR[3];
-        var decode = IR[4];
-        var samples = IR[5];
-        var size = IR[6];
-        var n = IR[7];
-        var mask = IR[8];
-        var range = IR[9];
-
-        if (m != args.length)
-          error('Incorrect number of arguments: ' + m + ' != ' +
-                args.length);
-
-        var x = args;
-
-        // Building the cube vertices: its part and sample index
-        // http://rjwagner49.com/Mathematics/Interpolation.pdf
-        var cubeVertices = 1 << m;
-        var cubeN = new Float64Array(cubeVertices);
-        var cubeVertex = new Uint32Array(cubeVertices);
-        for (var j = 0; j < cubeVertices; j++)
-          cubeN[j] = 1;
-
-        var k = n, pos = 1;
-        // Map x_i to y_j for 0 <= i < m using the sampled function.
-        for (var i = 0; i < m; ++i) {
-          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
-          var domain_2i = domain[i][0];
-          var domain_2i_1 = domain[i][1];
-          var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
-
-          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
-          //                   Encode_2i, Encode_2i+1)
-          var e = interpolate(xi, domain_2i, domain_2i_1,
-                              encode[i][0], encode[i][1]);
-
-          // e_i' = min(max(e_i, 0), Size_i - 1)
-          var size_i = size[i];
-          e = Math.min(Math.max(e, 0), size_i - 1);
-
-          // Adjusting the cube: N and vertex sample index
-          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
-          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
-          var n1 = e - e0; // (e - e0) / (e1 - e0);
-          var offset0 = e0 * k;
-          var offset1 = offset0 + k; // e1 * k
-          for (var j = 0; j < cubeVertices; j++) {
-            if (j & pos) {
-              cubeN[j] *= n1;
-              cubeVertex[j] += offset1;
-            } else {
-              cubeN[j] *= n0;
-              cubeVertex[j] += offset0;
-            }
-          }
-
-          k *= size_i;
-          pos <<= 1;
-        }
-
-        var y = new Float64Array(n);
-        for (var j = 0; j < n; ++j) {
-          // Sum all cube vertices' samples portions
-          var rj = 0;
-          for (var i = 0; i < cubeVertices; i++)
-            rj += samples[cubeVertex[i] + j] * cubeN[i];
-
-          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
-          //                    Decode_2j, Decode_2j+1)
-          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
-
-          // y_j = min(max(r_j, range_2j), range_2j+1)
-          y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
-        }
-
-        return y;
-      };
-    },
-
-    constructInterpolated: function PDFFunction_constructInterpolated(str,
-                                                                      dict) {
-      var c0 = dict.get('C0') || [0];
-      var c1 = dict.get('C1') || [1];
-      var n = dict.get('N');
-
-      if (!isArray(c0) || !isArray(c1))
-        error('Illegal dictionary for interpolated function');
-
-      var length = c0.length;
-      var diff = [];
-      for (var i = 0; i < length; ++i)
-        diff.push(c1[i] - c0[i]);
-
-      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
-    },
-
-    constructInterpolatedFromIR:
-      function PDFFunction_constructInterpolatedFromIR(IR) {
-      var c0 = IR[1];
-      var diff = IR[2];
-      var n = IR[3];
-
-      var length = diff.length;
-
-      return function constructInterpolatedFromIRResult(args) {
-        var x = n == 1 ? args[0] : Math.pow(args[0], n);
-
-        var out = [];
-        for (var j = 0; j < length; ++j)
-          out.push(c0[j] + (x * diff[j]));
-
-        return out;
-
-      };
-    },
-
-    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
-      var domain = dict.get('Domain');
-
-      if (!domain)
-        error('No domain');
-
-      var inputSize = domain.length / 2;
-      if (inputSize != 1)
-        error('Bad domain for stiched function');
-
-      var fnRefs = dict.get('Functions');
-      var fns = [];
-      for (var i = 0, ii = fnRefs.length; i < ii; ++i)
-        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
-
-      var bounds = dict.get('Bounds');
-      var encode = dict.get('Encode');
-
-      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
-    },
-
-    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
-      var domain = IR[1];
-      var bounds = IR[2];
-      var encode = IR[3];
-      var fnsIR = IR[4];
-      var fns = [];
-
-      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
-        fns.push(PDFFunction.fromIR(fnsIR[i]));
-      }
-
-      return function constructStichedFromIRResult(args) {
-        var clip = function constructStichedFromIRClip(v, min, max) {
-          if (v > max)
-            v = max;
-          else if (v < min)
-            v = min;
-          return v;
-        };
-
-        // clip to domain
-        var v = clip(args[0], domain[0], domain[1]);
-        // calulate which bound the value is in
-        for (var i = 0, ii = bounds.length; i < ii; ++i) {
-          if (v < bounds[i])
-            break;
-        }
-
-        // encode value into domain of function
-        var dmin = domain[0];
-        if (i > 0)
-          dmin = bounds[i - 1];
-        var dmax = domain[1];
-        if (i < bounds.length)
-          dmax = bounds[i];
-
-        var rmin = encode[2 * i];
-        var rmax = encode[2 * i + 1];
-
-        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
-
-        // call the appropropriate function
-        return fns[i]([v2]);
-      };
-    },
-
-    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
-                                                                  xref) {
-      var domain = dict.get('Domain');
-      var range = dict.get('Range');
-
-      if (!domain)
-        error('No domain.');
-
-      if (!range)
-        error('No range.');
-
-      var lexer = new PostScriptLexer(fn);
-      var parser = new PostScriptParser(lexer);
-      var code = parser.parse();
-
-      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
-    },
-
-    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
-                                          IR) {
-      var domain = IR[1];
-      var range = IR[2];
-      var code = IR[3];
-      var numOutputs = range.length / 2;
-      var evaluator = new PostScriptEvaluator(code);
-      // Cache the values for a big speed up, the cache size is limited though
-      // since the number of possible values can be huge from a PS function.
-      var cache = new FunctionCache();
-      return function constructPostScriptFromIRResult(args) {
-        var initialStack = [];
-        for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
-          initialStack.push(args[i]);
-        }
-
-        var key = initialStack.join('_');
-        if (cache.has(key))
-          return cache.get(key);
-
-        var stack = evaluator.execute(initialStack);
-        var transformed = [];
-        for (i = numOutputs - 1; i >= 0; --i) {
-          var out = stack.pop();
-          var rangeIndex = 2 * i;
-          if (out < range[rangeIndex])
-            out = range[rangeIndex];
-          else if (out > range[rangeIndex + 1])
-            out = range[rangeIndex + 1];
-          transformed[i] = out;
-        }
-        cache.set(key, transformed);
-        return transformed;
-      };
-    }
-  };
-})();
-
-var FunctionCache = (function FunctionCacheClosure() {
-  // Of 10 PDF's with type4 functions the maxium number of distinct values seen
-  // was 256. This still may need some tweaking in the future though.
-  var MAX_CACHE_SIZE = 1024;
-  function FunctionCache() {
-    this.cache = {};
-    this.total = 0;
-  }
-  FunctionCache.prototype = {
-    has: function FunctionCache_has(key) {
-      return key in this.cache;
-    },
-    get: function FunctionCache_get(key) {
-      return this.cache[key];
-    },
-    set: function FunctionCache_set(key, value) {
-      if (this.total < MAX_CACHE_SIZE) {
-        this.cache[key] = value;
-        this.total++;
-      }
-    }
-  };
-  return FunctionCache;
-})();
-
-var PostScriptStack = (function PostScriptStackClosure() {
-  var MAX_STACK_SIZE = 100;
-  function PostScriptStack(initialStack) {
-    this.stack = initialStack || [];
-  }
-
-  PostScriptStack.prototype = {
-    push: function PostScriptStack_push(value) {
-      if (this.stack.length >= MAX_STACK_SIZE)
-        error('PostScript function stack overflow.');
-      this.stack.push(value);
-    },
-    pop: function PostScriptStack_pop() {
-      if (this.stack.length <= 0)
-        error('PostScript function stack underflow.');
-      return this.stack.pop();
-    },
-    copy: function PostScriptStack_copy(n) {
-      if (this.stack.length + n >= MAX_STACK_SIZE)
-        error('PostScript function stack overflow.');
-      var stack = this.stack;
-      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
-        stack.push(stack[i]);
-    },
-    index: function PostScriptStack_index(n) {
-      this.push(this.stack[this.stack.length - n - 1]);
-    },
-    // rotate the last n stack elements p times
-    roll: function PostScriptStack_roll(n, p) {
-      var stack = this.stack;
-      var l = stack.length - n;
-      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
-      for (i = l, j = r; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-      for (i = l, j = c - 1; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-      for (i = c, j = r; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-    }
-  };
-  return PostScriptStack;
-})();
-var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
-  function PostScriptEvaluator(operators, operands) {
-    this.operators = operators;
-    this.operands = operands;
-  }
-  PostScriptEvaluator.prototype = {
-    execute: function PostScriptEvaluator_execute(initialStack) {
-      var stack = new PostScriptStack(initialStack);
-      var counter = 0;
-      var operators = this.operators;
-      var length = operators.length;
-      var operator, a, b;
-      while (counter < length) {
-        operator = operators[counter++];
-        if (typeof operator == 'number') {
-          // Operator is really an operand and should be pushed to the stack.
-          stack.push(operator);
-          continue;
-        }
-        switch (operator) {
-          // non standard ps operators
-          case 'jz': // jump if false
-            b = stack.pop();
-            a = stack.pop();
-            if (!a)
-              counter = b;
-            break;
-          case 'j': // jump
-            a = stack.pop();
-            counter = a;
-            break;
-
-          // all ps operators in alphabetical order (excluding if/ifelse)
-          case 'abs':
-            a = stack.pop();
-            stack.push(Math.abs(a));
-            break;
-          case 'add':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a + b);
-            break;
-          case 'and':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a && b);
-            else
-              stack.push(a & b);
-            break;
-          case 'atan':
-            a = stack.pop();
-            stack.push(Math.atan(a));
-            break;
-          case 'bitshift':
-            b = stack.pop();
-            a = stack.pop();
-            if (a > 0)
-              stack.push(a << b);
-            else
-              stack.push(a >> b);
-            break;
-          case 'ceiling':
-            a = stack.pop();
-            stack.push(Math.ceil(a));
-            break;
-          case 'copy':
-            a = stack.pop();
-            stack.copy(a);
-            break;
-          case 'cos':
-            a = stack.pop();
-            stack.push(Math.cos(a));
-            break;
-          case 'cvi':
-            a = stack.pop() | 0;
-            stack.push(a);
-            break;
-          case 'cvr':
-            // noop
-            break;
-          case 'div':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b);
-            break;
-          case 'dup':
-            stack.copy(1);
-            break;
-          case 'eq':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a == b);
-            break;
-          case 'exch':
-            stack.roll(2, 1);
-            break;
-          case 'exp':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(Math.pow(a, b));
-            break;
-          case 'false':
-            stack.push(false);
-            break;
-          case 'floor':
-            a = stack.pop();
-            stack.push(Math.floor(a));
-            break;
-          case 'ge':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a >= b);
-            break;
-          case 'gt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a > b);
-            break;
-          case 'idiv':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push((a / b) | 0);
-            break;
-          case 'index':
-            a = stack.pop();
-            stack.index(a);
-            break;
-          case 'le':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a <= b);
-            break;
-          case 'ln':
-            a = stack.pop();
-            stack.push(Math.log(a));
-            break;
-          case 'log':
-            a = stack.pop();
-            stack.push(Math.log(a) / Math.LN10);
-            break;
-          case 'lt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a < b);
-            break;
-          case 'mod':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a % b);
-            break;
-          case 'mul':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a * b);
-            break;
-          case 'ne':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a != b);
-            break;
-          case 'neg':
-            a = stack.pop();
-            stack.push(-b);
-            break;
-          case 'not':
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a && b);
-            else
-              stack.push(a & b);
-            break;
-          case 'or':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a || b);
-            else
-              stack.push(a | b);
-            break;
-          case 'pop':
-            stack.pop();
-            break;
-          case 'roll':
-            b = stack.pop();
-            a = stack.pop();
-            stack.roll(a, b);
-            break;
-          case 'round':
-            a = stack.pop();
-            stack.push(Math.round(a));
-            break;
-          case 'sin':
-            a = stack.pop();
-            stack.push(Math.sin(a));
-            break;
-          case 'sqrt':
-            a = stack.pop();
-            stack.push(Math.sqrt(a));
-            break;
-          case 'sub':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a - b);
-            break;
-          case 'true':
-            stack.push(true);
-            break;
-          case 'truncate':
-            a = stack.pop();
-            a = a < 0 ? Math.ceil(a) : Math.floor(a);
-            stack.push(a);
-            break;
-          case 'xor':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a != b);
-            else
-              stack.push(a ^ b);
-            break;
-          default:
-            error('Unknown operator ' + operator);
-            break;
-        }
-      }
-      return stack.stack;
-    }
-  };
-  return PostScriptEvaluator;
-})();
-
-var PostScriptParser = (function PostScriptParserClosure() {
-  function PostScriptParser(lexer) {
-    this.lexer = lexer;
-    this.operators = [];
-    this.token = null;
-    this.prev = null;
-  }
-  PostScriptParser.prototype = {
-    nextToken: function PostScriptParser_nextToken() {
-      this.prev = this.token;
-      this.token = this.lexer.getToken();
-    },
-    accept: function PostScriptParser_accept(type) {
-      if (this.token.type == type) {
-        this.nextToken();
-        return true;
-      }
-      return false;
-    },
-    expect: function PostScriptParser_expect(type) {
-      if (this.accept(type))
-        return true;
-      error('Unexpected symbol: found ' + this.token.type + ' expected ' +
-            type + '.');
-    },
-    parse: function PostScriptParser_parse() {
-      this.nextToken();
-      this.expect(PostScriptTokenTypes.LBRACE);
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      return this.operators;
-    },
-    parseBlock: function PostScriptParser_parseBlock() {
-      while (true) {
-        if (this.accept(PostScriptTokenTypes.NUMBER)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-          this.parseCondition();
-        } else {
-          return;
-        }
-      }
-    },
-    parseCondition: function PostScriptParser_parseCondition() {
-      // Add two place holders that will be updated later
-      var conditionLocation = this.operators.length;
-      this.operators.push(null, null);
-
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      if (this.accept(PostScriptTokenTypes.IF)) {
-        // The true block is right after the 'if' so it just falls through on
-        // true else it jumps and skips the true block.
-        this.operators[conditionLocation] = this.operators.length;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-        var jumpLocation = this.operators.length;
-        this.operators.push(null, null);
-        var endOfTrue = this.operators.length;
-        this.parseBlock();
-        this.expect(PostScriptTokenTypes.RBRACE);
-        this.expect(PostScriptTokenTypes.IFELSE);
-        // The jump is added at the end of the true block to skip the false
-        // block.
-        this.operators[jumpLocation] = this.operators.length;
-        this.operators[jumpLocation + 1] = 'j';
-
-        this.operators[conditionLocation] = endOfTrue;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else {
-        error('PS Function: error parsing conditional.');
-      }
-    }
-  };
-  return PostScriptParser;
-})();
-
-var PostScriptTokenTypes = {
-  LBRACE: 0,
-  RBRACE: 1,
-  NUMBER: 2,
-  OPERATOR: 3,
-  IF: 4,
-  IFELSE: 5
-};
-
-var PostScriptToken = (function PostScriptTokenClosure() {
-  function PostScriptToken(type, value) {
-    this.type = type;
-    this.value = value;
-  }
-
-  var opCache = {};
-
-  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
-    var opValue = opCache[op];
-    if (opValue)
-      return opValue;
-
-    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
-  };
-
-  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
-                                                '{');
-  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
-                                                '}');
-  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
-  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
-                                                'IFELSE');
-  return PostScriptToken;
-})();
-
-var PostScriptLexer = (function PostScriptLexerClosure() {
-  function PostScriptLexer(stream) {
-    this.stream = stream;
-    this.nextChar();
-  }
-  PostScriptLexer.prototype = {
-    nextChar: function PostScriptLexer_nextChar() {
-      return (this.currentChar = this.stream.getByte());
-    },
-    getToken: function PostScriptLexer_getToken() {
-      var s = '';
-      var comment = false;
-      var ch = this.currentChar;
-
-      // skip comments
-      while (true) {
-        if (ch < 0) {
-          return EOF;
-        }
-
-        if (comment) {
-          if (ch === 0x0A || ch === 0x0D) {
-            comment = false;
-          }
-        } else if (ch == 0x25) { // '%'
-          comment = true;
-        } else if (!Lexer.isSpace(ch)) {
-          break;
-        }
-        ch = this.nextChar();
-      }
-      switch (ch | 0) {
-        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
-        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
-        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
-          return new PostScriptToken(PostScriptTokenTypes.NUMBER,
-                                      this.getNumber());
-        case 0x7B: // '{'
-          this.nextChar();
-          return PostScriptToken.LBRACE;
-        case 0x7D: // '}'
-          this.nextChar();
-          return PostScriptToken.RBRACE;
-      }
-      // operator
-      var str = String.fromCharCode(ch);
-      while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z'
-             ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) {
-        str += String.fromCharCode(ch);
-      }
-      switch (str.toLowerCase()) {
-        case 'if':
-          return PostScriptToken.IF;
-        case 'ifelse':
-          return PostScriptToken.IFELSE;
-        default:
-          return PostScriptToken.getOperator(str);
-      }
-    },
-    getNumber: function PostScriptLexer_getNumber() {
-      var ch = this.currentChar;
-      var str = String.fromCharCode(ch);
-      while ((ch = this.nextChar()) >= 0) {
-        if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9'
-             ch === 0x2D || ch === 0x2E) { // '-', '.'
-          str += String.fromCharCode(ch);
-        } else {
-          break;
-        }
-      }
-      var value = parseFloat(str);
-      if (isNaN(value))
-        error('Invalid floating point number: ' + value);
-      return value;
+      error('Unkown action from worker: ' + data.action);
     }
   };
-  return PostScriptLexer;
-})();
-
-
-
-var ISOAdobeCharset = [
-  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
-  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
-  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
-  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
-  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
-  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
-  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
-  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
-  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
-  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
-  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
-  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
-  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
-  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
-  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
-  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
-  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
-  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
-  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
-  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
-  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
-  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
-  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
-  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
-  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
-  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
-  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
-  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
-  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
-  'ugrave', 'yacute', 'ydieresis', 'zcaron'
-];
-
-var ExpertCharset = [
-  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
-  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
-  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
-  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
-  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
-  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
-  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
-  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
-  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
-  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
-  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
-  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
-  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
-  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
-  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
-  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
-  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
-  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
-  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
-  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
-  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
-  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
-  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
-  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
-  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
-  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
-  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
-  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
-  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
-  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
-  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
-  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
-  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
-  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
-  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
-  'Ydieresissmall'
-];
-
-var ExpertSubsetCharset = [
-  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
-  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
-  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
-  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
-  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
-  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
-  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
-  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
-  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
-  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
-  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
-  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
-  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
-  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
-  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
-  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
-  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
-  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
-  'periodinferior', 'commainferior'
-];
-
-
-
-var CIDToUnicodeMaps = {
-  'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
-    {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
-    [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
-    0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
-    [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
-    [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
-    198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
-    174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
-    {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
-    {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
-    {f: 59, c: 33}, 165, {f: 31, c: 93}, 65512, {f: 2, c: 125}, 0,
-    {f: 63, c: 65377}, {s: 243}, [8195, 12288],
-    {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
-    {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
-    {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
-    65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
-    {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
-    [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
-    8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
-    {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
-    9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
-    8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
-    {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
-    8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
-    8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
-    {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
-    {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
-    {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
-    {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
-    21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
-    28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
-    22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
-    24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
-    20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
-    26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
-    [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
-    37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
-    39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
-    32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
-    [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
-    [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
-    28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
-    21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
-    29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
-    30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
-    22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
-    28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
-    40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
-    25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
-    [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
-    29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
-    19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
-    22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
-    [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
-    33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
-    38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
-    34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
-    22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
-    39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
-    38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
-    24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
-    39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
-    25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
-    [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
-    23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
-    28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
-    36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
-    33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
-    33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
-    24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
-    24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
-    27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
-    31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
-    35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
-    39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
-    32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
-    22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
-    26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
-    27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
-    36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
-    20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
-    31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
-    21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
-    33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
-    [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
-    31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
-    23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
-    28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
-    20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
-    23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
-    29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
-    39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
-    [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
-    [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
-    33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
-    20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
-    39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
-    20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
-    31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
-    34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
-    21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
-    24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
-    31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
-    35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
-    25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
-    [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
-    20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
-    25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
-    30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
-    36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
-    24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
-    35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
-    [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
-    31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
-    38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
-    23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
-    35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
-    20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
-    22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
-    24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
-    25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
-    28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
-    32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
-    [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
-    37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
-    21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
-    21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
-    33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
-    20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
-    26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
-    21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
-    35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
-    22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
-    29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
-    21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
-    32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
-    26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
-    21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
-    38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
-    20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
-    29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
-    27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
-    [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
-    24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
-    [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
-    32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
-    35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
-    20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
-    29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
-    [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
-    31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
-    24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
-    33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
-    29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
-    20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
-    23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
-    29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
-    21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
-    23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
-    32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
-    36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
-    24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
-    22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
-    36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
-    26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
-    37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
-    32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
-    24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
-    21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
-    [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
-    25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
-    27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
-    30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
-    33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
-    37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
-    20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
-    26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
-    22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
-    35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
-    23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
-    27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
-    [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
-    36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
-    29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
-    37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
-    28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
-    29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
-    26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
-    28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
-    25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
-    [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
-    35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
-    33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
-    31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
-    20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
-    32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
-    23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
-    26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
-    33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
-    37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
-    32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
-    29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
-    35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
-    21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
-    25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
-    29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
-    33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
-    38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
-    20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
-    20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
-    23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
-    21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
-    39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
-    25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
-    36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
-    38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
-    27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
-    21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
-    36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
-    22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
-    31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
-    24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
-    24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
-    39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
-    33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
-    27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
-    29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
-    24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
-    28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
-    36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
-    25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
-    26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
-    20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
-    22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
-    20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
-    24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
-    31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
-    [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
-    37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
-    22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
-    20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
-    22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
-    36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
-    24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
-    22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
-    26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
-    31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
-    35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
-    38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
-    31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
-    28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
-    20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
-    22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
-    37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
-    37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
-    [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
-    24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
-    22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
-    24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
-    22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
-    24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
-    32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
-    30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
-    26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
-    30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
-    31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
-    39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
-    24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
-    39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
-    38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
-    27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
-    31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
-    30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
-    25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
-    30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
-    [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
-    27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
-    [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
-    31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
-    27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
-    30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
-    25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
-    22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
-    26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
-    36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
-    33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
-    21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
-    25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
-    25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
-    19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
-    38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
-    21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
-    36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
-    37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
-    24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
-    21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
-    25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
-    33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
-    40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
-    {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
-    33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
-    [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
-    27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
-    30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
-    27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
-    [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
-    24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
-    23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
-    [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
-    40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
-    37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
-    [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
-    29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
-    [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
-    24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
-    37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
-    38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
-    21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
-    26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
-    36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
-    19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
-    25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
-    31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
-    38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
-    32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
-    37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
-    21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
-    [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
-    30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
-    [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
-    20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
-    31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
-    32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
-    40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
-    20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
-    38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
-    24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
-    21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
-    24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
-    [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
-    35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
-    20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
-    24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
-    20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
-    20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
-    20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
-    20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
-    20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
-    20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
-    20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
-    20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
-    20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
-    20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
-    20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
-    20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
-    31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
-    20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
-    {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
-    20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
-    [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
-    21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
-    21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
-    36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
-    21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
-    21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
-    21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
-    21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
-    [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
-    21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
-    21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
-    21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
-    21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
-    21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
-    {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
-    21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
-    21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
-    21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
-    21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
-    22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
-    22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
-    22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
-    22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
-    22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
-    22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
-    22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
-    {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
-    22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
-    22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
-    22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
-    {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
-    22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
-    22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
-    20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
-    23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
-    {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
-    23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
-    23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
-    {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
-    [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
-    23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
-    {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
-    [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
-    23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
-    23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
-    23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
-    23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
-    23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
-    23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
-    [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
-    {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
-    24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
-    [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
-    24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
-    24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
-    24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
-    24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
-    [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
-    24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
-    24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
-    24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
-    24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
-    24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
-    24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
-    24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
-    24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
-    {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
-    24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
-    24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
-    25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
-    25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
-    25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
-    25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
-    {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
-    25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
-    25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
-    25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
-    25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
-    25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
-    25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
-    25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
-    25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
-    25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
-    {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
-    25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
-    [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
-    25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
-    26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
-    [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
-    {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
-    26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
-    26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
-    26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
-    26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
-    26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
-    26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
-    26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
-    26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
-    26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
-    26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
-    26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
-    26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
-    26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
-    26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
-    26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
-    27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
-    27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
-    27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
-    27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
-    27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
-    27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
-    27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
-    27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
-    27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
-    27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
-    27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
-    [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
-    27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
-    27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
-    27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
-    27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
-    27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
-    27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
-    28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
-    28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
-    28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
-    28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
-    28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
-    28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
-    28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
-    28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
-    28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
-    28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
-    28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
-    28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
-    28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
-    28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
-    29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
-    29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
-    29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
-    29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
-    29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
-    29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
-    {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
-    29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
-    29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
-    29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
-    29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
-    29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
-    29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
-    29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
-    29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
-    30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
-    30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
-    30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
-    30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
-    30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
-    30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
-    {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
-    30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
-    30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
-    30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
-    {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
-    30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
-    30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
-    30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
-    30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
-    30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
-    30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
-    31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
-    31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
-    31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
-    31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
-    31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
-    31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
-    31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
-    31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
-    31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
-    31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
-    31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
-    31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
-    31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
-    31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
-    31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
-    31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
-    31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
-    31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
-    32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
-    32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
-    32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
-    32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
-    32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
-    32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
-    32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
-    32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
-    {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
-    {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
-    [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
-    32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
-    32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
-    {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
-    39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
-    32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
-    32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
-    32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
-    32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
-    33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
-    33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
-    33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
-    33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
-    33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
-    33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
-    33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
-    {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
-    33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
-    33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
-    33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
-    33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
-    33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
-    33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
-    33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
-    33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
-    33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
-    33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
-    34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
-    34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
-    34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
-    34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
-    34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
-    34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
-    34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
-    34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
-    34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
-    34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
-    34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
-    34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
-    34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
-    34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
-    34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
-    34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
-    34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
-    34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
-    35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
-    35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
-    35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
-    35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
-    35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
-    {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
-    35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
-    35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
-    35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
-    35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
-    35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
-    35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
-    35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
-    35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
-    [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
-    35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
-    {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
-    {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
-    40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
-    36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
-    {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
-    {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
-    36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
-    36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
-    36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
-    36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
-    36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
-    36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
-    36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
-    36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
-    36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
-    36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
-    36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
-    37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
-    37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
-    37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
-    37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
-    37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
-    37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
-    37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
-    37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
-    37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
-    37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
-    37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
-    37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
-    37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
-    38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
-    38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
-    38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
-    {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
-    38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
-    {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
-    38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
-    38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
-    38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
-    38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
-    38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
-    {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
-    [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
-    38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
-    39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
-    39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
-    39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
-    {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
-    39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
-    {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
-    39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
-    39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
-    39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
-    {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
-    39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
-    {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
-    39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
-    {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
-    39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
-    39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
-    39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
-    39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
-    40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
-    40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
-    {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
-    40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
-    40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
-    40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
-    {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
-    40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
-    40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
-    {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
-    40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
-    {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
-    40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
-    {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
-    13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
-    {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
-    13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
-    8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
-    0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
-    194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
-    0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
-    {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
-    64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
-    39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
-    28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
-    63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
-    {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
-    194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
-    {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
-    {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
-    {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
-    65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
-    9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
-    13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
-    13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
-    13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
-    {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
-    {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
-    12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
-    12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
-    12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
-    13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
-    8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
-    9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
-    9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
-    9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
-    9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
-    20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
-    8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
-    12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
-    37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
-    [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
-    20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
-    20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
-    21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
-    21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
-    64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
-    23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
-    23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
-    24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
-    24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
-    26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
-    26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
-    64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
-    27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
-    28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
-    28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
-    28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
-    29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
-    29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
-    30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
-    31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
-    31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
-    33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
-    64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
-    35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
-    64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
-    37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
-    37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
-    37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
-    37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
-    37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
-    38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
-    {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
-    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, 0, 92,
-    {s: 634}, 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275,
-    333, 256, 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
-    {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
-    467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
-    8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
-    331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
-    {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
-    {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
-    {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
-    12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
-    {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
-    0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
-    {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
-    13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
-    {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
-    {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
-    13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
-    {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
-    {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
-    {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
-    {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
-    {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
-    {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
-    9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
-    {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
-    8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
-    9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
-    {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
-    64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
-    64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
-    64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
-    64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
-    24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
-    64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
-    64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
-    37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
-    37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
-    11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
-    171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
-    11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
-    23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
-    29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
-    0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
-    {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
-    [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
-    131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
-    {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
-    [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
-    {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
-    194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
-    20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
-    13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
-    0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
-    63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
-    194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
-    23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
-    26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
-    {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
-    30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
-    11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
-    [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
-    34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
-    0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
-    {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
-    19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
-    20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
-    20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
-    20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
-    20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
-    20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
-    [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
-    {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
-    21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
-    21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
-    21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
-    22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
-    22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
-    22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
-    22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
-    22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
-    23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
-    23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
-    {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
-    23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
-    23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
-    24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
-    24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
-    [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
-    [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
-    24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
-    24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
-    25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
-    25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
-    25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
-    {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
-    25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
-    26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
-    26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
-    26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
-    26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
-    26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
-    27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
-    27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
-    27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
-    [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
-    27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
-    27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
-    28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
-    28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
-    28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
-    [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
-    28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
-    29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
-    29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
-    29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
-    29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
-    29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
-    29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
-    29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
-    29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
-    [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
-    30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
-    30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
-    {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
-    30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
-    30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
-    31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
-    31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
-    31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
-    31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
-    31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
-    31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
-    31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
-    32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
-    32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
-    32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
-    32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
-    32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
-    32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
-    33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
-    33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
-    33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
-    33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
-    34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
-    34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
-    34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
-    34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
-    [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
-    {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
-    35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
-    35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
-    35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
-    36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
-    36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
-    36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
-    36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
-    37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
-    37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
-    37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
-    {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
-    37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
-    37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
-    38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
-    38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
-    38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
-    38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
-    39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
-    39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
-    {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
-    39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
-    39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
-    40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
-    40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
-    40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
-    40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
-    40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
-    28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
-    20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
-    29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
-    0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
-    13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
-    {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
-    {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
-    {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
-    474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
-    351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
-    344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
-    369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
-    625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
-    626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
-    608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
-    673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
-    0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
-    820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
-    {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
-    704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
-    {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
-    {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
-    {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
-    9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
-    {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
-    {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
-    20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
-    20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
-    21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
-    22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
-    22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
-    23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
-    138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
-    24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
-    24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
-    25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
-    26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
-    26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
-    144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
-    27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
-    27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
-    27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
-    28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
-    28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
-    29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
-    29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
-    30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
-    30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
-    152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
-    31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
-    31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
-    31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
-    32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
-    {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
-    33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
-    33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
-    33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
-    34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
-    34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
-    34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
-    35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
-    36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
-    36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
-    {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
-    37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
-    37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
-    18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
-    38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
-    39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
-    39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
-    40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
-    40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
-    13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
-    20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
-    20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
-    20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
-    131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
-    131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
-    20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
-    21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
-    133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
-    133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
-    {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
-    21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
-    21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
-    13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
-    21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
-    135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
-    22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
-    22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
-    22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
-    22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
-    22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
-    136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
-    22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
-    {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
-    158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
-    22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
-    23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
-    23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
-    23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
-    {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
-    23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
-    138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
-    23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
-    23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
-    23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
-    24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
-    {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
-    24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
-    24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
-    24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
-    24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
-    141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
-    141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
-    142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
-    {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
-    25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
-    {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
-    25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
-    25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
-    25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
-    26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
-    143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
-    26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
-    144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
-    26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
-    26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
-    26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
-    26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
-    26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
-    {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
-    26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
-    27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
-    27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
-    27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
-    27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
-    145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
-    27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
-    {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
-    27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
-    27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
-    {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
-    {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
-    146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
-    28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
-    {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
-    28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
-    28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
-    15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
-    28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
-    28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
-    28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
-    29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
-    29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
-    29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
-    29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
-    29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
-    29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
-    29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
-    150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
-    29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
-    150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
-    {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
-    {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
-    30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
-    {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
-    151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
-    30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
-    151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
-    30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
-    30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
-    30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
-    30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
-    31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
-    16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
-    31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
-    31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
-    31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
-    31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
-    31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
-    31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
-    155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
-    155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
-    155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
-    32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
-    32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
-    32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
-    32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
-    {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
-    32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
-    32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
-    157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
-    17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
-    33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
-    157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
-    33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
-    158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
-    33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
-    33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
-    {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
-    33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
-    33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
-    17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
-    34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
-    {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
-    34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
-    34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
-    160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
-    {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
-    34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
-    34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
-    160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
-    34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
-    34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
-    34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
-    35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
-    35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
-    35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
-    35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
-    35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
-    162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
-    35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
-    36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
-    {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
-    36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
-    36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
-    64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
-    165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
-    37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
-    37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
-    {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
-    {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
-    37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
-    37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
-    {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
-    166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
-    37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
-    37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
-    37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
-    167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
-    167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
-    38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
-    38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
-    38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
-    169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
-    39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
-    {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
-    {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
-    39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
-    39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
-    39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
-    39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
-    39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
-    {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
-    39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
-    {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
-    171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
-    {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
-    40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
-    40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
-    40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
-    40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
-    40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
-    40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
-    40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
-    19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
-    20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
-    20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
-    {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
-    20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
-    {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
-    21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
-    21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
-    21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
-    21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
-    21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
-    21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
-    22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
-    22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
-    22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
-    22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
-    22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
-    22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
-    23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
-    23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
-    23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
-    24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
-    24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
-    24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
-    25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
-    25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
-    25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
-    {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
-    25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
-    25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
-    26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
-    26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
-    26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
-    27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
-    27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
-    27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
-    28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
-    {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
-    28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
-    29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
-    29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
-    29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
-    30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
-    30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
-    30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
-    30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
-    {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
-    30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
-    30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
-    31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
-    31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
-    31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
-    {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
-    32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
-    32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
-    32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
-    {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
-    33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
-    33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
-    33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
-    33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
-    33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
-    34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
-    34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
-    34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
-    34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
-    35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
-    35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
-    35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
-    35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
-    36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
-    36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
-    36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
-    36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
-    36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
-    36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
-    36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
-    37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
-    37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
-    {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
-    37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
-    37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
-    38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
-    38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
-    38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
-    38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
-    39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
-    39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
-    39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
-    39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
-    40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
-    40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
-    {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
-    151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
-    {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
-    {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
-    0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
-    15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
-    162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
-    63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
-    38315, 38741, 171581, 173594],
-  'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
-    {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
-    8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
-    {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
-    {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
-    8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
-    9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
-    {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
-    {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
-    {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
-    730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
-    9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
-    9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
-    9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
-    8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
-    13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
-    {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
-    {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
-    9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
-    9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
-    9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
-    9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
-    {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
-    {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
-    {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
-    13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
-    {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
-    8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
-    13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
-    198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
-    {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
-    {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
-    312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
-    {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
-    {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
-    1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
-    {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
-    {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
-    44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
-    44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
-    {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
-    {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
-    44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
-    44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
-    44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
-    {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
-    44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
-    {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
-    {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
-    {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
-    44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
-    44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
-    {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
-    44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
-    44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
-    {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
-    {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
-    {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
-    {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
-    {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
-    {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
-    {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
-    {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
-    45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
-    45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
-    45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
-    {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
-    {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
-    {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
-    {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
-    {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
-    {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
-    {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
-    45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
-    45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
-    45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
-    {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
-    45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
-    {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
-    {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
-    {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
-    45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
-    {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
-    {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
-    {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
-    {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
-    45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
-    {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
-    46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
-    {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
-    {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
-    46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
-    {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
-    46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
-    {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
-    {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
-    {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
-    {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
-    {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
-    46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
-    46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
-    {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
-    {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
-    46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
-    46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
-    {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
-    {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
-    {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
-    {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
-    47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
-    47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
-    {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
-    {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
-    47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
-    {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
-    {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
-    {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
-    47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
-    {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
-    {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
-    47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
-    47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
-    47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
-    47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
-    {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
-    47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
-    {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
-    47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
-    48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
-    {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
-    {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
-    {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
-    {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
-    48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
-    {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
-    48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
-    {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
-    48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
-    {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
-    {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
-    48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
-    48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
-    {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
-    {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
-    {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
-    {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
-    {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
-    {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
-    {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
-    49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
-    {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
-    49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
-    {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
-    {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
-    {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
-    {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
-    {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
-    {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
-    {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
-    49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
-    49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
-    49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
-    {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
-    {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
-    {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
-    49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
-    49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
-    49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
-    49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
-    {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
-    {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
-    50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
-    {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
-    {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
-    {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
-    50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
-    50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
-    {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
-    {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
-    {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
-    {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
-    {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
-    50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
-    {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
-    {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
-    {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
-    {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
-    {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
-    {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
-    {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
-    50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
-    {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
-    {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
-    {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
-    {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
-    50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
-    50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
-    51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
-    51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
-    {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
-    {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
-    {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
-    51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
-    {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
-    {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
-    {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
-    {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
-    51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
-    {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
-    {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
-    51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
-    51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
-    {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
-    51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
-    {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
-    {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
-    {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
-    {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
-    {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
-    {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
-    {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
-    52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
-    {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
-    {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
-    {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
-    52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
-    {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
-    {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
-    {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
-    52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
-    52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
-    52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
-    52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
-    52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
-    {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
-    52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
-    {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
-    {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
-    {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
-    53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
-    {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
-    {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
-    53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
-    53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
-    {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
-    {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
-    53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
-    {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
-    53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
-    {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
-    {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
-    53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
-    {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
-    53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
-    53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
-    {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
-    {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
-    53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
-    {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
-    {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
-    {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
-    54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
-    54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
-    {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
-    {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
-    54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
-    54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
-    54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
-    54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
-    {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
-    {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
-    {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
-    54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
-    54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
-    {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
-    54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
-    {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
-    54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
-    54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
-    {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
-    55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
-    {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
-    {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
-    55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
-    55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
-    {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
-    21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
-    29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
-    36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
-    29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
-    23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
-    30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
-    35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
-    34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
-    26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
-    {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
-    22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
-    30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
-    37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
-    24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
-    33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
-    21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
-    36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
-    24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
-    26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
-    24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
-    35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
-    [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
-    32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
-    20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
-    24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
-    28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
-    32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
-    38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
-    23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
-    31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
-    21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
-    25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
-    32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
-    35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
-    26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
-    26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
-    20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
-    25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
-    [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
-    36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
-    23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
-    35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
-    21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
-    37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
-    25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
-    21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
-    30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
-    39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
-    [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
-    24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
-    27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
-    32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
-    36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
-    [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
-    21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
-    23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
-    21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
-    36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
-    36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
-    31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
-    30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
-    26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
-    29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
-    25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
-    37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
-    30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
-    22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
-    24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
-    27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
-    30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
-    32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
-    37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
-    21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
-    [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
-    25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
-    20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
-    [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
-    25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
-    [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
-    [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
-    [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
-    [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
-    27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
-    37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
-    26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
-    35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
-    22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,